车轮升级PHP7踩过的一些坑
社区php7升级记录
社区服务器已经全部完成升级,这里记录一下社区升级php7所遇到的问题,可以分为四个类型
- 扩展支持的变化,导致需要修改配置甚至调整替换操作的类库
- php7语法检查比之前变得严格,部分之前能正常执行的写法,现在会有warning提示,甚至fatal error
- 部分函数的被弃用
- 我们的一处代码意外触发了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来替代
- 例子:将__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踩过的一些坑的更多相关文章
- Spring Cloud 升级最新 Finchley 版本,踩了所有的坑!
Spring Boot 2.x 已经发布了很久,现在 Spring Cloud 也发布了 基于 Spring Boot 2.x 的 Finchley 版本,现在一起为项目做一次整体框架升级. 升级前 ...
- 安装python爬虫scrapy踩过的那些坑和编程外的思考
这些天应朋友的要求抓取某个论坛帖子的信息,网上搜索了一下开源的爬虫资料,看了许多对于开源爬虫的比较发现开源爬虫scrapy比较好用.但是以前一直用的java和php,对python不熟悉,于是花一天时 ...
- 三分之一的程序猿之社交类app踩过的那些坑
三分之一的程序猿之社交类app踩过的那些坑 万众创新,全民创业.哪怕去年陌生人社交不管融资与否都倒闭了不知道多少家,但是依然有很多陌生人社交应用层出不穷的冒出来.各种脑洞大开,让人拍案叫起. 下面我们 ...
- 【Fine原创】JMeter分布式测试中踩过的那些坑
最近因为项目需要,研究了性能测试的相关内容,并且最终选用了jmeter这一轻量级开源工具.因为一直使用jmeter的GUI模式进行脚本设计,到测试执行阶段工具本身对资源的过量消耗给性能测试带来了瓶颈, ...
- 与webview打交道中踩过的那些坑
随着HTML5被越来越多的用到web APP的开发当中,webview这一个神器便日渐凸显出重要地位.简要的说,webview能够在移动应用中开辟出一个窗口,在里面显示html页面,css以及js代码 ...
- 美团在Redis上踩过的一些坑-目录(本人非美团)(转)
来自:http://carlosfu.iteye.com/blog/2254154 分为5个部分: 一.周期性出现connect timeout 二.redis bgrewriteaof问 ...
- [原创]阿里云RocketMQ踩过的哪些坑
由于公司的最近开始使用RocketMQ来做支付业务处理, 便开启了学习阿里云RocketMQ的学习与实践之路, 其中踩了不少的坑, 大部份是由于没有仔细查看阿里云的技术文档而踩的坑. 但是有一个非常大 ...
- Redis上踩过的一些坑
来自: http://blog.csdn.net//chenleixing/article/details/50530419 上上周和同事(龙哥)参加了360组织的互联网技术训练营第三期,美团网的DB ...
- CentOS 7下升级MySQL5.7.23的一个坑
发现CentOS 7下升级MySQL5.7.23的一个坑,以前面升级到MySQL 5.7.23的一个集群为例 在我们环境下打开文件描述符个数的参数open_files_limit在MySQL 5.6. ...
随机推荐
- 洛谷P3987 我永远喜欢珂朵莉~(set 树状数组)
题意 题目链接 Sol 不会卡常,自愧不如.下面的代码只有66分.我实在懒得手写平衡树了.. 思路比较直观:拿个set维护每个数出现的位置,再写个线段树维护区间和 #include<bits/s ...
- 【读书笔记】iOS-处理内存警告
-(void)didReceiveMemoryWarning{ [super didReceiveMemoryWarning]; } 在这里你需要释放掉所有占用了很大内存的对象,如果你忽略了这个警告, ...
- Power BI 与 Azure Analysis Services 的数据关联:2、Azure Analysis Services与 本地版本的 SQL Analysis Services 连接
Power BI 与 Azure Analysis Services 的数据关联:2.Azure Analysis Services与 本地版本的 SQL Analysis Services ...
- 安全测试 web应用安全测试之XXS跨站脚本攻击检测
web应用安全测试之XXS跨站脚本攻击检测 by:授客 QQ:1033553122 说明 意在对XSS跨站脚本攻击做的简单介绍,让大家对xss攻击有个初步认识,并能够在实际工作当中运用本文所述知识做些 ...
- MySQL 性能优化--优化数据库结构之优化数据大小
MySQL性能优化--优化数据库结构之优化数据大小 By:授客 QQ:1033553122 尽量减少表占用的磁盘空间.通常,执行查询期间处理表数据时,小表占用更少的内存. 表列 l 尽可能使 ...
- 【Java入门提高篇】Day33 Java容器类详解(十五)PriorityQueue详解
今天要介绍的是基础容器类(为了与并发容器类区分开来而命名的名字)中的另一个成员——PriorityQueue,它的大名叫做优先级队列,想必即使没有用过也该有所耳闻吧,什么?没..没听过?emmm... ...
- python格式化字符串format函数
1. format可以接受无限个的参数,位置可以不按顺序: In [1]: "{} {}".format("hello","world") ...
- Django之model模块创建表完整过程
Django中,与数据库相关的模块是model模块,它提供了一种简单易操作的API方式与数据库交互,它是通过ORM映射的方式来操作数据库,一个类对应数据库一张表,一个类属性,对应该表的一个字段,一个实 ...
- Python scikit-learn (metrics): difference between r2_score and explained_variance_score?
I noticed that that 'r2_score' and 'explained_variance_score' are both build-in sklearn.metrics meth ...
- Django电商项目---完成注册页面和用户登录day1
完成基本的创建项目.用户注册.登录.注销功能 创建Django项目,创建df_user的App 创建静态文件夹static(跟manage.py保持在同一级别下) 复制静态文件(css + image ...