ubuntu16.04下编译安装php5.4的方法及部分可能出现的错误

前言


一般而言,除非对编译安装十分熟练或是有特殊要求,直接从系统支持的源中安装是linux下最有效率的方法,不幸的是,ubuntu官方源在12 LTS后就不再维护php5.4,而12之前的系统则已经没有可用的官方apt源,就连网上大多推崇的某私人源现在也只支持到php5.6;更不幸的是,php不少常用函数在5.6时经历了较大的改变——因此,编译安装几乎是面对使用php5.4编写的系统时的唯一选择了
在过去的两周里我面对的正是这种窘境,故留此笔记,希望能帮到其他不擅长编译安装的朋友们

编译前需要了解的一些tips


  1. 编译步骤:
    • 下载源码
      源码可以在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来查看。详细的可以参考这篇中文资料对其中三个重要参数的详细解析
    • 编译
      编译命令主要包括makemake install两个步骤,其中make完之后可以执行make test测试,如果想重新编译可以make clean
    • 编译后必要的一些设置
      主要是移动设置文件和对环境变量、php-fpm的一些设置
  2. 如果是打算LAMP环境强烈建议先安装apache再安装php!
    先安装apache可能会导致部分依赖包无法加载的问题,如果是初心者建议先通过apt源安装apache再编译安装php,mysql倒是影响不大

编译....开始!


  1. 进入下载源码包的目录解压tar -zxvf php-5.4.45.tar.gz
  2. 进入解压出来的目录,执行

./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)。其他的可以酌情增减

  1. 执行makemake 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/

即为安装成功(上面引用的是别人的信息,自己的忘记截图了,路径可能不同)

  1. 移动配置文件cp php.ini-production /usr/share/php5.4/etc/php.ini,后面的地址的前半部分是之前prefix指定的路径
  2. 做到这里,通用的步骤就做完了,依据各人情况不同可能有不同的报错(,大部分可以通过百度解决,本文下一部分将介绍一些比较常见/奇怪的报错以及如果你选择使用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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,230评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,261评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,089评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,542评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,542评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,544评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,922评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,578评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,816评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,576评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,658评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,359评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,920评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,859评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,381评论 2 342

推荐阅读更多精彩内容