【问题标题】:Run a function after returning response返回响应后运行函数
【发布时间】:2018-02-12 13:52:08
【问题描述】:

我有一个使用 Slim 3 创建的 API。

其中我有一些 curl 执行,例如向用户发送推送通知。

我想向请求者发送响应,然后执行 curl 或任何其他功能。

我在PHP 中阅读了有关线程的信息并使用了pthreads-polyfill,但它在完成线程后发送响应。

示例测试代码:

 $app->get('/test', function (Request $request, Response $response) {
    PushController::publish("1111111", "HELLO");
    $result =  'OK';

    return $response->getBody()->write($result)->withStatus(200);
});

【问题讨论】:

  • 我不知道响应后是否有办法(AFAIK 否)。为此,我总是使用第三方队列服务,例如 Amazon SQS 或 RabbitMQ
  • 尝试使用队列作业或 CRON 作业。 CRON 作业更易于实施。 Redis可以用来实现排队系统。

标签: php curl pthreads slim-3


【解决方案1】:

我理解你想要做什么,线程不是答案。 正如您所提到的,一种解决方案是从主要脚本调用脚本。 一个更优雅的恕我直言,是打电话给fastcgi_finish_request。它将向请求者返回答案并继续执行脚本。不幸的是,此功能仅适用于 PHP-FPM。这是目前的行业标准,但不一定是安装 LAMP 堆栈时的默认设置。

【讨论】:

    【解决方案2】:

    可以根据您的要求提供两种解决方案

    1. 队列
    2. Cron

    Redis 可以用作队列服务器。为此,您需要在系统上安装 redis 服务器。 Redis 有 predis 的 php 实现。有关 Redis 的更多详细信息,您可以在Redis official site 中阅读。 Beanstalkd 也可以用作队列服务器。

    要了解如何创建 cron 作业,您可以参考现有的stackoverflow question

    【讨论】:

      猜你喜欢
      • 2018-06-09
      • 1970-01-01
      • 2020-05-06
      • 2019-04-24
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      • 2018-11-24
      相关资源
      最近更新 更多