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下通过伪造http头破解防盗链的代码
Jul 03 PHP
PHP substr 截取字符串出现乱码问题解决方法[utf8与gb2312]
Dec 16 PHP
解析用PHP读写音频文件信息的详解(支持WMA和MP3)
May 10 PHP
Windows7下的php环境配置教程
Feb 28 PHP
PHP+AJAX实现投票功能的方法
Sep 28 PHP
php去除二维数组的重复项方法
Nov 03 PHP
PHP中使用array函数新建一个数组
Nov 19 PHP
php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】
Dec 07 PHP
laravel自定义分页效果
Jul 23 PHP
thinkPHP中钩子的使用方法实例分析
Nov 16 PHP
PHP实现带进度条的Ajax文件上传功能示例
Jul 02 PHP
使用PHP开发留言板功能
Nov 19 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中iconv函数使用方法
2008/05/24 PHP
PHP extract 将数组拆分成多个变量的函数
2010/06/30 PHP
php动态函数调用方法
2015/05/21 PHP
php遍历替换目录下文件指定内容的方法
2016/11/10 PHP
PHP addcslashes()函数讲解
2019/02/03 PHP
js 获取Listbox选择的值的代码
2010/04/15 Javascript
在次封装easyui-Dialog插件实现代码
2010/11/14 Javascript
基于prototype扩展的JavaScript常用函数库
2010/11/30 Javascript
使用js判断数组中是否包含某一元素(类似于php中的in_array())
2013/12/12 Javascript
node.js实现多图片上传实例
2014/06/03 Javascript
jQuery获得指定元素坐标的方法
2015/04/14 Javascript
使用CDN和AJAX加速WordPress中jQuery的加载
2015/12/05 Javascript
快速移动鼠标触发问题及解决方法(ECharts外部调用保存为图片操作及工作流接线mouseenter和mouseleave)
2016/08/29 Javascript
浅谈layer的iframe弹窗给里面的标签赋值的问题
2016/11/10 Javascript
如何提高Dom访问速度
2017/01/05 Javascript
es6的数字处理的方法(5个)
2017/03/16 Javascript
JS简单实现点击按钮或文字显示遮罩层的方法
2017/04/27 Javascript
详解vue + vuex + directives实现权限按钮的思路
2017/10/24 Javascript
JavaScript实现修改伪类样式
2017/11/27 Javascript
Django+Vue跨域环境配置详解
2018/07/06 Javascript
详解Python3中字符串中的数字提取方法
2017/01/14 Python
fastcgi文件读取漏洞之python扫描脚本
2017/04/23 Python
python发送邮件脚本
2018/05/22 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
2018/06/11 Python
Pytorch卷积层手动初始化权值的实例
2019/08/17 Python
python实现大量图片重命名
2020/03/23 Python
Django框架中间件定义与使用方法案例分析
2019/11/28 Python
pandas抽取行列数据的几种方法
2020/12/13 Python
英国打印机墨盒销售网站:Ink Factory
2019/10/07 全球购物
毕业生的自我评价分享
2013/12/18 职场文书
保安队长职务说明书
2014/02/23 职场文书
少先队工作总结2015
2015/05/13 职场文书
背起爸爸上学观后感
2015/06/08 职场文书
2015年电气技术员工作总结
2015/07/24 职场文书
如何理解PHP核心特性命名空间
2021/05/28 PHP
小程序自定义轮播图圆点组件
2022/06/25 Javascript