fastcgi_finish_request() 的用法

fastcgi_finish_request 可以结束客户端的连接,但是php执行继续执行。意思是程序执行到 fastcgi_finish_request 后,缓冲区的内容发给客户端,然后结束和客户端的连接。但是程序将继续执行,之后的输出将不会发送给客户端。

wordpress 中的 wp-cron.php 中的代码

ignore_user_abort( true );
/* add code 1 */
echo "runing...";

/* Don't make the request block till we finish, if possible. */
if ( function_exists( 'fastcgi_finish_request' ) && version_compare( phpversion(), '7.0.16', '>=' ) ) {
    if ( ! headers_sent() ) {
        header( 'Expires: Wed, 11 Jan 1984 05:00:00 GMT' );
        header( 'Cache-Control: no-cache, must-revalidate, max-age=0' );
    }

    fastcgi_finish_request();
}


/* add code 3 */
echo "runing 2...";

/* add code 3 */
file_put_contents(__DIR__ . '/xx.txt', date("Y-m-d"));

if ( ! empty( $_POST ) || defined( 'DOING_AJAX' ) || defined( 'DOING_CRON' ) ) {
    die();
}

可以看到 , 执行后 的结果。

  1. runing ... 可以输出
  2. 当前文件会生成 xx.txt 文件
  3. runing 2 ... 不会被输出

这个有什么用

可以提高网站的相应速度,比如网站有个需求,用户提交信息后,你需要发送一份邮件。就完全可以把发送邮件这部分代码放到 fastcgi_finish_request 以后,因为发送邮件还是一个比较耗时的任务。