为了账号安全,请及时绑定邮箱和手机立即绑定

大佬们遇到过这个问题吗?php如何实现非阻塞任务?

大佬们遇到过这个问题吗?php如何实现非阻塞任务?

慕少森 2019-08-21 18:00:26
问题描述我只是想单纯的用php实现非阻塞任务$worker->do(function(){//...io耗时任务...})->then(function($result){//任务完成后的通知回调});有什么好的方式呢?执行任务的时候不能阻塞。其实下面的几种都没问题,swoolereactPHPworkerman等均能实现下面的处理逻辑$worker->request('http://....')->then(function($result){//任务完成后的通知回调});$worker->query('select*from.....')->then(function($result){//任务完成后的通知回调});$worker->getFile('./test.txt')->then(function($result){//任务完成后的通知回调});但是下面这种却无法实现。$worker->do(function(){request('http://...');query('select*....');getFile('./test.txt');reject(...);//errorresolve(...);//success})->then(function($result){//任务完成后的通知回调});一些同行推荐了下面的链接作为参考https://github.com/hprose/hpr...http://nikic.github.io/2012/1...https://github.com/reactphp我想实现的是do里面是function,function里面是一些任务,仔细想了下应该是无法实现这个操作的,因为异步任务的话,上下文关系已经变了,不知道我的理解是否正确?
查看完整描述

2 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

PHP本身是顺序执行的,没有异步回调的用法,也没有你说的非阻塞用法。
如果是基于CLI的应用,可以尝试使用swoole来实现。swoole是PHP的一个扩展实现了异步非阻塞的操作。
                            
查看完整回答
反对 回复 2019-08-21
?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

workerman了解一下,纯的php.
补充:没看你给的链接,只给个简单的思想,类似于nodejs中写回调的方法;
$count=0;
$worker->request('http://....')->then(function($result){
//任务完成后的通知回调
global$count;
$count++;
then_do();
});
$worker->query('select*from.....')->then(function($result){
//任务完成后的通知回调
global$count;
$count++;
then_do();
});
$worker->getFile('./test.txt')->then(function($result){
//任务完成后的通知回调
global$count;
$count++;
then_do();
});
functionthen_do(){
global$count;
if($count<3){return}
//.........这里做最后要做的事情
}
                            
查看完整回答
反对 回复 2019-08-21
  • 2 回答
  • 0 关注
  • 349 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号