linux下用源代码编译php(转载)

转自 http://hi.baidu.com/travel981cn/blog/item/2514bf34069031b0d0a2d30e.html

这篇文章是 linux下用源代码编译apache+mysql+php应用环境 的一部分,文章的其它部分请参考:

linux下用源代码编译apache+mysql+php应用环境

linux下用源代码编译mysql(基本步骤)

linux下用源代码编译mysql(完整步骤)

linux下用源代码编译apache

php部分。php源代码的版本是:php-5.2.6.tar.gz

php的编译需要向apache提交模块和连接mysql,此外还有其它一些复杂的设置。

cd /local/localsoft/websrv/php/
tar xvf php-5.2.6.tar.gz
cd php-5.2.6/

同之前一样,我们首先查看一下configure 脚本的详细设置。

./configure –help

php每次升级,编译参数都会发生一些细微的变化,因此,尽管你以前编译php可能轻车熟路,但最好还是查看一下参数比较好。

最简单的编译php的方法如下(编译时间约需6分钟):

./configure --with-apxs2=/usr/local/apache2/bin/apxs \
            --with-mysql-sock=/tmp/mysql.sock \
            --with-mysql &&make &&make install 

没错,就是这么简单,php就被编译完成。接下来我们需要拷贝php的配置文件,默认php.ini的位置在php安装目录下的lib子目录中。

cp php.ini-dist /usr/local/lib/php.ini

关于扩展模块: 以上的编译方法仅包含主要的php模块,大部分的php自带的模块并没有被编译,如果以后需要使用这些模块,你可以手动编译他们,以curl模块为例:

cd ext/curl/
/usr/local/bin/phpize
./configure –with-php-config=/usr/local/bin/php-config
make install

编译好的curl.so默认安装到/usr/local/lib/php/extensions/no-debug-zts-20060613/目录下,你可以编译php.ini,加入:

extension="/usr/local/lib/php/extensions/no-debug-zts-20060613/curl.so"

就可以使用curl。不过由于 usr/local/lib/php/extensions/no-debug-zts-20060613这个目录不是php寻找模块的默认目录,因此,每手工添加一个模块,都要重复输入那一长串的路径,解决方法为,编辑php.ini,找到extension_dir = "./"一行,将其修改为:

extension_dir = "/usr/local/lib/php/extensions/no-debug-zts-20060613/"

这样,以后再自行编译模块,只需要修改php.ini加入:extension = curl.so,即可。

接下来删掉libphp5.so中的调试符号:

cd /usr/local/apache2/modules/ 
cp libphp5.so libphp5.old &&strip libphp5.so 

编辑php.ini:
cd /usr/local/lib &&vi php.ini

你需要对php进行简单的配置,有关配置的详细信息请参考php手册:

error_log = /usr/local/php/php_error.log
date.timezone = "Asia/Shanghai"
session.save_path = "/tmp" 

最后,我们需要编辑apache的配置文件,最终整合apache+mysql+php的运行环境。

vi /usr/local/apache2/conf/httpd.conf
在一长串的LoadModule行的最后,可以找到
LoadModule php5_module        modules/libphp5.so

这表明apache现在已经集成了对php的支持,不过目前,apache还不“认识”.php扩展名的文件,如果通过浏览器请求.php扩展名的文件,那么apache会返回该文件的源代码。解决方法为,在Load php Module这一行的下面,加入:

<IfModule !mod_php5.c> 
    LoadModule php5_module lib/modules/libphp5.so 
</IfModule> 

<IfModule mod_php5.c> 
    AddType application/x-httpd-php .php 
    AddType application/x-httpd-php .php5 
    AddType application/x-httpd-php-source .phps 
    AddType application/x-httpd-php-source .php5s 
    DirectoryIndex index.php 
    DirectoryIndex index.php5 
</IfModule>

这样,apache就可以解析php文件了。请注意这几行中后面的部分,小数点后面的是扩展名,如果你的php程序是以  .php  结尾的,那么一定要有 

    AddType application/x-httpd-php .php 

这一行,如果你的php程序是以其它的扩展名结尾的,如  .php5  ,那么一定要有 

    AddType application/x-httpd-php .php5 

这一行,其它你不需要的行,尽管可以放心删除,用到时再添加。至于phps行,指令明确表明是php源代码(php-source),如果你有php源文件需要放在网上共享,请将其存为  .phps  扩展名,或其它你在配置文件中指定的扩展名。

接下来,我们继续编辑httpd.conf文件,记得我们之前编译apache时采用的所有模块的共享编译的方法吗?这种方法的好处是,你可以立刻获得所有的apache自带的模块,不过弊端也很明显,那就是现在在配置文件中,所有的模块都默认载入了,有些模块是我们不需要的,而有些模块是必须配置才能起作用的,所以,现有我们需要先暂时关闭不用的模块,方法为,在相应的LoadModule模块前加#把该行注释掉。关于模块的加载请参考apache的手册有关章节,再根据你实际的情况进行配置。

注意: 有些 基本模块提供了必要的httpd.conf中的配置项 ,关闭他们会使apache运行错误。

使用下面的命令屏蔽不常用的模块,这个命令主要禁止一些扩展模块和实验模块的加载,这些模块并没有经过长时间的测试,因些可能会带来潜在的风险。并且,个别模块的需要配置才能工作,并且配置项并没有包含在httpd.conf文件中,如果你确实需要使用某些模块,请参考去掉相应的行,一个模块一行,有些模块需要配合其它的模块才能正常工作,关于这些模块的介绍,请参考apache手册。

sed -i "s/^LoadModule authn_anon_module/# &/" httpd.conf &&
sed -i "s/^LoadModule authn_dbd_module/# &/" httpd.conf &&
sed -i "s/^LoadModule authn_dbm_module/# &/" httpd.conf &&
sed -i "s/^LoadModule authz_dbm_module/# &/" httpd.conf &&
sed -i "s/^LoadModule authz_owner_module/# &/" httpd.conf &&
sed -i "s/^LoadModule cern_meta_module/# &/" httpd.conf &&
sed -i "s/^LoadModule dav_module/# &/" httpd.conf &&
sed -i "s/^LoadModule dav_fs_module/# &/" httpd.conf &&
sed -i "s/^LoadModule dbd_module/# &/" httpd.conf &&
sed -i "s/^LoadModule deflate_module/# &/" httpd.conf &&
sed -i "s/^LoadModule dumpio_module/# &/" httpd.conf &&
sed -i "s/^LoadModule expires_module/# &/" httpd.conf &&
sed -i "s/^LoadModule ext_filter_module/# &/" httpd.conf &&
sed -i "s/^LoadModule filter_module/# &/" httpd.conf &&
sed -i "s/^LoadModule headers_module/# &/" httpd.conf &&
sed -i "s/^LoadModule ident_module/# &/" httpd.conf &&
sed -i "s/^LoadModule info_module/# &/" httpd.conf &&
sed -i "s/^LoadModule log_forensic_module/# &/" httpd.conf &&
sed -i "s/^LoadModule rewrite_module/# &/" httpd.conf &&
sed -i "s/^LoadModule speling_module/# &/" httpd.conf &&
sed -i "s/^LoadModule status_module/# &/" httpd.conf &&
sed -i "s/^LoadModule unique_id_module/# &/" httpd.conf &&
sed -i "s/^LoadModule userdir_module/# &/" httpd.conf &&
sed -i "s/^LoadModule usertrack_module/# &/" httpd.conf &&
sed -i "s/^LoadModule version_module/# &/" httpd.conf

接下来设置apache运行时的用户和组,也就是我们在apache编译开始部分添加的用户和组。
注意: 所设定的用户和组必须存在,否则apache启动时会提示“bad user name XXXX ”

sed -i -e "s/User daemon/User apache/" -e "s/Group daemon/Group apache/" path_to_httpd.conf

path_to_httpd.conf指的是httpd.conf的路径,例如,你的apache编译到/usr/local/apache,那么httpd.conf可能在/usr/local/apache/conf目录下。

静态编译php: 与apache和mysql不同,由于php支持几十种库和组件的连接,应用环境因人而异,编译参数也是复杂多变,本文给出的方法能够应付绝大多数的使用要求,相应的,依赖的组件也为数众多,如果不能编译成功,请检查你的环境中是否缺少必要的include和lib。

如果你此前已经编译过php,那么现在请再次进入php的源代码目录,并删掉上次的编译结果:

cd /local/localsoft/websrv/php/php-5.2.6/
make clean

执行configure 脚本,查看编译配置参数,有些模块需要系统中有特定的组件支持,为保证编译过程的顺利,请先安装他们(提示:应该安装dev或devel之类的包)。
如果你不能马上记住所有的编译参数(事实上这也不可能),那么请用文本编辑器详细记录你需要用到的编译参数。编译参数如下(编辑时间约需7分钟):

./configure --sysconfdir=/usr/local/etc \ 
            --with-config-file-path=/usr/local/etc \ 
            --with-config-file-scan-dir=/usr/local/etc/php \ 
            --with-apxs2=/usr/local/sbin/apxs \ 
            --with-mysql=/usr/local \ 
            --with-mysql=shared \ 
            --with-mysql-sock=/tmp/mysql.sock \ 
            --with-pdo-mysql=/usr/local \ 
            --with-pdo-mysql=shared \ 
            --with-mysqli=/usr/local/bin/mysql_config \ 
            --with-mysqli=shared \ 
            --enable-mod-charset \ 
            --enable-bcmath \ 
            --with-bz2=shared \ 
            --enable-calendar \ 
            --with-curl=shared \ 
            --with-curlwrappers \ 
            --enable-exif \ 
            --enable-ftp \ 
            --with-gdbm \ 
            --with-gd=shared \ 
            --with-jpeg-dir \ 
            --with-png-dir \ 
            --with-zlib-dir \ 
            --with-zlib=shared \ 
            --with-xpm-dir \ 
            --with-ttf \ 
            --with-freetype-dir \ 
            --enable-gd-native-ttf \ 
            --with-gettext=shared \ 
            --with-gmp=shared \ 
            --with-iconv=shared \ 
            --with-iconv-dir \ 
            --with-imap=shared \ 
            --with-ldap=shared \ 
            --enable-mbstring \ 
            --enable-zend-multibyte \ 
            --with-mcrypt=shared \ 
            --with-mhash=shared \ 
            --with-ming=shared \ 
            --with-ncurses=shared \ 
            --with-pspell=shared \ 
            --enable-sqlite-utf8 \ 
            --with-sqlite=shared \ 
            --with-tidy=shared \ 
            --with-pdo-sqlite=shared \ 
            --with-readline=shared \ 
            --enable-shmop \ 
            --enable-soap \ 
            --enable-sockets \ 
            --enable-sysvmsg \ 
            --enable-sysvsem \ 
            --enable-sysvshm \ 
            --enable-wddx \ 
            --with-xmlrpc=shared \ 
            --with-xsl=shared \ 
            --enable-zip \ 
            --enable-discard-path \ 
            --enable-force-cgi-redirect \ 
            --enable-magic-quotes \ 
            --enable-sigchild \ 
            --enable-pcntl &&make &&make install

编译参数基本是按照phpinfo的顺序进行的。因此,如果你不需要哪些功能,可以对照着去除。本编译不包括的部分功能ODBC,openssl如果你确实需要这些功能,请执行configure --help 脚本查看有关配置信息。带with参数的模块,可以通过在后面加=shared从而编译成共享模块,就像上面的—with-gd=shared那样的,如果同时需要指定路径,可以使用:

./configure --with-gd=/usr/local/gd2 --with-gd=shared

类似的参数。安装完成后,你需要安装并设置你的php.ini文件。然后重启apache。在php的源代码目录执行以下命令:

install -v -m644 php.ini-recommended /usr/local/etc/php.ini

注意: 如果使用shared方式去编译某些php扩展,那么,在启动apache之前,你需要在php.ini中加入指定扩展的引用,否则该扩展不会生效。如果按上面的方法来编译php,那么就需要在php.ini中添加如下配置:

error_log = /usr/local/var/logs/php_error.log 
include_path = ".:/usr/local/lib/php" 
extension_dir = "/usr/local/php/lib/php/extensions/no-debug-zts-20060613" 
date.timezone = "Asia/Shanghai" 
session.save_path = "/tmp" 

在静态编译php的参数中,部分模块被编译成共享模块,并且没有在php.ini中载入,因此,如果你希望这些模块生效,你需要进行如下配置:

cd /usr/local/etc/ 
mkdir php &&cd php

现在我们的工作目录/usr/local/etc/php/   这个目录是通过—with-config-file-scan-dir参数指定的。

下面一系列的命令将把对某个扩展的引用写入到*.ini的配置文件中,每个扩展的配置分别写入单独的文件中,并使用 extension=gd.so类似的格式,这样,如果你需要临时调试某些php扩展,就可以方便的对该扩展的配置进行修改。

如果不需要使用该扩展,可以直接把该扩展对应的配置文件移走或删除。
当然,你也可以把这些配置统统写入到一个文件里。

cd /usr/local/etc/ &&mkdir php &&cd php 

echo extension=bz2.so >> bz2.ini && 
echo extension=curl.so >> curl.ini && 
echo extension=gd.so >> gd.ini && 
echo extension=gettext.so >>gettext.ini && 
echo extension=gmp.so >>gmp.ini && 
echo extension=iconv.so >> iconv.ini && 
extension=imap.so >>imap.ini && 
echo extension=ldap.so >>ldap.ini && 
echo extension=mcrypt.so >> mcrypt.ini && 
echo extension=mhash.so >>mhash.ini && 
echo extension=ming.so >>ming.ini && 
echo extension=mysql.so >>mysql.ini && 
echo extension=mysqli.so >> mysqli.ini && 
echo extension=ncurses.so >>ncurses.ini && 
echo extension=pdo_mysql.so >> pdo_mysql.ini && 
echo extension=pdo_sqlite.so >> pdo_sqlite.ini && 
echo extension=pspell.so >> pspell.ini && 
echo extension=readline.so >> readline.ini && 
echo extension=sqlite.so >> sqlite.ini && 
echo extension=tidy.so >> tidy.ini && 
echo extension=xmlrpc.so >> xmlrpc.ini && 
echo extension=xsl.so >> xsl.ini && 
echo extension=zlib.so >>zlib.ini 

注意:如果当前你的apache服务是运行的,那么修改配置文件后,需要重启apache服务才能生效。

现在,你的apache+mysql+php的环境安装完成了,如果想继续配置你的amp,一是需要经验,二是需要耐心,这些不在本文的讨论范围之内。祝大家工作、学习顺利!

你可能感兴趣的:(apache,PHP,linux,Module,扩展,extension)