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开发者常犯的10个MySQL错误更正剖析
Jan 30 PHP
php使用ereg验证文件上传的方法
Dec 16 PHP
PHP调试函数和日志记录函数分享
Jan 31 PHP
PHP使用递归生成文章树
Apr 21 PHP
php三元运算符知识汇总
Jul 02 PHP
Laravel 中获取上一篇和下一篇数据
Jul 27 PHP
php上传大文件失败的原因及应对策略
Oct 20 PHP
编写PHP脚本来实现WordPress中评论分页的功能
Dec 10 PHP
php入门教程之Zend Studio设置与开发实例
Sep 09 PHP
Yii输入正确验证码却验证失败的解决方法
Jun 06 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
Nov 13 PHP
有关PHP 中 config.m4 的探索
Aug 26 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
array_multisort实现PHP多维数组排序示例讲解
2011/01/04 PHP
mac系统下安装多个php并自由切换的方法详解
2017/04/21 PHP
PHP面向对象类型约束用法分析
2019/06/12 PHP
php判断IP地址是否在多个IP段内
2020/08/18 PHP
用js+xml自动生成表格的东西
2006/12/21 Javascript
点击下载链接 弹出页面实现代码
2009/10/01 Javascript
JavaScript聚焦于第一个字段的代码
2010/10/15 Javascript
密码强度检测效果实现原理与代码
2013/01/04 Javascript
Lua表达式和控制结构学习笔记
2014/12/15 Javascript
检查表单元素的值是否为空的实例代码
2016/06/16 Javascript
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
2016/12/15 Javascript
servlet+jquery实现文件上传进度条示例代码
2017/01/25 Javascript
jQuery内容筛选选择器实例代码
2017/02/06 Javascript
3分钟掌握常用的JS操作JSON方法总结
2017/04/25 Javascript
解决vue 格式化银行卡(信用卡)每4位一个符号隔断的问题
2018/09/14 Javascript
Node.js 如何利用异步提升任务处理速度
2019/01/07 Javascript
面试题:react和vue的区别分析
2019/04/08 Javascript
微信小程序用户授权,以及判断登录是否过期的方法
2019/05/10 Javascript
详解Vue.js 作用域、slot用法(单个slot、具名slot)
2019/10/15 Javascript
element el-table表格的二次封装实现(附表格高度自适应)
2021/01/19 Javascript
[56:35]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第二局
2016/02/27 DOTA
Python的Scrapy爬虫框架简单学习笔记
2016/01/20 Python
python实现时间o(1)的最小栈的实例代码
2018/07/23 Python
python opencv 实现对图像边缘扩充
2020/01/19 Python
Python序列化pickle模块使用详解
2020/03/05 Python
详解使用scrapy进行模拟登陆三种方式
2021/02/21 Python
GNC健安喜美国官网:美国第一营养品牌
2016/07/22 全球购物
英语生日邀请函
2014/01/23 职场文书
企业总经理岗位职责
2014/02/13 职场文书
高中学生干部学习的自我评价
2014/02/21 职场文书
银行先进个人事迹材料
2014/05/11 职场文书
党员倡议书
2015/01/19 职场文书
小学生组织委员竞选稿
2015/11/21 职场文书
2016年主题党日活动总结
2016/04/05 职场文书
浅谈redis五大数据结构和使用场景
2021/04/12 Redis
MySql学习笔记之事务隔离级别详解
2021/05/12 MySQL