前言
一般而言,除非对编译安装十分熟练或是有特殊要求,直接从系统支持的源中安装是linux下最有效率的方法,不幸的是,ubuntu官方源在12 LTS后就不再维护php5.4,而12之前的系统则已经没有可用的官方apt源,就连网上大多推崇的某私人源现在也只支持到php5.6;更不幸的是,php不少常用函数在5.6时经历了较大的改变——因此,编译安装几乎是面对使用php5.4编写的系统时的唯一选择了
在过去的两周里我面对的正是这种窘境,故留此笔记,希望能帮到其他不擅长编译安装的朋友们
编译前需要了解的一些tips
-
编译步骤:
-
下载源码
源码可以在php官网等地方下载到,这里给出一个地址,注意如果去官网下载的话要注意版本,根据你使用的是什么服务程序(apache等)以及apache的版本等会有v9、v6、no thread等等不同,请认真阅读说明 -
下载必要的依赖包
为了编译你需要一些必要的依赖,虽然有些依赖包可以在后续的过程中根据提示安装,但是有些依赖包几乎是编译必须的,比如gcc等(一般系统都会有,但是如果你使用的是docker镜像或是精简版则很可能没有),这里给出一个参考apt-get install gcc libxml2-devel make automake autoconf libtool bison flex
若是出现错误可以apt-get update
并选择一个个安装,其中部分包可能名字不同,例如libxml2-devel
如果没有的话可以试试libxml2-dev
-
设定编译参数
详细的参数会在下文讲,这里你只需要知道编译参数通过./configure
后面带的参数来指定,每个参数用--开头并用空格分隔,例如--with-mcrypt
。想要知道php的configure脚本有哪些参数可以通过./configure --help
来查看。详细的可以参考这篇中文资料和对其中三个重要参数的详细解析 -
编译
编译命令主要包括make
、make install
两个步骤,其中make完之后可以执行make test
测试,如果想重新编译可以make clean
-
编译后必要的一些设置
主要是移动设置文件和对环境变量、php-fpm的一些设置
-
-
如果是打算LAMP环境强烈建议先安装apache再安装php!
先安装apache可能会导致部分依赖包无法加载的问题,如果是初心者建议先通过apt源安装apache再编译安装php,mysql倒是影响不大
编译....开始!
- 进入下载源码包的目录解压
tar -zxvf php-5.4.45.tar.gz
- 进入解压出来的目录,执行
./configure --prefix=/usr/share/php5.4 --with-apxs2=/usr/bin/apxs --with-config-file-path=/etc/php/5.4 --with-curl --with-pear --with-gd --with-jpeg-dir --with-png-dir --with-zlib --with-xpm-dir --with-freetype-dir --with-mcrypt --with-mhash --with-mysql --with-mysqli --enable-pdo --with-pdo-mysql --with-openssl --with-xmlrpc --with-xsl --with-gettext --enable-exif --enable-wddx --enable-zip --enable-bcmath --with-bz2 --enable-calendar --enable-ftp --enable-mbstring --enable-soap --enable-sockets --enable-shmop --enable-dba --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-debug --enable-maintainer-zts ZEND_EXTRA_LIBS='-liconv'
其中--prefix
参数指定的是php的安装目录,后面不少设置中如果要用到php的安装目录都是这个路径。--with-apxs2
则是为了编译出libphp5.so模块,后面配置apache支持php的时候可能会用到,路径为系统中apache安装的apxs的路径(不知道的话可以用find查找一下),如果没有该路径则安装apt-get install apache2-devel
(apache的开发版本)即可(注意,如果系统里面没有apxs,可能是因为系统版本是ubuntu12及之前的版本,在这些版本里改成--with-apxs2=/usr/bin/apxs2
这样,路径同样自己搜索,只是改成搜索apxs2)。其他的可以酌情增减
- 执行
make
及make install
,出现类似
[PEAR] Archive_Tar - installed: 1.3.12
[PEAR] Console_Getopt - installed: 1.3.1
[PEAR] Structures_Graph- installed: 1.0.4
[PEAR] XML_Util - installed: 1.2.3
[PEAR] PEAR - installed: 1.9.5
Wrote PEAR system config file at: /usr/local/php/etc/pear.conf
You may want to add: /usr/local/php/lib/php to your php.ini include_path
/usr/local/php/build/shtool install -c ext/phar/phar.phar /usr/local/php/bin
ln -s -f /usr/local/php/bin/phar.phar /usr/local/php/bin/phar
Installing PDO headers: /usr/local/php/include/php/ext/pdo/
即为安装成功(上面引用的是别人的信息,自己的忘记截图了,路径可能不同)
- 移动配置文件
cp php.ini-production /usr/share/php5.4/etc/php.ini
,后面的地址的前半部分是之前prefix指定的路径 - 做到这里,通用的步骤就做完了,依据各人情况不同可能有不同的报错(,大部分可以通过百度解决,本文下一部分将介绍一些比较常见/奇怪的报错以及如果你选择使用php-fpm的话需要额外做哪些步骤
几乎一定会出现但不一定在下面被提到的报错:(
-
关于php-fpm与apxs
详细的解释可以参考这里,简单来说就是apache管理php的两种模式,只能选其一,否则会报
You've configured multiple SAPIs to be build.You can build only one SAPI module and CLI binary at the same time.
的错误。由于我不清楚fastcgi如何配置,这里选择模块模式,即在编译参数中增加--with-apxs2
选项,同时去掉php-fpm的选项。如果你选择使用php-fpm来管理php,请使用以下编译参数
./configure --prefix=/usr/share/php5.4 --with-config-file-path=/etc/php/5.4 --with-curl --with-pear --with-gd --with-jpeg-dir --with-png-dir --with-zlib --with-xpm-dir --with-freetype-dir --with-mcrypt --with-mhash --with-mysql --with-mysqli --enable-pdo --with-pdo-mysql --with-openssl --with-xmlrpc --with-xsl --with-gettext --with-fpm-user=www-data --with-fpm-group=www-data --enable-fpm --enable-exif --enable-wddx --enable-zip --enable-bcmath --with-bz2 --enable-calendar --enable-ftp --enable-mbstring --enable-soap --enable-sockets --enable-shmop --enable-dba --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-debug --enable-maintainer-zts --enable-embed ZEND_EXTRA_LIBS='-liconv'
注意到enable-embed
的选项也要改,这是网上大部分资料没有提到的
-
如果你选择php-fpm
在make install之后,还要执行以下步骤以配置并启动php-fpm
cp /usr/share/php5.4/etc/php-fpm.conf.default /usr/share/php5.4/etc/php-fpm.conf
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod +x /etc/init.d/php-fpm
找不到php-fpm也可以find一下。之后可以/usr/share/php5.4/sbin/php-fpm -t
测试是否配置正确,并进入init.d目录启动php-fpm
-
错误:Cannot find OpenSSL's <evp.h>
安装下列包:
apt-get install libxml2-dev libcurl4-openssl-dev libjpeg-dev libpng-dev libxpm-dev libmysqlclient-dev libpq-dev libicu-dev libfreetype6-dev libldap2-dev libxslt-dev
-
错误:Please reinstall the BZip2 distribution
安装这个sudo apt-get install libbz2-dev
,网上很多资料说的包名都是centos下的,ubuntu的要装这个才找得到
-
错误: mcrypt.h not found. Please reinstall libmcrypt
可以直接安装,如果安装后还是不行参考这个
-
错误:Cannot find OpenSSL's libraries
先安装sudo apt-get install libcurl4-openssl-dev
,如果还是不行就做个软链接ln -s /usr/lib/x86_64-linux-gnu/libssl.so /usr/lib
-
错误:configure: error: libXpm.(a|so) not found.
先安装apt-get install libxpm-dev
,若还是不行
制作软链接帮编译程序找到相关文件
cd /usr/lib/
64位的OS
ln -s /usr/lib/x86_64-linux-gnu/libXpm.a
ln -s /usr/lib/x86_64-linux-gnu/libXpm.so
ln -s /usr/lib/x86_64-linux-gnu/libXpm.so.4
ln -s /usr/lib/x86_64-linux-gnu/libXpm.so.4.11.0
32位的OS
ln -s /usr/lib/i386-linux-gnu/libXpm.a
ln -s /usr/lib/i386-linux-gnu/libXpm.so
ln -s /usr/lib/i386-linux-gnu/libXpm.so.4
ln -s /usr/lib/i386-linux-gnu/libXpm.so.4.11.0
路径可以自己find
-
啥都装了但是输入php -v提示command not found
系统变量没设置好。系统变量可以echo $PATH
查看,若没有php相关则export PATH=$PATH:/usr/local/php/bin
即可
-
apache无法解析php
ubuntu下找到apache2.conf(修改前最好先备份!),添加以下内容
LoadModule php5_module /usr/lib/apache2/modules/libphp5.so
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
LoadModule那一行最后的那个路径是libphp5.so的路径,可以find一下,一般在apache2目录下面。如果你找到只有php目录下面有的话,那说明你很可能没编译成功这个模块
-
修改apache2.conf后重启失败并报错:Can't locate API module structure `php5_module' in file /usr/local/php5/libphp5.so
说明你没编译成功这个模块,建议重新编译php并加上--with-apxs2
的参数
一些可能有用的参考文章
https://segmentfault.com/a/1190000013757064
https://www.cnblogs.com/lwysoft/archive/2012/11/25/2787759.html
https://blog.csdn.net/weng_xianhu/article/details/79423259
http://www.it610.com/article/3259455.htm
http://blog.51cto.com/winterx/1111816
https://www.jb51.net/article/37487.htm
https://blacksaildivision.com/php-install-from-source
结语
我也不清楚为什么我的文章有这么多是关于环境配置的,但是说真的这两周的经历让我对编译安装有了深深的阴影(笑,希望下次不用花这么多时间配置吧w