分类
PHP

博客PHP版本升级到7.4.3

前两天升级PHP7.4.3遇到Error 139的问题,本来以为是PHP版本的问题,今晚网友“笛声”在博客留言,说他升级成功了,所以,又想折腾一下。

首先,卸载原来使用remi源安装的libzip:

yum remove libzip5-devel-1.5.2-1.el7.remi.x86_64

然后进入php7.4.2代码文件夹,configure一下,报错No package 'libzip' found,说明卸载成功。

接下来,开始使用源码安装libzip-1.2.0,这里参考给我留言的网友“笛声”的博文 https://hqidi.com/154.html

引用一下重点:

yum remove libzip libzip-devel (如果configure libzip1.2.0报zlib版本过旧,还要再把这两个装上)

wget https://hqidi.com/big/libzip-1.2.0.tar.gz

(如果下载失效可以使用wget https://nih.at/libzip/libzip-1.2.0.tar.gz

tar -zxvf libzip-1.2.0.tar.gz

cd libzip-1.2.0

./configure

make && make install

在网上找到的教程到了这一步就直接让你继续在PHP源码目录里面执行configure程序继续配置了,其实你虽然已经安装了libzip1.2,但是PHP的configure程序依然找不到,不知道你安装在哪,你得告诉PHP的configure程序,我安装了libzip 1.2,并且安装在何处。以前是用ldconfig来通告系统所需动态库文件的位置,现在用pkg-config

我刚刚提供的方法安装的libzip默认被安装到了 /usr/local/lib 在这个目录下你能看到libzip.so libzip.so.5 libzip.so.5.0.0 还有一个pkgconfig目录。

所以,真正的解决方法来了,在你configure的会话窗口直接输入如下内容:

export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig/"

上面命令的作用就是告诉configure程序,去/usr/local/lib 目录下找库文件,这样他就能找到libzip.so

此时,你继续执行php的configure将会很顺利的看到

Thank you for using PHP.

引用自 https://hqidi.com/154.html,略有修改。

通过卸载remi源的libzip,使用源码编译重装libzip-1.2.0后,再编译PHP7.4.3就完美通过了。

再次感谢热心网友提供的帮助。

分类
PHP

博客PHP版本升级到7.4.2

今天看了下PHP版本,最新版本已经到了PHP7.4.3了,由于博客使用的PHP版本还是7.4.1,于是想就升级一下。

下载了7.4.3的代码,编辑后发现报错:

Generating phar.php
/bin/sh: line 1: 18054 Segmentation fault      ` if test -x "/root/php-7.4.3/sapi/cli/php"; then /root/php-7.4.3/build/shtool echo -n -- "/root/php-7.4.3/sapi/cli/php -n"; if test "x" != "x"; then /root/php-7.4.3/build/shtool echo -n -- " -d extension_dir=/root/php-7.4.3/modules"; for i in bz2 zlib phar; do if test -f "/root/php-7.4.3/modules/$i.la"; then . /root/php-7.4.3/modules/$i.la; /root/php-7.4.3/build/shtool echo -n -- " -d extension=$dlname"; fi; done; fi; else /root/php-7.4.3/build/shtool echo -n -- "/root/php-7.4.3/sapi/cli/php"; fi;` -n -d 'open_basedir=' -d 'output_buffering=0' -d 'memory_limit=-1' -d phar.readonly=0 /root/php-7.4.3/ext/phar/build_precommand.php > ext/phar/phar.php
make: *** [ext/phar/phar.php] Error 139

尝试修改 configure 选项,发现只要去掉–with-zip就可以了,但是去这个,zip 扩展就不能用了。看这个错误,应该是生成 phar 是报的错,于是禁用 phar,增加一个 configure 选项:--disable-phar,再编译就可以通过了。完整 configure 参数如下:

./configure \
--prefix=/usr/local/php/php74 \
--enable-gd \
--with-curl \
--enable-fpm \
--enable-cgi \
--with-openssl \
--enable-mbstring \
--with-pdo-mysql \
--with-zlib \
--with-zip \
--with-mysqli \
--enable-opcache \
--enable-mysqlnd \
--with-libxml \
--with-jpeg \
--with-freetype \
--with-pdo-sqlite \
--with-sqlite3 \
--enable-cli \
--enable-shared \
--enable-exif \
--disable-phar 

但是这样有个问题,禁用phar,可能composer等使用phar的相关的服务就不能用了,所以,我没安装这个版本。于是又下载了7.4.2的版本,这个版本一次性编译通过,升级成功。

至于那个Error 139的问题,猜测可能是代码BUG,那么只好跳过7.4.3这个版本,等下一个版本再看。


2020年3月3日 23:29更新:

经网友“笛声”留言提醒,PHP7.4.3版本没有问题,是我环境的问题。升级PHP7.4.3的过程,参考这里

分类
PHP

CentOS7.3编译安装PHP7.4.1

PHP最近发布了最新版本7.4.1,这几天早就想把博客升级到最新版本了,但一直没时间弄。今晚正好没事,就想升级一下,于是开启了一晚上的折腾之路,一直折腾到凌晨3点多才弄好,下面把过程记录一下。


一、编译前准备

PHP7.4.1的libzip依赖要求0.11版本以上,由于CentOS7.3自带的是libzip-0.10.1,不满足要求, 所以要先升级libzip。本来在编译PHP7.3的时候,已经源码编译安装过libzip-1.2.0,在PHP7.3的时候可以正常编译通过,但是到了PHP7.4就会报错找不到libzip这个包No package 'libzip' found,怎么编译都不行,试过修改环境变量PATH,试过1.5.2最新版,统统都不行。在这个问题上浪费了大量的时间,通过大量的搜索摸索,最后通过使用第三方源才安装成功。第三方源使用的是remi源,在搜索的过程中,知道这个源用的还挺多的,使用方式如下:

这种使用remi源升级libzip的这一部分已不是最佳做法,请点击查看后面2020年3月20的更新。使用remi源安装只能解决这一个版本的问题,到了PHP7.4.2版本以后就编译不通了。

  1. 添加remi源
    rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-7.rpm
  2. 使用yum安装libzip5-devel-1.5.2,–enablerepo=remi表示启用remi源
    yum --enablerepo=remi install libzip5-devel-1.5.2-1.el7.remi.x86_64
    经网友留言提示,这里最好使用:
    yum --enablerepo=remi install libzip5-devel
    因为上面那句会由于会更新导致失效。

这样就安装好了libzip的最新版本,这版本应该足够以后升级PHP使用了。


2020年3月20日更新:

可以通过源码安装的形式升级libzip,而不必使用第三方的源,因为到了PHP7.4.2以后,使用remi源安装的libzip,在编译PHP代码的时候,会报错。而使用源码安装的libzip则没有问题。使用源码安装方式如下:

wget https://nih.at/libzip/libzip-1.2.0.tar.gz
tar -xvf libzip-1.2.0.tar.gz
cd libzip-1.2.0
./configure && make && make install

这样安装好了之后,在PHP configure的时候还是找不到我们安装的libzip,解决这个问题的方法有两种:

第一种,在PHP configure命令的参数最后添加一项PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/ 即:

// 这里只是演示,省略了中间的参数
./configure ... PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/

第二种,在编译完libzip-1.2.0之后,紧接着执行一句:

export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig/"

这两种都是告知系统,要到/usr/local/lib/pkgconfig/路径中寻找依赖,因为我们编译好的libzip就在这个路径中。到这里,升级libzip完成。


由于这台服务器之前编译过PHP7.3,一些基础的依赖都已经安装好了,所以这里只针对PHP7.4.1安装两个必要的依赖库,命令如下:
yum install -y libsqlite3x-devel.x86_64 oniguruma-devel

基础编译环境的配置完成。


二、编译

PHP7.4的configure配置参数有些已经更改,在网上查到已知的变动如下:

--with-gd 改为 --enable-gd
--with-freetype-dir 改为 --with-freetype
--with-jpeg-dir 改为 --with-jpeg
--with-webp-dir 改为 --with-webp
--with-xpm-dir 改为 --with-xpm
--with-libxml-dir 改为  --with-libxml 
--enable-zip 改为 --with-zip
--enable-zlib-dir 改为 --with-zlib

最终的configure命令修改如下:

./configure \
--prefix=/usr/local/php/php74 \
--enable-gd \
--with-curl \
--enable-fpm \
--enable-cgi \
--with-openssl \
--enable-mbstring \
--with-pdo-mysql \
--with-zlib \
--with-zip \
--with-mysqli \
--enable-opcache \
--enable-mysqlnd \
--with-libxml \
--with-jpeg \
--with-freetype \
--with-pdo-sqlite \
--with-sqlite3 \
--enable-cli \
--enable-shared \
--enable-exif \
PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/

如果之前执行过
export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig/"
那么最后一句可以去掉。

configure完成之后,执行make && make install

编译安装完成。


、配置

把php.ini拷贝到php7.4目录下,当前目录是在PHP7.4.1的源代码目录下。

cp php.ini-development /usr/local/php/php74/lib/php.ini
#下面是为了使用service命令来管理 
cd sapi/fpm
cp init.d.php-fpm /etc/init.d/php74-fpm
chmod 755 /etc/init.d/php74-fpm

这样配置好之后,就可以正确使用service php74-fpm xxx命令了。php74-fpm开机自启动通过编辑/etc/rc.d/rc.local实现:
vi /etc/rc.d/rc.local

#!/bin/bash
touch /var/lock/subsys/local
/usr/bin/setterm -blank 0 || true
/etc/init.d/php56-fpm start
/etc/init.d/php73-fpm start
/etc/init.d/php74-fpm start
/etc/init.d/nginx start

最后需要执行一下ldconfig

如果使用systemd来管理,可以参照下面的做法:

cd sapi/fpm
cp php-fpm.service /lib/systemd/system/php74-fpm.service
vi /usr/lib/systemd/system/php74-fpm.service
ProtectSystem=full 改成 ProtectSystem=false 改完后保存退出
#上面修改了系统服务,要使用这个命令重载系统服务
systemctl daemon-reload  
#加入开机启动
systemctl enable php74-fpm.service
#启动服务
systemctl start php74-fpm.service

配置PHP-FPM:

cd /usr/local/php/php74/etc
cp php-fpm.conf.default php-fpm.conf
cd  /usr/local/php/php74/etc/php-fpm.d
cp www.conf.default www.conf

在我的环境中,因为装了多个PHP版本,所以还需要修改下php-fpm的端口,编辑www.conf:
vi /usr/local/php/php74/etc/php-fpm.d/www.conf

listen = 127.0.0.1:9000 
改为 
listen = 127.0.0.1:9074 

php.ini的配置,把时区改为东八区,编辑php.ini:
vi /usr/local/php/php74/lib/php.ini

date.timezone = "Asia/Shanghai"

配置mysql的socket,不然连不上数据库

mysqli.default_socket =
改为
mysqli.default_socket = /var/lib/mysql/mysql.sock
pdo_mysql.default_socket= 
改为
pdo_mysql.default_socket= /var/lib/mysql/mysql.sock

四、扩展安装

wordpress需要用到imagick扩展,这个扩展之前已经编译过,编译过程参见这里:传送门

这里再简单记录一下,进入imagick的源代码目录
cd ~/imagick-3.4.4

因为以前编译过,所以这里要清除编译缓存重新生成:make clean,不然编译完,执行php -m会看到如下警告信息

[root@104 bin]# ./php -m
PHP Warning:  PHP Startup: imagick: Unable to initialize module
Module compiled with module API=20180731
PHP    compiled with module API=20190902
These options need to match in Unknown on line 0

编译安装,以下命令在 ~/imagick-3.4.4下执行

/usr/local/php/php74/bin/phpize
./configure --with-php-config=/usr/local/php/php74/bin/php-config --with-imagick=/usr/local/imagemagick
make && make install

make install后有个路径要记录下,用于配置php.ini中的extension_dir

Installing shared extensions:/usr/local/php/php74/lib/php/extensions/no-debug-non-zts-20190902/

在php.ini中配置启用扩展

extension_dir = "/usr/local/php/php74/lib/php/extensions/no-debug-non-zts-20190902/"
extension=imagick.so

最后,启动php74-fpm:service php74-fpm start

修改本站的nginx的配置文件,把php-fpm的端口改为9074,并重新加载nginx配置文件:service nginx reload

至此,PHP7.4.1编译安装全部完成,网站可以访问了。

分类
PHP

PHP7.3安装imagick扩展

晚上研究wordpress5.3,发现在工具里面有个健康检查,在健康检查里面有两个扩展要求安装,一个是exif,另一个是imagickexif扩展好安装,直接在编译选项中添加 --enable-exif,然后编译即可。

由于imagick是pecl扩展,所以安装方式和php自带的扩展不同,下面把安装过程记录下来,这里默认安装好了gcc等基础工具。

wget https://pecl.php.net/get/imagick-3.4.4.tgz
tar xf imagick-3.4.4.tgz
cd imagick-3.4.4
yum install autoconf
yum install ImageMagick-devel

进入代码目录后执行phpize

/usr/local/php/php73/bin/phpize
./configure --with-php-config=/usr/local/php/php73/bin/php-config --with-imagick=/usr/local/imagemagick
make && make install

执行完成后会显示扩展模块编译到的目录,记录下这个目录,以便在php.ini进行配置

/usr/local/php/php73/lib/php/extensions/no-debug-non-zts-20180731/

在php.ini中配置

extension_dir = "/usr/local/php/php73/lib/php/extensions/no-debug-non-zts-20180731/"
extension=imagick.so

注意:如果之前配置过extension_dir路径了,则只需要配置extension=imagick.so即可 。

最后,重启php-fpm

service php73-fpm restart