美文网首页
ubuntu16.04下编译安装php5.4的方法及部分可能出现

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

作者: EVANIMARIA | 来源:发表于2018-10-16 22:19 被阅读0次

    前言


    一般而言,除非对编译安装十分熟练或是有特殊要求,直接从系统支持的源中安装是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

    相关文章

      网友评论

          本文标题:ubuntu16.04下编译安装php5.4的方法及部分可能出现

          本文链接:https://www.haomeiwen.com/subject/gshkzftx.html