发送 http 响应后继续处理 php

2022-08-30 07:04:12

我的脚本由服务器调用。从服务器,我将收到 和 .ID_OF_MESSAGETEXT_OF_MESSAGE

在我的脚本中,我将处理传入的文本并使用参数生成响应:和。ANSWER_TO_IDRESPONSE_MESSAGE

问题是我正在发送对incomming的响应,但是向我发送消息以处理的服务器将在收到http响应200后将他的消息设置为已传递给我(这意味着我可以向他发送对该ID的响应)。"ID_OF_MESSAGE"

解决方案之一是将消息保存到数据库,并制作一些每分钟都会运行的cron,但我需要立即生成响应消息。

有没有一些解决方案如何发送到服务器http响应200,而不是继续执行php脚本?

非常感谢


答案 1

是的。您可以执行以下操作:

ignore_user_abort(true);//not required
set_time_limit(0);

ob_start();
// do initial processing here
echo $response; // send the response
header('Connection: close');
header('Content-Length: '.ob_get_length());
ob_end_flush();
@ob_flush();
flush();
fastcgi_finish_request();//required for PHP-FPM (PHP > 5.3.3)

// now the request is sent to the browser, but the script is still running
// so, you can continue...

die(); //a must especially if set_time_limit=0 is used and the task ends

答案 2

我在这里看到了很多建议使用但此代码不是必需的响应。所有这一切都是为了确保在用户中止的情况下发送响应之前,脚本继续执行(通过关闭浏览器或按 esc 停止请求)。但这不是你要问的。您要求在发送响应后继续执行。您所需要的只是以下内容:ignore_user_abort(true);

// Buffer all upcoming output...
ob_start();

// Send your response.
echo "Here be response";

// Get the size of the output.
$size = ob_get_length();

// Disable compression (in case content length is compressed).
header("Content-Encoding: none");

// Set the content length of the response.
header("Content-Length: {$size}");

// Close the connection.
header("Connection: close");

// Flush all output.
ob_end_flush();
@ob_flush();
flush();

// Close current session (if it exists).
if(session_id()) session_write_close();

// Start your background work here.
...

如果您担心后台工作所需的时间会超过PHP的默认脚本执行时间限制,请坚持使用顶部。set_time_limit(0);


推荐