这个问题,搜索一下,不知道有多少种回答,但是很多回答的都不准确,我测试总结一下
首先是都认可的要判断connection_status()或connection_aborted(),但是这两个状态的值,必须是向前端发送数据后,才能获得,即无法被动获得,只能主动获得
因此判断客户端是否中断的方法也就只能是,后端向前端发送数据后,判断connection_status()或connection_aborted()的返回值
<?php
ignore_user_abort(true); //如果不忽略,那当下面的flush执行后,程序立即退出
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
ob_flush();
flush();
//控制浏览器前端不要缓存结果,每次都要重新查询
$maxvid = $_GET["maxvid"];
error_log(date("[Y-m-d H:i:s]")." > "."maxvid: ".$maxvid."\n", 3 , "/usr/local/apache2219/logs/php_log");
$gmworker = new GearmanWorker();
$gmworker->setTimeout(60000);
$gmworker->addServer();
$gmworker->addFunction("getmsg", "getmsg");
if ( ($gmworker->work()) && ($gmworker->returnCode() == GEARMAN_SUCCESS) )
{
echo $msg;
ob_flush(); //必须有,不然是在PHP_BUFFER不会被发送到客户端,也检查不出是否中断
flush(); //必须设置ignore_user_abort(true),不然程序直接退出了,无法再判断连接状态
if ( connection_status() ) {
error_log(date("[Y-m-d H:i:s]")." < ".$msg.",but connection aborted!\n", 3 , "/usr/local/apache2219/logs/php_log");
} else {
error_log(date("[Y-m-d H:i:s]")." < ".$msg."\n", 3 , "/usr/local/apache2219/logs/php_log");
}
}
function getmsg($job)
{
global $msg;
$msg = $job->workload();
$result = "OK";
return $result;
}
?>