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

时间:2016-07-01 18:10:56

标签: php redirect output-buffering

此代码示例应该重定向并继续处理长操作,但直到<?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 (); ?> 命令完成后才会重定向。我已经尝试了多种其他方法来做到这一点并没有任何效果。我哪里错了?

在我的php.ini

中启用了 ignore_user_abort()
alphabet = iter('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
print next(alphabet)

我提前感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

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

我观察到,当我使用同一台Web服务器进行整个过程时,立即挂断过程是不可能的。因此,如果需要发送响应的连接的客户端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();
}

您可以根据情况进行调整,并设置重定向标头而不是“ 200 OK”。