php如何实现非阻塞任务?

发布于 2022-09-11 17:24:11 字数 1297 浏览 17 评论 0

问题描述

我只是想单纯的用php实现非阻塞任务

$worker -> do(function(){
    //...io耗时任务...
}) -> then(function($result){
    //任务完成后的通知回调
});

有什么好的方式呢? 执行任务的时候不能阻塞。

其实下面的几种都没问题,swoole reactPHP workerman等均能实现下面的处理逻辑

$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(...); //error
    resolve(...); //success
}) -> then(function($result){
    //任务完成后的通知回调
});

一些同行推荐了下面的链接作为参考

https://github.com/hprose/hpr...

http://nikic.github.io/2012/1...

https://github.com/reactphp

我想实现的是do里面是function,function里面是一些任务,仔细想了下应该是无法实现这个操作的,因为异步任务的话,上下文关系已经变了,不知道我的理解是否正确?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

£烟消云散 2022-09-18 17:24:11

swoole可以

就此别过 2022-09-18 17:24:11

默认情况下 是单线程 的 实现不了
重新编译一下开启多线程模式 这个能够实现。

手心的温暖 2022-09-18 17:24:11

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();
});

function then_do(){
    global $count;
    if($count<3){return}
    //.........这里做最后要做的事情
}
放肆 2022-09-18 17:24:11

PHP本身是顺序执行的,没有异步回调的用法,也没有你说的非阻塞用法。

如果是基于CLI的应用,可以尝试使用swoole来实现。swoole是PHP的一个扩展实现了异步非阻塞的操作。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文