php - 重定向但仍继续处理 exec()

标签 php redirect output-buffering

此代码示例应该重定向并继续处理长时间的操作,但是直到 exec 命令完成后它才会重定向。我已经尝试了多种其他方法来做到这一点,但没有任何效果。我哪里错了?

在我的 php.ini 中启用了 ignore_user_abort()

<?php
set_time_limit ( 0 );
header ( 'Connection: close' );
ob_start ();
header ( 'Content-Length: 0' );
header ( 'Location: /redirect.php' );
ob_end_flush ();
flush ();
ignore_user_abort ( true );

exec('command that takes 5 minutes to process');
exit ();
?>

在此先感谢您的帮助。

最佳答案

我最近不得不编写一个 webhook 处理程序,它应该在继续处理其他长时间运行的任务之前立即返回“200 OK”响应。

我观察到当整个过程都在使用同一个网络服务器时,立即挂断过程是不可能的。因此,如果您需要发送响应的连接的客户端 IP 与服务器 IP 相同,您可能永远无法做到这一点。但当传入连接是真实世界的远程客户端时,它总是有效。

尽管如此,我只是返回了“200 OK”响应。这应该与发回重定向没有什么不同。

对我有用的代码是......

public function respondASAP($responseCode = 200)
{
    // check if fastcgi_finish_request is callable
    if (is_callable('fastcgi_finish_request')) {
        /*
         * This works in Nginx but the next approach not
         */
        session_write_close();
        fastcgi_finish_request();

        return;
    }

    ignore_user_abort(true);

    ob_start();
    http_response_code($responseCode);
    header('Content-Encoding: none');
    header('Content-Length: '.ob_get_length());
    header('Connection: close');

    ob_end_flush();
    ob_flush();
    flush();
}

您可以根据您的情况调整它并设置重定向 header 而不是“200 OK”。

关于php - 重定向但仍继续处理 exec(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38151610/

相关文章:

php - 使用 POST 方法和 HttpURLConnection 将 JSON 对象从 Android 发送到 PHP 服务器

php - 如何对 MySQL 数据库中的一组结果求和并避免在 PHP 中重复?

javascript - javascript window.location 如何工作?

php - 如何阻止 PHP 输出缓冲吃掉错误消息?

php - ajax php图像按字母顺序排列

php - SQL导出、MYSQL导入、换行问题

javascript - 无法追踪的 HTTP 重定向?

javascript - ExpressJS - 删除请求后的res.redirect

PHP:如何使用输出缓冲区缓存页面?

python - 标准输出的行缓冲在 MINGW/MSYS Python 2.7.3 上失败