PHP 在返回之前等待 curl 完成

PHP waiting for curl to finish before returning

我有两个 PHP 文件,一个用于“繁重的工作”,一个用于快速响应,将请求编组到举重者,以便快速响应文件可以立即响应服务器请求(至少,这就是目标)。这样做的前提是 Slack Slash 命令更喜欢即时 200 让用户知道命令是 运行ning.

<?php
echo("I want this text to reply to server instantly");
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
$code = '200';

$curl = curl_init();
curl_setopt_array($curl, array(
  CURLOPT_URL => "http://myheavyliftingfile.php",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "datatobeusedbyheavylifter:data",
  CURLOPT_HTTPHEADER => array(
    "cache-control: no-cache",
    "content-type: application/x-www-form-urlencoded",
    "postman-token: 60757c65-a11e-e524-e909-4bfa3a2845fb"
  ),
));

$response = curl_exec($curl);
?>

似乎正在发生的事情是,我的 response/echo 直到我的 heavylifting.php curl 完成后才被发送到 Slack,尽管我希望我的响应立即发生,而重-提升过程本身分开。我怎样才能让一个 PHP 文件确认请求,在另一个文件上启动另一个进程,并在不等待漫长的进程完成的情况下做出响应?

更新

我不希望一次 运行 多个卷曲,我只想执行一个卷曲但不等待它 return 以便 return 向 Slack 发送消息说我收到了请求。我的 curl 将数据发送到我的另一个 php 文件,该文件执行繁重的工作。如果这仍然是重复中定义的相同问题,请随时再次标记它,我不会重新打开。

这不起作用的原因是,PHP curl 调用始终是同步的,并且您的超时设置为 30 秒,这远远超过了最大值。 Slash 命令允许的 3 秒。

但是有一个修复程序可以使它工作。您只需要这些小改动:

  1. 将 curl 超时设置为较小的值以确保您的第一个脚本在 3 秒阈值以下完成,例如将 CURLOPT_TIMEOUT_MS 设置为 400,这定义了 400 毫秒的超时。

  2. 在您的第一个脚本中将 CURLOPT_NOSIGNAL 设置为 1。这是超时在基于 UNIX 的系统中工作所必需的。

  3. 确保在您的第一个脚本中忽略超时错误(CURL 错误 28),因为您的 curl 应该总是 return 超时错误。

  4. 确保您的第二个脚本没有被强制超时中止,方法是添加以下行:ignore_user_abort(true);

另请参阅 this answer 以获取完整示例。

P.S.: 这种方法不需要任何缓冲区刷新。