【问题标题】:Implementing non blocking request in PHP. Howto在 PHP 中实现非阻塞请求。如何
【发布时间】:2015-06-03 02:57:03
【问题描述】:

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

【问题讨论】:

  • “阻止 PHP”并不是真正的问题。问题只是一个请求耗时过长。您可以通过稍后执行缓慢的任务来加快 PHP 必须完成的工作;例如您将一些数据放在某个地方,然后让 cron 作业根据该数据执行较慢的任务。

标签: php


【解决方案1】:

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

例如:

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

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

【讨论】:

    【解决方案2】:

    真正的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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 2013-11-12
      • 2016-08-26
      相关资源
      最近更新 更多