linux下用源代码编译php(转载)
转自 http://hi.baidu.com/travel981cn/blog/item/2514bf34069031b0d0a2d30e.html这篇文章是 linux下用源代码编译apache+mysql+php应用环境 的一部分,文章的其它部分请参考:linux下用源代码编译apache+mysql+php应用环境linux下用源代码编译mysql(基本步骤)
·
转自 http://hi.baidu.com/travel981cn/blog/item/2514bf34069031b0d0a2d30e.html
这篇文章是 linux下用源代码编译apache+mysql+php应用环境 的一部分,文章的其它部分请参考:
linux下用源代码编译apache+mysql+php应用环境
php部分。php源代码的版本是:php-5.2.6.tar.gzphp的编译需要向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,一是需要经验,二是需要耐心,这些不在本文的讨论范围之内。祝大家工作、学习顺利!
更多推荐
已为社区贡献2条内容
所有评论(0)