在PHP中实现非阻塞请求。如何

时间:2015-03-29 11:31:42

标签: php

我现在面临的问题是我不知道如何在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程序真正无阻塞?任何非阻塞程序的工作示例都会非常有用。

2 个答案:

答案 0 :(得分:1)

如果您希望客户端获得快速响应并继续处理服务器端的数据,则必须为此实现某种机制

例如:

  1. 从客户端获取POST请求
  2. 将数据写入DB / queue / filesystem
  3. 返回200回复​​客户
  4. 其他进程稍后会在归档时查询数据库(5-10秒)
  5. 您可以使用RabbitMq或任何其他队列系统/消息系统

答案 1 :(得分:1)

真正的multi-threaded PHP在网络应用中很棘手,除非您的网络服务器设置为处理它,例如通过Apache's MPM Worker

在这种情况下,我认为最好的办法是将exec()用于fork a curl command

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