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 编程请选择正确的文本编辑软件
Dec 21 PHP
php配合jquery实现增删操作具体实例
Dec 12 PHP
php检测useragent版本示例
Mar 24 PHP
跨浏览器PHP下载文件名中的中文乱码问题解决方法
Mar 05 PHP
php示例详解Constructor Prototype Pattern 原型模式
Oct 15 PHP
PHP信号量基本用法实例详解
Feb 12 PHP
浅谈PHP的反射API
Feb 26 PHP
php生成毫秒时间戳的实例讲解
Sep 22 PHP
thinkphp5.0自定义验证规则使用方法
Nov 16 PHP
php实现每日签到功能
Nov 29 PHP
PHP PDOStatement::fetchColumn讲解
Jan 31 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
Aug 14 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
杏林同学录(七)
2006/10/09 PHP
WindowsXP中快速配置Apache+PHP5+Mysql
2008/06/05 PHP
MayFish PHP的MVC架构的开发框架
2009/08/13 PHP
php防注入,表单提交值转义的实现详解
2013/06/10 PHP
php 模拟post_验证页面的返回状态(实例讲解)
2013/10/28 PHP
linux下编译安装memcached服务
2014/08/03 PHP
php实现常见图片格式的水印和缩略图制作(面向对象)
2016/06/15 PHP
解决laravel5中auth用户登录其他页面获取不到登录信息的问题
2019/10/08 PHP
JS操作Cookies包括(读取添加与删除)
2012/12/26 Javascript
javascript模拟评分控件实现方法
2015/05/13 Javascript
vue-cli启动本地服务局域网不能访问的原因分析
2018/01/22 Javascript
JS/jQuery实现简单的开关灯效果【案例】
2019/02/19 jQuery
浅谈vue.watch的触发条件是什么
2020/11/07 Javascript
[06:23]2014DOTA2西雅图国际邀请赛 小组赛7月12日TOPPLAY
2014/07/12 DOTA
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python实现文件按照日期命名的方法
2015/07/09 Python
Python实现二叉搜索树
2016/02/03 Python
详解Python中的变量及其命名和打印
2016/03/11 Python
python解决Fedora解压zip时中文乱码的方法
2016/09/18 Python
Python实现迭代时使用索引的方法示例
2018/06/05 Python
Python中asyncio与aiohttp入门教程
2018/10/16 Python
教你一步步利用python实现贪吃蛇游戏
2019/06/27 Python
Python如何实现定时器功能
2020/05/28 Python
洲际酒店集团大中华区:IHG中国
2016/08/17 全球购物
Hotels.com台湾:饭店订房网
2017/09/06 全球购物
Lookfantastic瑞典:英国知名美妆购物网站
2018/04/06 全球购物
Java程序员面试90题
2013/10/19 面试题
实习自我鉴定
2013/12/15 职场文书
银行类自荐信
2014/02/04 职场文书
国旗下讲话演讲稿
2014/05/08 职场文书
捐款活动总结
2014/08/27 职场文书
模范教师事迹材料
2014/12/16 职场文书
电话营销开场白
2015/05/29 职场文书
高中语文教材(文学文化常识大全一)
2019/08/13 职场文书
爱国之歌(8首)
2019/09/29 职场文书
vue+springboot实现登录验证码
2021/05/27 Vue.js