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
php 遍历数据表数据并列表横向排列的代码
Sep 05 PHP
PHP 抓取新浪读书频道的小说并生成txt电子书的代码
Dec 18 PHP
基于curl数据采集之正则处理函数get_matches的使用
Apr 28 PHP
基于PHP 面向对象之成员方法详解
May 04 PHP
zf框架的校验器InArray使用示例
Mar 13 PHP
字符串长度函数strlen和mb_strlen的区别示例介绍
Sep 09 PHP
ThinkPHP3.2.1图片验证码实现方法
Aug 19 PHP
PHP之认识(二)关于Traits的用法详解
Apr 11 PHP
PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】
May 13 PHP
PHP钩子实现方法解析
May 21 PHP
Thinkphp 3.2框架使用Redis的方法详解
Oct 24 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下一个阿拉伯数字转中文数字的函数
2007/07/16 PHP
PHP 清空varnish 缓存的详解(包括指定站点下的)
2013/06/20 PHP
PHP中的print_r 与 var_dump 输出数组
2016/06/13 PHP
php处理多图上传压缩代码功能
2018/06/13 PHP
Lazy Load 延迟加载图片的 jQuery 插件
2010/02/06 Javascript
getComputedStyle与currentStyle获取样式(style/class)
2013/03/19 Javascript
js单例模式详解实例
2013/11/21 Javascript
javascript修改IMG标签的src问题
2014/03/28 Javascript
Javascript中的getUTCDay()方法使用详解
2015/06/10 Javascript
利用JS实现简单的日期选择插件
2017/01/23 Javascript
jQuery实现文章图片弹出放大效果
2017/04/06 jQuery
nodejs微信扫码支付功能实现
2018/02/17 NodeJs
使用webpack搭建react开发环境的方法
2018/05/15 Javascript
微信小程序之swiper滑动面板用法示例
2018/12/04 Javascript
微信小程序制作表格的方法
2019/02/14 Javascript
详解如何搭建mpvue框架搭配vant组件库的小程序项目
2019/05/16 Javascript
详解Webpack如何引入CDN链接来优化编译后的体积
2019/06/21 Javascript
[01:18]PWL开团时刻DAY4——圣剑与抢盾
2020/11/03 DOTA
Django发送html邮件的方法
2015/05/26 Python
深入剖析Python的爬虫框架Scrapy的结构与运作流程
2016/01/20 Python
详解Python自建logging模块
2018/01/29 Python
python中cPickle类使用方法详解
2018/08/27 Python
python web自制框架之接受url传递过来的参数实例
2018/12/17 Python
python Django 创建应用过程图示详解
2019/07/29 Python
python实现生成Word、docx文件的方法分析
2019/08/30 Python
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
2019/10/12 Python
Python sklearn库实现PCA教程(以鸢尾花分类为例)
2020/02/24 Python
Pycharm修改python路径过程图解
2020/05/22 Python
如何将整数int转换成字串String
2014/03/21 面试题
行政管理人员精品工作推荐信
2013/11/04 职场文书
乡镇四风对照检查材料
2014/08/31 职场文书
机关作风建设工作总结
2014/10/23 职场文书
Python实现排序方法常见的四种
2021/07/15 Python
Mysql排序的特性详情
2021/11/01 MySQL
提高系统的吞吐量解决数据库重复写入问题
2022/04/23 MySQL
Tomcat配置访问日志和线程数
2022/05/06 Servers