社区php7升级记录

社区服务器已经全部完成升级,这里记录一下社区升级php7所遇到的问题,可以分为四个类型

  1. 扩展支持的变化,导致需要修改配置甚至调整替换操作的类库
  2. php7语法检查比之前变得严格,部分之前能正常执行的写法,现在会有warning提示,甚至fatal error
  3. 部分函数的被弃用
  4. 我们的一处代码意外触发了php7本身的一处bug,已经在php官网提交并得到反馈

第一种情况:扩展的变化

1. 不支持mysql扩展,改用mysqli

  这个比较简单修改配置信息就好

2. 不支持memcache扩展,改用memcached

这里有比较大的坑,我们测试过memcache与memcached的哈希规则是不一致的,甚至存储写入时两个扩展设置的数据类型flag都是不一致的,导致memcache扩展写入
的数组,在memcached扩展读出来是原始的序列化字符串。
所以两者在集群甚至单点模式下都是无法兼容的.
之后我们尝试过在php5.6上也启用memcached,不过发现两个不同版本的memcached的哈希规则竟然都不一样。
最后我们的解决方案是php7使用新的集群,与旧有的隔离,同个判断php版本已经扩展是否存在来使用哪种扩展与配置

3. 不支持mongo扩展,改用mongodb扩展

扩展变化导致原先的mongodb操作的类库不可用,我们根据php版本来判断具体使用哪一种

参考:https://segmentfault.com/a/1190000007158136

也可以是用开源的mongo适配器实现兼容。

 composer require alcaeus/mongo-php-adapter

第二种情况:语法检查变化

php7某种情况自动类型转换会出问题

$pids = '';
$pids[] = array();

使用[]操作,出现Fatal error

PHP Fatal error:  Uncaught Error: [] operator not supported for strings

函数定义这里php7的参数校验和5.6有差异

function a($param1, $param2, $param1 = array()){}

这样的方式php5.6不会报错,7会报fatal error.

PHP Fatal error:  Redefinition of parameter $param1 in

以数组的形式给字符串赋值,会报错

PHP Warning:  Cannot assign an empty string to a string offset

第三种情况:部分函数被弃用或调用方式调整

正则匹配preg_replace 函数的 e 修饰符功能在php7被弃用(其他修饰符模式,正常使用),需要回调执行,则用preg_replace_callback来替代

  1. 例子:将__TABLE_NAME__这样的字符串替换成正规的表名,并且带上前缀
$joinStr = preg_replace("/__([A-Z_-]+)__/e",$prex.".strtolower('$1')",$joinStr);
//替换为
preg_replace_callback("/__([A-Z_-]+)__/",function($r) use (&$joinStr){
$joinStr = $prex.strtolower($r[]);
},$joinStr);

第四种情况:触发php7 bug

在将一台cgi服务器升级到php后,时不时会收到超时报警,定位后发现是某种特殊情况下触发了php7的bug 我们已经把bug提交到官网 https://bugs.php.net/bug.php?id=74431

注:PHP官方在第二天就修复了此BUG,最新的 7.1.5 就没问题了

原文链接

车轮升级PHP7踩过的一些坑的更多相关文章

  1. Spring Cloud 升级最新 Finchley 版本,踩了所有的坑!

    Spring Boot 2.x 已经发布了很久,现在 Spring Cloud 也发布了 基于 Spring Boot 2.x 的 Finchley 版本,现在一起为项目做一次整体框架升级. 升级前 ...

  2. 安装python爬虫scrapy踩过的那些坑和编程外的思考

    这些天应朋友的要求抓取某个论坛帖子的信息,网上搜索了一下开源的爬虫资料,看了许多对于开源爬虫的比较发现开源爬虫scrapy比较好用.但是以前一直用的java和php,对python不熟悉,于是花一天时 ...

  3. 三分之一的程序猿之社交类app踩过的那些坑

    三分之一的程序猿之社交类app踩过的那些坑 万众创新,全民创业.哪怕去年陌生人社交不管融资与否都倒闭了不知道多少家,但是依然有很多陌生人社交应用层出不穷的冒出来.各种脑洞大开,让人拍案叫起. 下面我们 ...

  4. 【Fine原创】JMeter分布式测试中踩过的那些坑

    最近因为项目需要,研究了性能测试的相关内容,并且最终选用了jmeter这一轻量级开源工具.因为一直使用jmeter的GUI模式进行脚本设计,到测试执行阶段工具本身对资源的过量消耗给性能测试带来了瓶颈, ...

  5. 与webview打交道中踩过的那些坑

    随着HTML5被越来越多的用到web APP的开发当中,webview这一个神器便日渐凸显出重要地位.简要的说,webview能够在移动应用中开辟出一个窗口,在里面显示html页面,css以及js代码 ...

  6. 美团在Redis上踩过的一些坑-目录(本人非美团)(转)

    来自:http://carlosfu.iteye.com/blog/2254154 分为5个部分:    一.周期性出现connect timeout    二.redis bgrewriteaof问 ...

  7. [原创]阿里云RocketMQ踩过的哪些坑

    由于公司的最近开始使用RocketMQ来做支付业务处理, 便开启了学习阿里云RocketMQ的学习与实践之路, 其中踩了不少的坑, 大部份是由于没有仔细查看阿里云的技术文档而踩的坑. 但是有一个非常大 ...

  8. Redis上踩过的一些坑

    来自: http://blog.csdn.net//chenleixing/article/details/50530419 上上周和同事(龙哥)参加了360组织的互联网技术训练营第三期,美团网的DB ...

  9. CentOS 7下升级MySQL5.7.23的一个坑

    发现CentOS 7下升级MySQL5.7.23的一个坑,以前面升级到MySQL 5.7.23的一个集群为例 在我们环境下打开文件描述符个数的参数open_files_limit在MySQL 5.6. ...

随机推荐

  1. loadrunner 场景设计-学习笔记之性能误区

    场景设计-学习笔记之性能误区 by:授客 QQ:1033553122 场景假设: 每个事务仅包含一次请求,执行10000个并发用户数 性能误区: 每秒并发用户数=每秒向服务器提交请求数 详细解答: 每 ...

  2. 解决ArrayList线程不安全

    前些天做项目时,程序出现意外的问题,经后来分析是使用ArrayList这个线程不安全的方法导致 解决这个问题通常有两种方法(个人认为) 一:使用synchronized关键字,这个大家应该都很熟悉了, ...

  3. centos6启动服务说明

    centos6启动服务说明 阅读目录 centos6.9最小化安装下的启动服务 其他服务(仅供参考,持续更新) 此表转自:参考1.参考2.另有多处补充及纠正. 1. centos6.9最小化安装下的启 ...

  4. Scrapy爬取遇到的一点点问题

    学了大概一个月Scrapy,自己写了些东东,遇到很多问题,这几天心情也不大好,小媳妇人也不舒服,休假了,自己研究了很久,有些眉目了 利用scrapy 框架爬取慕课网的一些信息 步骤一:新建项目 scr ...

  5. 校园网下对VMware网络的配置

    1.参考:https://jingyan.baidu.com/article/8275fc8675c22646a03cf6b8.html 2.因为校园网的每一次连接都是自动获得IP地址的,所以虚拟机要 ...

  6. 系统运维|SqlServer2008|数据库日志文件过大需要清理的操作攻略

    摘要: 1.执行SQL语句改成“简单模式” 2.收缩数据库 3.执行SQL语句改回“完全模式”   原文链接: http://www.lookdaima.com/WebForms/WebPages/B ...

  7. pip更新及Requirement already up-to-date解决方法

    pip更新及Requirement already up-to-date解决方法 文:铁乐与猫 2018-9-11 更新命令 将pip更新到最新版本 python -m pip install --u ...

  8. 浅谈tidb事务与MySQL事务之间的区别

    MySQL是我们日常生活中常见的数据库,他的innodb存储引擎尤为常见,在事务方面使用的是扁平事务,即要么都执行,要么都回滚.而tidb数据库则使用的是分布式事务.两者都能保证数据的高一致性,但是在 ...

  9. Windows系统安装nginx及配置

    1.下载nginx http://nginx.org/en/download.html         下载稳定版本,以nginx/Windows-1.12.2为例,直接下载 nginx-1.12.2 ...

  10. JVM虚拟机查找类文件的顺序

    JVM查找类文件的顺序: 在doc下使用set classpath=xxx, 如果没有配置classpath环境变量,JVM只在当前目录下查找要运行的类文件. 如果配置了classpath环境,JVM ...