【问题标题】:PHP Running Background jobs without waiting for response Non Blocking mode Like Trigger typePHP运行后台作业而不等待响应非阻塞模式类似触发器类型
【发布时间】:2016-10-18 12:46:03
【问题描述】:

目标

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

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

http://myapp/foojob.php 

foojob.php 应该是异步调用多个 php 实例[每个实例携带一个作业] 根据手头的可用作业。调用(foojob.php)的时间限制小于60秒。我需要在超过超时值之前触发新的php实例。

我推荐并尝试过

  1. curl_multi - 我在其中找不到非阻塞模式。
  2. fsock_open - 这可以通过发送 Connection: Close 来实现(但是 fsock open 在许多共享托管服务器上并不总是可用,或者它不能正常工作)。您能否向我推荐任何使用 fsock 传输的可靠解决方案?
  3. pcntl_exec - 我没有实时尝试,但实时统计显示 45% 的服务器禁用了该功能。我不知道为什么。
  4. 流传输 - 我不知道它是如何工作的?

我的问题:

  1. 非阻塞异步请求 git 中是否有任何可能的解决方案可以在 PHP 中实现?
  2. 如果我需要研究任何其他传输方式,请联系我
  3. 有没有基于环境的智能切换传输机制(curl/fsock)?

编辑:

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

【问题讨论】:

  • 你看php-rescue了吗?
  • @old_mountain 谢谢。我看过了。它需要 redis Redis 2.2+。对于我们的案例来说,没有任何硬依赖会更好?
  • 你检查ignore_user_abort()了吗?如果你有 unix 盒子让它工作,你可以使用nohup
  • 试试 rabbitMQ - 它是作业调度程序(队列)。您创建作业,然后创建调度程序启动第一个作业。

标签: php curl asynchronous yii2 nonblocking


【解决方案1】:

您可以采取一种方法,即发送正确的标头让浏览器关闭连接,然后同步运行该过程,这对于最终用户来说似乎是异步的。

这是我很久以前写的内容,您可以将其视为示例。 http://www.phpclasses.org/package/8388-PHP-Defer-execution-of-actions-until-the-script-ends.html

我假设在 yii 中有一些地方可以在内容发送后进行挂钩。

它的简短版本 header("内容长度:".$length); header("连接:关闭");

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

doWork();

【讨论】:

  • 感谢您的回答。 socket 和 commands 中有一些非阻塞的 php 概念。这很有用,我在这里用一些非阻塞 php 方法编写了自己的答案。
【解决方案2】:

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

作曲家库 https://packagist.org/packages/devbabuind/non-blocking-php

【讨论】:

    猜你喜欢
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 2011-07-14
    相关资源
    最近更新 更多