#wget http://museum.php.net/php5/php-5.2.6.tar.gz (下载php源码)
http://cn.php.net/releases/ 可以找到
#tar zxvf php-5.2.6.tar.gz
#cd php-5.2.6
#./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-apxs2=/usr/local/apache/bin/apxs
#make
#make install
说明:with-mysql就是你的mysql安装路径
===================================================
总是有人反复问我这样一个菜鸟php在CentOS等Linux系统下的安装问题,甚至同是一个人,几个月内安装PHP数次竟问我几十个相关问题,但是我保证:他每一次问的问题都不重样。这让我不禁停下来思考“无数次”的原因是什么? 我初步总结两点:
引用
1.未对linux原理进行系统学习
2.Linux太灵活
由于安装php的人目的不同,我们不能要求每个人都如此这般精通Linux再去安装php,特别是有些php程序员仅仅是想搭建一个完整的Php环境,然后就要迅速转入编程工作,自然对linux环境不甚熟悉。所以本文的目的就是想从菜鸟理解问题的角度(特别是面向windows下的Php程序员)阐述linux下安装php环境遇到的种种问题的缘故和解决思路.(本文的安装也是基于一个Linux发行版: CentOS5.2)
开始之前,普及一些必要的Linux安装软件的知识,一般来说:
1.不管任何linux系统,只要代码开源, 都可以通过tar源码包方式安装软件,即源码编译运行。
2.如果你基于某个Linux发行版工作,那么现代版的Linux套件都提供便捷的工具来安装软件。如CentOS使用yum,Ubuntu使用apg-get.
回到php安装上来: php通常都是用来做web应用,所以安装php也意味着安装apache和mysql。
既然我们使用CentOS套件,不妨先体验一把CentOS的yum工具如何便捷地安装软件.
假设此时CentOS主机已经装好,能够SSH登录上去,那么开始安装Apache,PHP, Mysql(认为以下有些只是点初学者能容易通过其他渠道掌握的省略),安装不必顺序进行:
1). 安装Apache
sudo yum install httpd mod_ssl
2). 安装php
sudo yum install php php-common php-gd php-mcrypt php-pear php-pecl-memcache php-mhash php-mysql php-xml
3). 安装mysql
sudo yum install mysql-server
4). 启动mysql,
sudo service mysqld start
5). 启动apache
sudo service httpd start
在浏览器中访问http://youhost/,看看apache欢迎页是不是出来了.接下来写一个php脚本,链接数据操作,放到apache主目录下,看看能否访问.
一般来说,很多人都是可以做到的,即便遇到一点问题也都可以通过google找到资料解决,让人对Linux学习充满信心.
那么,真正的问题在于: 你无法安于yum工具默认为你做的设置,yum傻瓜式帮你把软件装好,一旦你需要任何对软件、特别是对服务器软件的定制时,你发现你都必须面对Yum下面的复杂性!
案例1: 我发现默认装好的php是5.1.6,但是我想升级到5.2.10,但是yum服务器没有提供package怎么办?
看看前面提到的源码tar包方式,现在是面对的时刻了,去网站下载php源代码,在本地编译.
tar包安装软件基本分三步走:
- 1. configure
- 2. make
- 3. make install
注:这里的前提是apache, mysql已经安装在你的机器上了.那么升级之前是否要卸载当前的php5.1.6呢? 当然要删(不要手工删除,yum安装的就用yum删除),执行yum remove php即可.
现在解压缩php源码到 php-5.2.10目录,进入该目录执行
- ./configure --prefix=/my/php
- make
- make install
这是一个最简化的安装步骤,如果不出意外,你的php所有相关的文件都被安装在/my/php目录下. 源码安装方式的有点在于,你能控制一个软件安装后所有的文件在一个相关目录下,缺点是你必须手工地配置它和apache与mysql的关联.
/my/php/bin/php 就是Php程序,在httpd.conf中配置其以CGI方式运行(google容易搜到不赘述).重新启动apache, 运行一个Php脚本,现在应该已经可以执行了.
运行一个数据库连接的php脚本,通过IE运行,结果如何? 很遗憾,他可能告诉你mysql_connect找不到. 想想这个结果蛮合理的,apache和php通过前面的设置绑定好了,但是好像从来没设置过php和mysql的绑定啊?
其实,这里我们可以引申出一个基本概念: php如何使用第三方软件!
本例是: php(mysql_connect()函数)使用mysql(第三方软件).
观察上图,php能使用大量的第三方非php库(典型性是C语言写库), 为了达到此目的,你必须具备两个条件:
- 条件I. 安装第三方库(软件)
- 条件II. 安装了该软件的php扩展
前面的情况是: mysql装了,满足条件I,但是条件II不满足, 为了满足条件二, 我们需要了解php安装扩展的知识.
安装php, 大的方面还可以分为两种方式:
引用
方式1. 将扩展编译到php
方式2. 将扩展单独编译成动态连接库so文件
方式1的优点是运行速度快,但是为了一个扩展需要重新安装整个php;方式2灵活,但是运行速度稍慢. windows平台下的php程序员大多只熟悉方式2,因为方式2是windows下安装Php扩展的唯一方式.
这里,我想教大家熟悉一方式1. 因为之前不是安装php了吗? 如果没有删除php-5.2.10目录,重新进入该目录, 那么此时重新编译运行将采用增量方式,实际上比方式2还更方便些.仍然3步走:
- ./configure --prefix=/my/php --with-mysql
- make
- make install
和第一次安装php有什么差别? 是不是仅仅多了一个--with-mysql? 没错,php源码包包括了大量的Php扩展,也包括mysql的php扩展,只要加一个--with-mysql指示符, 编译的Php就支持mysql访问了
不幸的是, 很多人加了--with-mysql参数后出项提示找不到头文件(*.h)文件,这是为什么呢?..h文件属于c语言知识范畴了, 不过,一个基本知识是: X软件的php扩展的源代码在编译时必然可能依赖X软件的某些东西,好比mysql的php扩展源代码编译时不仅仅要求你安装mysql sever, 而一定要它的开发包相关文件(.h文件). 因此一般的思路就是: 下载mysql开发包并安装. 不过不要担心, 不到非必要,我们都尽可能使用yum工具来安装所有能安装的东西.通常有个命名管理,就是x软件的开发包,往往相应的yum包名都是x-devel. 不例外地,安装mysql开发包的命令则是: yum install mysql-devel.一路yes安装完毕. 重新运行--with-mysql的configure, 现在应该顺利重装了php, 而且数据库连接也应该正常工作了.
有人质疑: 我安装mysql sdk,./configure命令一个--with-mysql就知道我安装的目录,还是有点神奇,难道他全硬盘搜索.h文件? 不是, 如果你用yum方式安装sdk,那么LD_LIBRARY_PATH系统变量就指示了该sdk相关信息 ,如果你使用源码(tar)安装mysql sdk,你的--with-mysql参数不得不像这样: --with-mysql=/your_mysql_sdk_dir/
案例2: (基于案例I)我发现5.2.10默认已经支持了很多扩展如果dom, iconv等,根据客户要求,现需要安装如下的扩展:
curl, gettext, bz2, mysql, calendar,pspell, shmop, ftp, openssl, zlib, exif,gmp,sysvmsg,sockets,wddx, gd, mysqli, pdo_mysql, mcrypt, mime_magic, xsl
正像案例1描述安装mysql扩展的过程一样, 这些扩展全都可参照依法炮制.configure配置命令如下:
- ./configure --prefix=/usr/local/php --with-curl --with-gettext --with-bz2 --with-mysql -enable-shmop --enable-calendar --with-openssl --with-pspell --enable-ftp --with-openssl --with-zlib --enable-exif --with-gmp --enable-sysvmsg --enable-sockets --enable-wddx --with-xsl --with-mcrypt --with-mysqli --with-mime_magic --with-pdo-mysql --with-gd --with-apxs2=/usr/local/apache/bin/apxs --without-sqlite --enable-so
我怎么知道这些参数的含义? 打开./configure脚本,参照官方php文档学习这些参数的含义是正宗的方法.
特别注意--with-apxs2=/usr/local/apache/bin/apxs的用法,此参数假设了apache已经预先安装带有apxs,这样apache的php模块文件会自动添加到httpd.conf文件中,如果是通过yum方式安装的apxs(如:yum -y install httpd-devel),则--with-apxs2参数不要加=后面的路径。也请参考另篇文章 http://koda.iteye.com/blog/233412
安装过程中一定存在可能X软件还没安装,导致X软件的php扩展不可以通过configure检查.下面列出部分软件依赖性:
- # 安装apache, mysql-server
- yum -y install httpd mod_ssl
- yum -y install mysql-server
-
- #和PHP相关的依赖
- yum -y install mysql-devel
- yum -y install perl httpd-devel apr-devel
- yum -y install bzip2-devel
- yum -y install curl-devel
- yum -y install gmp-devel
- yum -y install pspell-devel
- yum -y install libmcrypt-devel
- yum -y install libxslt-devel
- yum -y install libjpeg-devel
- yum -y install libpng-devel
- yum -y install libxml2-devel
- yum -y install freetype-devel
-
- # 一些包,和部分工具软件
- yum -y install openssl-devel
- yum -y install libgssapi-devel
- yum -y install krb5-devel
- yum -y install make
- yum -y install libtool-ltdl-devel
- yum -y install sendmail mailx
- yum -y install subversion-devel
假设yum包不包含该软件怎么办? 采用终极方法:tar包安装,参照另文描述.
安装之后,php.ini默认不存在。如果需要设置php.ini选项,通过phpinfo()函数查看php.ini默认存放路径,将php源码路径下的php.ini-recommended复制到其目录下更名为php.ini
./configure时发现如下三个32/64bit不兼容错误
将/usr/lib下三个ln重新link到/usr/lib64目录下的实际的so文件就OK,原因不明。
案例3: (基于案例I)我看yum默认安装的php都是以apache模块方式安装的,我能否也这样做?
可以,apache的php模块so文件是php源代码包编译出来的./configure加一个参数:
--with-apxs2=/usr/sbin/apxs
这是什么? --with-apxs2所指向的 /usr/sbin/apxs是apache安装的一个Perl脚本,它知道所有apache软件的信息, 这样编译出来的apache的Php模块文件(名字可能是libphp5.so)将被复制到合适的目录,并且修改httpd.conf装载该文件.
如果你的apache是源码方式安装的,那意味着apache软件所有相关文件都在某个目录下,如果/usr/apache,那么你也可以不用--with-apxs2而直接使用--with-apache=/usr/apache.
F.A.Q
Q1: make install出现警告
Warning: Cannot use a scalar value as an array in phar://install-pear-nozlib.phar/PEAR/ChannelFile.php on line 1400
不影响系统运行。但是为什么呢?
Q2: 我的主机上有多个ini文件,怎样知道那个php.ini才是我当前有效的ini文件?
A: 运行phpinfo()的php脚本,它会告诉你
Q3: 我想做一些php的设置,但是我不想改php.ini,怎么办?
A: php做./configure时,加参数 --with-config-file-scan-dir=/etc/php.d ,那么安装好的php运行时会自动检查/etc/php.d/下所有.ini文件。你可以把你的配置信息写到这里。
Q4: 启动apachce出现错误:libphp5.so: cannot restore segment prot after relock: Permission Denied
A: 临时禁用SELinux.执行命令setenforce 0. 永久生效可以执行setup命令,更改防火墙设置。
Q5: 启动apache出现错误:
Starting httpd: httpd: Syntax error on line 206 of /etc/httpd/conf/httpd.conf: Cannot load /usr/lib/httpd/modules/libphp5.so into server: /usr/lib/httpd/modules/libphp5.so: undefined symbol: sqlite3SrcListShiftJoinType
A: php做./configure是时使用参数--without-sqlite。当然这是回避问题,我还没具体研究这个问题的确切原因:)
Q5:按照你的./configure在32位机器上运行好好的,到了64位机器就不工作了,提示mysql什么的找不到
A: ./configure增加参数 -–libdir=/usr/lib64 –-with-libdir=lib64
下面是我在64bit主机上安装php的配置参数
- ./configure --prefix=/usr/php --with-apxs2=/usr/sbin/apxs --with-config-file-path=/etc/ --with-config-file-scan-dir=/etc/php.d --without-sqlite --enable-mbstring --with-curl --with-gettext --with-bz2 --with-mysql -enable-shmop --enable-calendar --with-openssl --with-pspell --enable-ftp --with-openssl --with-zlib --enable-exif --with-gmp --enable-sysvmsg --enable-sockets --enable-wddx --with-xsl --with-mcrypt --with-mysqli --with-mime_magic --with-pdo-mysql --libdir=/usr/lib64 --with-libdir=lib64 --with-gd --with-jpeg-dir=/usr/lib64 --with-png-dir=/usr/lib64 --with-freetype-dir=/usr/lib64