私はこれでクライアントへの接続を早期に閉じています:
static public function early_close( $output )
{
ignore_user_abort(true);
echo $output;
// Disable gzip compression in apache, as it can result in this request being buffered until it is complete,
// regardless of other settings.
if (function_exists('apache_setenv')) {
apache_setenv('no-gzip', 1);
}
// get the size of the output
$size = ob_get_length();
// send headers to tell the browser to close the connection
header("Content-Length: $size");
header('Connection: close');
header("Content-Encoding: none"); // To disable Apache compressing anything
// IF PHP-FM
// fastcgi_finish_request();
// flush all output
if( ob_get_level() > 0 )
{
ob_end_flush();
ob_get_level()? ob_flush():null;
flush();
}
// if you're using sessions, this prevents subsequent requests
// from hanging while the background process executes
if( session_id() )
{
session_write_close();
}
}
正常に動作しますが、このイベントの後、一部のスクリプトが何かを出力した場合 (エコーするか、新しいヘッダーを追加することにより)、スクリプトはその時点から実行を停止します。
早期終了後に出力バッファリングを開始してから破棄しようとしましたが、機能しません:
Server::early_close();
ob_start();
heavy_work();
ob_clean();
何か案は?
PHP 5.3.x の使用