Swoole 5将移除自动添加Event::wait()特性详解


Posted in PHP onJuly 10, 2019

前言

在之前的版本中,编写Cli命令行脚本中使用异步或协程功能时,Swoole会自动在脚本末尾检测是否有Event::wait()调用,如果没有,底层会自动调用register_shutdown_function在脚本结束时调用Event::wait(),进入事件循环。

这个特性为底层带来了非常多的麻烦,我们不得不做了大量编码工作,以解决带来的问题。即便如此,仍然存在大量潜在的风险,如某些PHP版本下内存泄露,某些特殊用法导致core dump等。在最新的Swoole 5版本中,我们准备抛弃这个历史包袱。不再自动添加 Event::wait() 到PHP的shutdown function列表。

Server、Process、Process\Pool相关程序请忽略此更新

错误实例

go(function () {
 Co::sleep(1);
 echo "done\n";
});

此代码中没有在脚本末尾添加Swoole\Event::wait(),底层会自动注册到shutdown function列表中。相当于:

register_shutdown_function(function () {
 Swoole\Event::wait();
});

go(function () {
 Co::sleep(1);
 echo "done\n";
});

在shutdown阶段处理程序逻辑会带来很多额外的维护性难题。

正确实例

在Swoole 4.4或Swoole 5版本中,建议:

  • 使用Coroutine\Scheduler作为程序的入口
  • 或者在程序末尾手工添加Event::wait()
$scheduler = new Coroutine\Scheduler;
$scheduler->add(function () {
 Co::sleep(1);
 echo "Done.\n";
});
$scheduler->start();

推荐使用

或者:

go(function () {
 Co::sleep(1);
 echo "done\n";
});
Swoole\Event::wait();

不推荐使用

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
PHP安装攻略:常见问题解答(三)
Oct 09 PHP
php数组函数序列之sort() 对数组的元素值进行升序排序
Nov 02 PHP
提高php运行速度的一些小技巧分享
Jul 03 PHP
分享PHP header函数使用教程
Sep 05 PHP
CI使用Tank Auth转移数据库导致密码用户错误的解决办法
Jun 12 PHP
php eval函数一句话木马代码
May 21 PHP
phpstudy默认不支持64位php的解决方法
Feb 20 PHP
Laravel中unique和exists验证规则的优化详解
Jan 28 PHP
php爬取天猫和淘宝商品数据
Feb 23 PHP
PHP获取日期对应星期、一周日期、星期开始与结束日期的方法
Jun 22 PHP
微信公众号开发之获取位置信息php代码
Jun 13 PHP
PHP pthreads v3使用中的一些坑和注意点分析
Feb 21 PHP
PHP+redis实现微博的拉模型案例详解
Jul 10 #PHP
php解压缩zip和rar压缩包文件的方法
Jul 10 #PHP
PHP+redis实现微博的推模型案例分析
Jul 10 #PHP
实例分析10个PHP常见安全问题
Jul 09 #PHP
PHP批斗大会之缺失的异常详解
Jul 09 #PHP
PHP结合Redis+MySQL实现冷热数据交换应用案例详解
Jul 09 #PHP
PHP+Redis开发的书签案例实战详解
Jul 09 #PHP
You might like
PHP如何抛出异常处理错误
2011/03/02 PHP
Yii基于CActiveForm的Ajax数据验证用法示例
2016/07/14 PHP
PHP设计模式之原型设计模式原理与用法分析
2018/04/25 PHP
Javascript代码混淆综合解决方案-Javascript在线混淆器
2006/12/18 Javascript
JS动态创建Table,Tr,Td并赋值的具体实现
2013/07/05 Javascript
实例讲解jQuery EasyUI tree中state属性慎用
2016/04/01 Javascript
Node.js的项目构建工具Grunt的安装与配置教程
2016/05/12 Javascript
jQuery中Ajax全局事件引用方式及各个事件(全局/局部)执行顺序
2016/06/02 Javascript
细数JavaScript 一个等号,两个等号,三个等号的区别
2016/10/09 Javascript
浅谈JavaScript中promise的使用
2017/01/11 Javascript
React组件生命周期详解
2017/07/03 Javascript
浅谈Node模块系统及其模式
2017/11/17 Javascript
vue2.0使用swiper组件实现轮播效果
2017/11/27 Javascript
JavaScript笛卡尔积超简单实现算法示例
2018/07/30 Javascript
在微信小程序里使用watch和computed的方法
2018/08/02 Javascript
使用p5.js实现动态GIF图片临摹重现
2019/10/23 Javascript
Vue中rem与postcss-pxtorem的应用详解
2019/11/20 Javascript
基于javascript实现贪吃蛇经典小游戏
2020/04/10 Javascript
JS判断数组四种实现方法详解
2020/06/29 Javascript
[02:48]DOTA2超级联赛专访海涛:你们的选择没有错
2013/06/07 DOTA
[02:04]2020年夜魇暗潮预告片
2020/10/30 DOTA
Python NumPy库安装使用笔记
2015/05/18 Python
centos6.5安装python3.7.1之后无法使用pip的解决方案
2019/02/14 Python
浅谈Python中eval的强大与危害
2019/03/13 Python
Python大数据之网络爬虫的post请求、get请求区别实例分析
2019/11/16 Python
Python 3 使用Pillow生成漂亮的分形树图片
2019/12/24 Python
python 实现仿微信聊天时间格式化显示的代码
2020/04/17 Python
Python判断字符串是否为合法标示符操作
2020/09/03 Python
Python HTMLTestRunner如何下载生成报告
2020/09/04 Python
Sneaker Studio捷克:购买运动鞋
2018/07/08 全球购物
教育科学研究生自荐信
2013/10/09 职场文书
人力资源管理专业毕业生推荐信
2013/11/07 职场文书
领导视察欢迎词
2014/01/15 职场文书
会计岗位职责范本
2014/03/07 职场文书
2015年学校总务工作总结
2015/07/20 职场文书
四则混合运算教学反思
2016/02/23 职场文书