我有两个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文件,这个文件很重要。如果这仍然是副本中定义的相同问题,请随时再次标记它,我将不会重新打开。谢谢你的帮助
答案 0 :(得分:2)
这不起作用的原因是,PHP curl调用始终是同步的,并且您的超时设置为30秒,远远超过最大值。 Slash命令允许3秒。
但是有一个方法可以解决这个问题。你只需要做这些小改动:
将卷曲超时设置为较小的值,以确保您的第一个脚本在3秒阈值以下完成,例如将CURLOPT_TIMEOUT_MS
设置为400,定义超时为400毫秒。
在第一个脚本中将CURLOPT_NOSIGNAL
设置为1。这是超时在基于UNIX的系统中工作所必需的。
确保在第一个脚本中忽略超时错误(CURL ERROR 28),因为你的curl应该总是返回超时错误。
通过添加以下行,确保强制超时不会中止您的第二个脚本:ignore_user_abort(true);
另请参阅this answer以获取完整示例。
P.S。:您不需要为此方法进行任何缓冲区刷新。