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 页面编码声明方法详解(header或meta)
Mar 12 PHP
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
Nov 21 PHP
PHP扩展CURL的用法详解
Jun 20 PHP
yii操作session实例简介
Jul 31 PHP
php中mkdir函数用法实例分析
Nov 15 PHP
php中switch与ifelse的效率区别及适用情况分析
Feb 12 PHP
php中让人头疼的浮点数运算分析
Oct 10 PHP
PHP实现活动人选抽奖功能
Apr 19 PHP
Yii 2.0中场景的使用教程
Jun 02 PHP
PHP get_html_translation_table()函数用法讲解
Feb 16 PHP
PHP中的输出echo、print、printf、sprintf、print_r和var_dump的示例代码
Dec 01 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
咖啡与牛奶
2021/03/03 冲泡冲煮
杏林同学录(四)
2006/10/09 PHP
php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
2010/12/02 PHP
Yii的CDbCriteria查询条件用法实例
2014/12/04 PHP
PHP下载大文件失败并限制下载速度的实例代码
2019/05/10 PHP
php获取小程序码的实现代码(B类接口)
2020/06/13 PHP
PHP连接SQL server数据库测试脚本运行实例
2020/08/24 PHP
EXTjs4.0的store的findRecord的BUG演示代码
2013/06/08 Javascript
setTimeout()递归调用不加引号出错的解决方法
2014/09/05 Javascript
JavaScript中Date.toSource()方法的使用教程
2015/06/12 Javascript
jQuery实现平滑滚动页面到指定锚点链接的方法
2015/07/15 Javascript
ES6中如何使用Set和WeakSet
2016/03/10 Javascript
js动态生成form 并用ajax方式提交的实现方法
2016/09/09 Javascript
JQuery中解决重复动画的方法
2016/10/17 Javascript
JS中微信小程序自定义底部弹出框
2016/12/22 Javascript
JS 中LocalStorage和SessionStorage的使用
2017/08/17 Javascript
chorme 浏览器记住密码后input黄色背景处理方法(两种)
2017/11/22 Javascript
Vue.set()实现数据动态响应的方法
2018/02/07 Javascript
解决使用Vue.js显示数据的时,页面闪现原始代码的问题
2018/02/11 Javascript
QQ跳转支付宝并自动领红包脚本(最新)
2018/06/22 Javascript
three.js实现圆柱体
2018/12/30 Javascript
盘点提高 Python 代码效率的方法
2014/07/03 Python
python开发之tkinter实现图形随鼠标移动的方法
2015/11/11 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
2019/08/23 Python
Django框架 信号调度原理解析
2019/09/04 Python
从多个tfrecord文件中无限读取文件的例子
2020/02/17 Python
如何卸载python插件
2020/07/08 Python
HTML5的video标签的浏览器兼容性增强方案分享
2016/05/19 HTML / CSS
Nike挪威官网:Nike.com (NO)
2018/11/26 全球购物
过滤器的用法
2013/10/08 面试题
关于幼儿的自我评价
2013/12/18 职场文书
安全资金保障制度
2014/01/23 职场文书
幸福中国演讲稿
2014/09/12 职场文书
2015年求职自荐信范文
2015/03/04 职场文书
美容院员工规章制度
2015/08/05 职场文书
Zabbix对Kafka topic积压数据监控的问题(bug优化)
2022/07/07 Servers