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 秒。
但是有一个修复程序可以使它工作。您只需要这些小改动:
将 curl 超时设置为较小的值以确保您的第一个脚本在 3 秒阈值以下完成,例如将 CURLOPT_TIMEOUT_MS
设置为 400,这定义了 400 毫秒的超时。
在您的第一个脚本中将 CURLOPT_NOSIGNAL
设置为 1。这是超时在基于 UNIX 的系统中工作所必需的。
确保在您的第一个脚本中忽略超时错误(CURL 错误 28),因为您的 curl 应该总是 return 超时错误。
确保您的第二个脚本没有被强制超时中止,方法是添加以下行:ignore_user_abort(true);
另请参阅 this answer 以获取完整示例。
P.S.: 这种方法不需要任何缓冲区刷新。
我有两个 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 秒。
但是有一个修复程序可以使它工作。您只需要这些小改动:
将 curl 超时设置为较小的值以确保您的第一个脚本在 3 秒阈值以下完成,例如将
CURLOPT_TIMEOUT_MS
设置为 400,这定义了 400 毫秒的超时。在您的第一个脚本中将
CURLOPT_NOSIGNAL
设置为 1。这是超时在基于 UNIX 的系统中工作所必需的。确保在您的第一个脚本中忽略超时错误(CURL 错误 28),因为您的 curl 应该总是 return 超时错误。
确保您的第二个脚本没有被强制超时中止,方法是添加以下行:
ignore_user_abort(true);
另请参阅 this answer 以获取完整示例。
P.S.: 这种方法不需要任何缓冲区刷新。