首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
协程的睡眠问题co::sleep
刚碰到一个坑,分享一下,看看有没有人有解答,估计是个bug **描述:** 在HttpServer的onRequest中执行完CO::sleep(0.01); 再执行file_get_contents请求一个延时比较长的Http请求,然后再执行CO::sleep(0.01); 这个时候CO::sleep(0.01)执行的时间将不再准确,而是变得和file_get_contents所请求的http页面一样的延时 **测试代码:** {{{php <?php $serv = new Swoole\Http\Server("0.0.0.0", 9503); $serv->on('Request', function($request, $response) { echo date('YmdHis')." 第一次睡眠\n"; CO::sleep(0.01); echo date('YmdHis')." 第一次睡眠 结束\n"; echo date('YmdHis')." 调用一个耗时5s的http请求\n"; file_get_contents('http://www.92lan.com/sleep.php'); echo date('YmdHis')." 调用一个耗时5s的http请求 完成\n"; echo date('YmdHis')." 第二次睡眠\n"; CO::sleep(1); /** 这里应该只会睡眠1s,但实际上睡眠了5s,和上一个file_get_contents的耗时一样长 */ echo date('YmdHis')." 第二次睡眠 结束\n"; $response->end("<h1>Hello Swoole!</h1>"); }); $serv->start(); }}} **执行结果:** 第一部分为时间信息 {{{ 20180419204232 第一次睡眠 20180419204232 第一次睡眠 结束 20180419204232 调用一个耗时5s的http请求 20180419204237 调用一个耗时5s的http请求 完成 20180419204237 第二次睡眠 20180419204243 第二次睡眠 结束 }}}
发布于7年前 · 14 次浏览 · 来自
提问
泰
泰琛
刚碰到一个坑,分享一下,看看有没有人有解答,估计是个bug **描述:** 在HttpServer的onRequest中执行完CO::sleep(0.01); 再执行file_get_contents请求一个延时比较长的Http请求,然后再执行CO::sleep(0.01); 这个时候CO::sleep(0.01)执行的时间将不再准确,而是变得和file_get_contents所请求的http页面一样的延时 **测试代码:** {{{php <?php $serv = new Swoole\Http\Server("0.0.0.0", 9503); $serv->on('Request', function($request, $response) { echo date('YmdHis')." 第一次睡眠\n"; CO::sleep(0.01); echo date('YmdHis')." 第一次睡眠 结束\n"; echo date('YmdHis')." 调用一个耗时5s的http请求\n"; file_get_contents('http://www.92lan.com/sleep.php'); echo date('YmdHis')." 调用一个耗时5s的http请求 完成\n"; echo date('YmdHis')." 第二次睡眠\n"; CO::sleep(1); /** 这里应该只会睡眠1s,但实际上睡眠了5s,和上一个file_get_contents的耗时一样长 */ echo date('YmdHis')." 第二次睡眠 结束\n"; $response->end("<h1>Hello Swoole!</h1>"); }); $serv->start(); }}} **执行结果:** 第一部分为时间信息 {{{ 20180419204232 第一次睡眠 20180419204232 第一次睡眠 结束 20180419204232 调用一个耗时5s的http请求 20180419204237 调用一个耗时5s的http请求 完成 20180419204237 第二次睡眠 20180419204243 第二次睡眠 结束 }}}
赞
0
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2019-08-21
B
Bb
在每次CO::sleep之后,加入一行 swoole_timer_after(1, function(){}); 能修正这个问题。。 近期无时间撸底层代码,业务代码就先这么处理着了,有感兴趣的大牛么?
赞
0
回复
2019-08-23
因为阻塞操作会让异步server退化为同步server, 也就是阻塞整个进程
赞
0
回复
2019-08-23
z
zengyueming
[@twosee ](/u/3908) 不是你这个原因,是file_get_content的阻塞执行,在执行完成之后,会影响到后面的co::sleep的睡眠时长,本来应该睡眠1s,但实际睡眠了上一次file_get_content阻塞的时间。
赞
0
回复
2019-10-18
c
cs1234
[@yyjie ](/u/5728)我说的和你说的是一码事啊..
赞
0
回复