文章大纲

preg_replace(): Compilation failed: invalid range in character class at offset 10

2020-04-08 23:51:10

本人服务器原本是centos yum自动安装的php,版本5.4.45。


最近为了安装swoole,php要升级到7以上,本人打算安装php7.3版本的。


通过下面命令查看当前安装好的php文件包:

yum list installed |grep php


本人为了避免旧版php干扰,就直接先将旧的删除了,博客就无法访问。如果你的网站牵扯利益重大,你可以把这个删除操作留到最后。


通过yum remove将上面旧的php文件全部删掉:

yum -y remove php*


开始安装php7.3:

yum install epel-release
yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum install -y php73-php-devel php73-php-fpm php73-php-cli php73-php-bcmath php73-php-gd php73-php-json php73-php-mbstring php73-php-mcrypt php73-php-mysqlnd php73-php-opcache php73-php-pdo php73-php-pecl-crypto php73-php-pecl-mcrypt php73-php-pecl-geoip php73-php-recode php73-php-snmp php73-php-soap php73-php-xmll

systemctl restart php73-php-fpm #重启
systemctl start php73-php-fpm #启动
systemctl stop php73-php-fpm #关闭
systemctl status php73-php-fpm #检查状态


我参考的网上,少安装了php-devel,结果导致后面用phpize命令,报command not found(命令不存在)错误。


本人安装好后,重启php-fpm,这里注意,服务名变成了php73-php-fpm,不再是php-fpm了。


结果本人博客全部链接失效。。。


查看错误日志,出现大量如下警告:

[08-Apr-2020 21:19:22 Asia/Shanghai] 
PHP Warning:
preg_replace(): Compilation failed:
invalid range in character class at offset 20
in **.php on line 1830

错误日志本人安装的,在这个地方:/var/opt/remi/php73/log/php-fpm/www-error.log,目录好长,好难记。


经过百度,找出原因如下:

php版本从5.4上升到7.3,正则表达式里的破折号-需要用反斜杠转义


博客正常了,可是后台编辑文章用到redis,后台页面又开始报错了。


进入了如下代码,显示异常,即表示当前php没有redis扩展。

if ( !extension_loaded('redis') ) {
throw_exception('redis failed to load');
}


所以又要重新给php7.3安装redis插件。


本人直接从github下载的插件源码:https://github.com/phpredis/phpredis


git clone https://github.com/phpredis/phpredis.git --depth=1

--depth==1,表示只下载源码只包含最近一次的commit记录,历史的commit记录都没有,这样下载的文件包很小,也就下载很快。


然后就是编译安装,phpize方式的3条亘古不变的命令:

phpize
./configure
make && make install


通过下面命令,先找到phpize文件位置:

find / -name phpize
/opt/remi/php73/root/usr/bin/phpize


又是一串好长的目录,centos下使用命令,默认先会从/usr/bin里面找,为了方便快捷,本人给其建了个软链:

ln -s  /opt/remi/php73/root/usr/bin/phpize  /usr/bin/phpize


redis扩展安装成功了,会提示编译好的文件所在的目录。我的是:/opt/remi/php73/root/usr/lib64/php/modules/。


接着就是将extension=redis加入php.ini配置。


先通过如下命令,找到php.ini文件的位置。

php -i |grep "Loaded Configuration"

翟码农安装的配置文件位置在:/etc/opt/remi/php73/php.ini。


为了方便快捷,本人给其创建了个软链:

ln -s /etc/opt/remi/php73/php.ini /etc/php.ini

这样就只需编辑/etc/php.ini文件好了,简单好记。


加入extension=redis后,重启php-fpm服务,用php -m |grep redis查看redis插件是否安装成功,结果又是报错:

undefined symbol: php_json_decode_ex


原因是引入redis扩展之前,需要先引入json,再添加一行引入json就好啦:

extension=json
extension=redis


本人同时也将extension_dir目录设置了一下:

extension_dir = "/opt/remi/php73/root/usr/lib64/php/modules/"

这里的目录,就是上面redis扩展编译后的文件生成目录。


重新重启php-fpm服务,再次查询,总算没有错误了,不过还是有个警告,本人懒得理它了。

php -m |grep redis
PHP Warning: Module 'json' already loaded in Unknown on line 0
redis

显示出redis,就代表扩展已经安装成功了。


为了方便使用php命令,再次建个软链:

ln -s /usr/bin/php73 /usr/bin/php


一番折腾,总算将php版本更新到7.3版本了。

php -v
PHP 7.3.16 (cli) (built: Mar 17 2020 10:18:38) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.16, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.3.16, Copyright (c) 1999-2018, by Zend Technologies




我要评论
评论列表