Oct 9

博客迁移到PHP7小记

Lrdcq , 2017/10/09 17:53 , 日誌 , 閱讀(3926) , Via 本站原創
由于考虑增加更现代的php服务端架构,之前针对08年的这个Bo-Blog旧版的服务器配置——php5.1+win2003已经完全无法满足我们的技术迭代(和娱乐)要求了。因此慎重考虑之后,觉得将服务器迁移到linux+php7+上,对于的,对Bo-Blog的代码也做了一次升级。

虽然说是迁移到php7,其实php7的代码兼容性是非常棒的,涉及到的绝大部分修改是从php5.3开始就已经不推荐甚至被干掉的,因此php7干掉了这么多东西还是无可厚非。最主要的改动有以下几点:

1.mysql

mysql拓展已经完全被干掉了。虽然不开心,但是确实有mysql拓展就能满足需求的情况下基本上没有人用过mysqli,所以最直接的,需要把mysql的面向函数的代码迁移到mysqli的面向对象的方法上。在Bo-Blog中,数据库方法封装在inc/db.php中,并且代码量不大,所以可以直接改代码迁移(反正已经global乱飞了,不怕多一个)。另外,如果改动真的很大的话,还有一些兼容性的方法,即自己提供原本的mysql方法,比如这个:https://github.com/dshafik/php7-mysql-shim。考虑到自己对mysqli并不熟悉,因此暂时采用兼容方案了。

2.preg_replace

preg_replace的/e模式即eval功能也被干掉了,也就是说,形如:
//
$str = preg_replace("/something/e", "dealsomething('\\1')", $str);
//

这样的写法,的/e是不合法的,并且dealsomething也不会执行。这种情况下,5.3之后就开始推荐用更加安全的preg_replace_callback代替,如:
//
$str = preg_replace_callback("/something/", function($m) {
    return dealsomething($m[1]);
}, $str);
//

来实现,同时,针对preg_replace的数组形式,还提供了preg_replace_callback_array方法来使用。
因此回到Bo-Blog中,我们有大量的preg_replace需要修改,主要集中在各个页面,admin和inc/ubb.php的解析中。其中单个的preg_replace改为preg_replace_callback还算好办,但是preg_replace数组形式会遇到有e和普通的正则混搭的情况,不得不拆成两次正则方法调用,不知道会不会有潜在的安全隐患。
当然,还有一种解决方法是,如果解析出来的字符串全是可执行php代码,拿到结果再手动eval一次就可以了。但是这违反了禁用这个方法的初衷。

3.其他

还遇到了一些小点,都是php5.3后就已经修改或者不建议使用的:

1.session_register方法已经不需要,被干掉了,现在直接通过$_SESSION设置session即可。

2.set_magic_quotes_runtime和类似的方法已经被干掉了,临时可以通过ini_set来设置这一系列的玩意儿。不过这功能应该已经取消了才对,Bo-Blog反正也没使用所以无所谓。

主要就是这些了,更多可以参看官方文档http://php.net/manual/en/migration70.incompatible.php。从php5.1升级上来,我们看到的除了php的性能提升,更重要的是严格模式和面向对象,面向函数编程特性的引入和支持,并且向强类型语言靠拢。升级到php7之后,后续改进和重构就可以直接上马最高标准,用最优雅的方式来解决问题。虽然这个博客不太可能遇到瓶颈,质量的提升也是有必要的。
logo