PHP在返回之前等待卷曲完成

时间:2018-01-06 00:58:17

标签: php asynchronous slack

我有两个PHP文件,一个用于“繁重提升”,一个用于快速响应,将请求编组到繁重的升降机上,以便快速响应文件可以立即响应服务器请求。 (至少,这是目标)。这样做的前提是Slack Slash命令,它们更喜欢使用即时200来让用户知道命令正在运行。

<?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);
?>

似乎正在发生的事情是,我的响应/回声在我的heavyylifting.php卷曲完成之前不会被发送到Slack,即使我希望我的回应立即发生,而重击过程本身也是如此。如何让一个PHP文件确认请求,在另一个文件上启动另一个进程,并且无需等待很长时间才能完成响应?非常感谢任何帮助。

更新: 我不希望一次运行多个卷发,我只想执行一个卷曲但不等待它返回,以便向Slack返回一条消息,说我收到了请求。我的curl将数据发送到我的其他php文件,这个文件很重要。如果这仍然是副本中定义的相同问题,请随时再次标记它,我将不会重新打开。谢谢你的帮助

1 个答案:

答案 0 :(得分:2)

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

但是有一个方法可以解决这个问题。你只需要做这些小改动:

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

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

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

  4. 通过添加以下行,确保强制超时不会中止您的第二个脚本:ignore_user_abort(true);

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

    P.S。:您不需要为此方法进行任何缓冲区刷新。