车轮升级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. ...
随机推荐
- OneMap Client API
MapSystem.Map.SmMap类 方法 mergerGeo:function(geoList) 将多个几何图形合并(支持面.线),组合成一个复合对象 例子: var geo=this.myMa ...
- python之装饰器(函数)
1. 装饰器 遵循的原则: 开闭原则: 对功能的扩展开放 对代码的修改是封闭 # 通用装饰器写法 # 存在的意义: 在不破坏原有函数和原有函数调用的基础上,给函数添加新的功能. def wrapp ...
- vue-cli脚手架之webpack.dev.conf.js
webpack.dev.conf.js 开发环境模式配置文件: 'use strict'//js按照严格模式执行 const utils = require('./utils')//导入utils. ...
- 【转】解决weblogic启动慢和创建域慢的方法
创建域慢启动慢的特征:创建域到70%时,进程长时间等待(命令行创建时停止在100%处),创建域启动Weblogic的时候也是长时间停止. Weblogic在Linux下启动慢的原因,发现从进程堆来看, ...
- linux查找某段时间修改的文件的总大小
1.统计 2017-10-25 16:30:00 至 2017-10-25 19:30:00 修改的文件的总大小 b= for i in `find -type f \( -newermt '2017 ...
- C++基础学习一(基础之基础)
开篇:做了这么多年的软件,第一次使用博客的方式记录学习过程,之前都是笔记本(都有一摞了),因为之前一直从事的都是.NET的开发工作,对C++知之甚少,但一直想了解C++这门鼻祖级的语言,现在终于下定决 ...
- linux内存源码分析 - SLAB分配器概述【转】
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 之前说了管理区页框分配器,这里我们简称为页框分配器,在页框分配器中主要是管理物理内存,将物理内存的页框分配给申请 ...
- 读取HTML文件进行格式化解析
#读取HTML文件进行格式化解析 $html = New-Object -ComObject "HTMLFile"; $source = Get-Content -Path &qu ...
- python遍历本地文件系统 按文件大小排序
在这个例子中,主要会用到python内置的和OS模块的几个函数: os.walk() : 该方法用来遍历指定的文件目录,返回一个三元tuple(dirpath, dirnames, filenames ...
- Python实例---模拟微信网页登录(day5)
第六步: 实现发送/接受消息---day5代码 settings.py """ Django settings for weixin project. Generated ...