thinkphp3.2升级php7.2要点记录

有一台老服务器到期了,新升级的系统,再安装旧版本的php环境,多少有点麻烦。

毕竟php5 已经被官方放弃有一段时间了,php7 也已经发布使用了很长时间。

由于php7相对于php5,升级改动的地方很多,一方面带来了很多关于性能和安全性的提升。

另一方面废除了很多就的函数和扩展,导致很多基于php5开发的项目,升级php7需要改动一些代码才可以。

对于php7 而言,php7.2也算是个小的分界岭,在php7.2又改进了很多地方。

索性我就选择了php7.2

对于很多国产框架和cms而言,升级php7.2要注意的要点

1. php5时代的标签机制代码改写

cms中,模版体系的重要部分就是标签,用于渲染调用数据,这些标签会由框架和cms的模版引擎部分控制,比如thinkphp phpcms,这里大多数会用到

正则表达式替换,使用preg_replace 的e 模式,执行回调。而这个模式在php7.2被废止了,所以要找到这些代码修改为preg_replace_callback 函数的写法。

2.thinkphp的参数过滤和路由分发

这里也是preg_replace 引发的问题,thinkphp 对于url的模式,可以基于pathinfo,进行过滤和重组,里面有几处使用preg_replace的e模式,要修改,否则

在thinkphp3.2 使用rewrite模式的时候,get的参数会不正常,这是因get的参数基于pathinfo 被框架再次重组赋值了。

其中替换preg_replace最麻烦。

以下是一些例子。

a、ThinkPHP/Lib/Core/Dispatcher.class.php:132

         // 解析剩余的URL参数
         // preg_replace('@(\w+)\/([^\/]+)@e', '$var[\'\\1\']=strip_tags(\'\\2\');', implode('/',$paths));

        // 替换为支持php7的preg_replace_callback函数。
        preg_replace_callback('/(\w+)\/([^\/]+)/',
            function ($matches) use (&$var) {
               $var[$matches[1]] = strip_tags($matches[2]);
            },
            implode('/',$paths));

b、ThinkPHP/Lib/Core/Db.class.php:605

// $joinStr = preg_replace("/__([A-Z_-]+)__/esU",C("DB_PREFIX")."strtolower('$1')",$joinStr);
 
// 替换为
$joinStr = preg_replace_callback("/__([A-Z_-]+)__/sU", function($matches){
    return C("DB_PREFIX").strtolower($matches[1]);
},  $joinStr);
  

3.mysql扩展不可用,切换mysqli

这个很简单修改配置文件,已经psn 作为mysql数据库连接配置的时候,mysql:// 改为mysqli://协议即可。

另外需要批量替换代码: “mysql_”开头的函数替换成 “mysqli_”开头的函数, 替换之后TP3的session驱动不再支持DB类型,需要改成默认驱动;

配置文件中的数据库类型改为 mysqli.,并将所有文件中的 mysql_*类函数修改为mysqli_*函数。

3.string在php7中是保留字,不能用做类名

修改thinkphp下 /Library/Org/Util/String.class.php ,改个名字,比如 Stringstr.class.php (因为string在php7中是保留字,不能用做类名)。

将Stringstr.class.php中的 类名修改为 Stringnew. ,再将此文件中的String:: 修改为Stringnew::。

修改你 项目中的所有文件中的 use Org\Util\String; 为 use Org\Util\Stringnew; , 所有项目文件中的 String:: 修改为Stringnew::。
 
完成上述的几处关于thinkphp3.2升级php7.2的要点的修改以后。

网站就顺利迁移了,测试一些页面的接口的访问,正常运行!

你可能感兴趣的:(PHP,THINKPHP)