Linux中自行编译PHP过程中的坑

在上传之前的代码之后,发现需要将服务器中的PHP升级到7.2以上版本,好久没有搞Linux服务器,这次确实被坑了挺多次的。

首先是使用了LNMP整合包,安装失败,没注意到为什么,准备自己编译一份PHP出来。

使用下方命令进行下载相应的版本PHP

wget https://www.php.net/distributions/xxxxx.gz

接着需要tar命令解压,当然如果在安装过程中缺少依赖,需要进行依赖的安装。

tar -zxvf xxxxx.gz

使用cd命令进去,并且进行编译配置,生成makefile文件。

./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php --enable-mbstring --enable-ftp --with-gd --with-jpeg-dir=/usr --with-png-dir=/usr --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --without-pear --disable-phar --enable-sockets --with-freetype-dir=/usr --with-zlib --with-libxml-dir=/usr --with-xmlrpc --enable-zip --enable-fpm --enable-xml --enable-sockets --with-gd --with-zlib --with-iconv --enable-zip --with-freetype-dir=/usr/lib/ --enable-soap --enable-pcntl --enable-cli --with-curl

然后问题来了,提示缺少undefined reference to libiconv_open 无法编译 PHP libiconv,这个问题,在安装了libiconv之后,依旧还是会出现这个错误,需要指定iconv位置, 指定 iconv的位置 --with-iconv=/usr/local/libiconv

当然可以直接不安装该模块,直接进行忽略安装,需要在Makefile中进行编辑,在下方的配置中增加该模块名称

EXTRA_LIBS = ……(各种各样) -lcrypt (加上)-liconv

又或者:

make ZEND_EXTRA_LIBS='-liconv'
make install

接下来完成php的安装后,需要进行php.ini的配置和php-fpm,如下代码:

cp php.ini-production /usr/local/php/php.ini
cp ./sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod +x /etc/init.d/php-fpm

cd /usr/local/php/etc
cp php-fpm.conf.default php-fpm.conf
vim php-fpm.conf

在php-fpm.conf中配置pid的位置,如果上述位置都没有改变的话,应该直接去掉";"即可。 接下来可以启动php-fpm了,使用

service php-fpm start 或者是 /etc/init.d/php-fpm start

设置开机启动 vi /etc/rc.local

/etc/init.d/php-fpm start添加进去。增加权限chmod +x /etc/rc.d/rc.local

当然这并不算完,此时此刻是不能使用composer的,配置问题,在编译的时候忘记了增加扩展,所以此时应当手动安装扩展。

像是openSSL、mbstring、fileinfo、phar这样的扩展都是PHP中自带的,其他的扩展可以使用PECL轻松安装,和Windows版本的不同,直接修改php.ini就可以使用,这里如果在安装时没有编译,就需要在源码中再编译。

基本流程:(需要确认phpize可用)

  1. 找到源文件中扩展的位置ext文件,并且进入到需要安装的扩展中
  2. 执行下方的命令
phpize
 ./configure --with-php-config=/usr/local/php/bin/php-config
 make && make install

(需要注意的是,如果找不到.m4文件,可能是默认文件名称的问题:cp ./config0.m4 ./config.m4

3.可以在/usr/local/php/lib/extensions/……里面看到生成的so文件了

链接