用PHP实现无阻塞请求.你好


Implementing non blocking request in PHP. Howto

我现在面临的问题是,我不知道如何在PHP中实现非阻塞请求。在我的应用程序中,任何用户活动都会存档,而此存档过程可能需要一些相当长的时间,最长可达5-10秒。因此,用户界面(使用JavaScript)不再响应,因为它还依赖于对服务器的请求。因此,假设我向服务器发出了这样的请求(使用ExtJS库,这在这里无关紧要):

  Ext.Ajax.request({
      url:'/handlers/archive.php', // my handler which I want to make non-blocking
      method:'POST',
      params:{...} // some parameters submitted to the server
  });
  ... here are other multiple request to the server 
  ... they are now waiting for the completion of heavy archive.php procedure

那么,如何使这个php过程真正不阻塞呢?任何非阻塞程序的工作示例都将非常有用。

如果你想让你的客户端得到快速响应并继续处理服务器端的数据,你必须为这个实现一些机制

例如:

  1. 从客户端获取POST请求
  2. 将数据写入DB/队列/文件系统
  3. 向客户端返回200响应
  4. 另一个进程稍后将在存档时查询数据库(5-10秒)

您可以使用RabbitMq或任何其他队列系统/消息系统

真正的多线程PHP在web应用程序中很棘手,除非您的web服务器设置为处理它,例如通过Apache的MPM Worker。

在这种情况下,我认为最好使用exec()派生一个curl命令:

$req = "curl -X POST -H 'Content-Type: application/json'";
$req.= " -d '" . $payload . "' " . "'" . $url . "'";
$req .= " > /dev/null 2>&1 &";
exec($req);