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 相关文章推荐
全文搜索和替换
Oct 09 PHP
搜索和替换文件或目录的一个好类--很实用
Oct 09 PHP
PHP MemCached 高级缓存应用代码
Aug 05 PHP
php中通过正则表达式下载内容中的远程图片的函数代码
Jan 10 PHP
PHP手机号码归属地查询代码(API接口/mysql)
Sep 04 PHP
基于PHP文件操作的详解
Jun 05 PHP
Win下如何安装PHP的APC拓展
Aug 07 PHP
PHP自带函数给数字或字符串自动补齐位数
Jul 29 PHP
PHP+Ajax检测用户名或邮件注册时是否已经存在实例教程
Aug 23 PHP
PHP中使用imagick生成PSD文件缩略图教程
Jan 26 PHP
Yii2.0表关联查询实例分析
Jul 18 PHP
PHP 实现缩略图
Mar 09 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判断IP并转跳到相应城市分站的方法
2015/03/25 PHP
Zend Framework教程之连接数据库并执行增删查的方法(附demo源码下载)
2016/03/21 PHP
thinkPHP多语言切换设置方法详解
2016/11/11 PHP
yii 2.0中表单小部件的使用方法示例
2017/05/23 PHP
PHP lcfirst()函数定义与用法
2019/03/08 PHP
JavaScript asp.net 获取当前超链接中的文本
2009/04/14 Javascript
js 变量类型转换常用函数与代码[比较全]
2009/12/01 Javascript
判断控件是否已加载完成的代码
2010/02/24 Javascript
给jqGrid数据行添加修改和删除操作链接(之一)
2011/11/04 Javascript
javascript 判断字符串是否包含某字符串及indexOf使用示例
2013/10/18 Javascript
Event altKey,ctrlKey,shiftKey属性解析
2013/12/18 Javascript
jquery 字符串切割函数substring的用法说明
2014/02/11 Javascript
简单方法判断JavaScript对象为null或者属性为空
2014/09/26 Javascript
jQuery手机浏览器中拖拽动作的艰难性分析
2015/02/04 Javascript
使用jQuery获得内容以及内容的属性
2015/02/26 Javascript
在JavaScript中处理时间之getHours()方法的使用
2015/06/10 Javascript
javascript实现全角半角检测的方法
2015/07/23 Javascript
jQuery实现div横向拖拽排序的简单实例
2016/07/13 Javascript
js 声明数组和向数组中添加对象变量的简单实例
2016/07/28 Javascript
JS实现在文本指定位置插入内容的简单示例
2017/12/22 Javascript
vue.js2.0点击获取自己的属性和jquery方法
2018/02/23 jQuery
element-ui表格合并span-method的实现方法
2019/05/21 Javascript
Vue 同步异步存值取值实现案例
2020/08/05 Javascript
JavaScript Dom实现轮播图原理和实例
2021/02/19 Javascript
vue 使用饿了么UI仿写teambition的筛选功能
2021/03/01 Vue.js
[02:26]DOTA2英雄米拉娜基础教程
2013/11/25 DOTA
[01:10]DOTA2次级职业联赛 - EP战队宣传片
2014/12/01 DOTA
web.py中调用文件夹内模板的方法
2014/08/26 Python
在Python中用keys()方法返回字典键的教程
2015/05/21 Python
Python 实现两个列表里元素对应相乘的方法
2018/11/14 Python
python用opencv批量截取图像指定区域的方法
2019/01/24 Python
python获取整个网页源码的方法
2020/08/03 Python
汽车运用工程专业求职信
2014/06/18 职场文书
工程部岗位职责范本
2015/04/11 职场文书
永不妥协观后感
2015/06/10 职场文书
礼貌问候语大全
2015/11/10 职场文书