查看文章 |
linux下用源代码编译php
2008年12月30日 星期二 10:15
这篇文章是 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,一是需要经验,二是需要耐心,这些不在本文的讨论范围之内。祝大家工作、学习顺利! |
最近读者:

