PHP无需等待响应即可运行后台作业非阻塞模式与触发类型类似

时间:2016-10-18 12:46:03

标签: php curl asynchronous yii2 nonblocking

目的

我的基本目标是使用Yii2 Web应用程序在PHP中实现异步触发器

我需要运行php批处理作业,但我不想在 browser / cron 中等待完成这项工作。 为了运行作业,我需要使用我的应用程序的不同文件,如

http://myapp/foojob.php 

foojob.php应该异步调用许多php实例[每个实例承载一个作业]基于手头的可用工作。调用的时间限制(foojob.php)小于60sec.i需要在超过超时值之前触发新的php实例。

I Referred&试图

  1. curl_multi - 我无法在其中找到非阻止模式。
  2. fsock_open - 这可以通过发送Connection:Close to the call(但是fsock open在许多共享主机服务器上并不总是可用,或者它无法正常工作)。你能用fsock传输建议我任何可靠的解决方案吗?
  3. pcntl_exec - 我没有实时尝试,但实时统计数据显示45%的服务器禁用了该功能。我不知道原因。
  4. 流媒体 - 我不知道它是如何运作的?
  5. 我的问题:

    1. 非阻止异步请求是否有任何可能的解决方案已经存在于git中以实现PHP?
    2. 如果我需要查看其他任何传输,请转介我
    3. 是否有基于环境的智能切换传输机制(curl / fsock)?
    4. 编辑:

      该应用程序是自托管产品。它将得到各种托管服务的工作。共享主机不允许/为其客户提供任何外部扩展。

2 个答案:

答案 0 :(得分:1)

您可以采用一种方法,在该方法中,您发送正确的标头以使浏览器关闭连接,然后同步运行该过程,它看起来与最终用户异步。

这是我很久以前写的一些你可以看到的例子。 http://www.phpclasses.org/package/8388-PHP-Defer-execution-of-actions-until-the-script-ends.html

我认为yii中有一些地方可以在内容发送后挂钩,你可以做类似的事情。

它的简短版本     header(“Content-Length:”。$ length);     标题(“连接:关闭”);

ob_flush(); // headers
echo $html;
flush();

doWork();

答案 1 :(得分:0)

我为非阻塞后台作业编写了一个php库。这个图书馆有助于实现我发布的目标

作曲家图书馆 https://packagist.org/packages/devbabuind/non-blocking-php