php slim检测客户端中止(HTTP)

时间:2015-10-21 10:02:32

标签: php http slim

在slim framework V3中,我如何检测客户端是否关闭了连接?

我试过了: ignore_user_abort(假); 并尝试在一个没有运气的循环中检查connection_status()和connection_aborted()。

php 5.6.12

2 个答案:

答案 0 :(得分:1)

它不是来自Slim,而是来自PHP。 PHP在执行脚本之后关闭连接。

如果要创建持久连接,则需要查看长轮询连接。

http://phptrends.com/dig_in/php-long-polling

答案 1 :(得分:0)

似乎需要从php输出一些内容然后调用ob_flush(),因为php只处理来自浏览器的错误。这是一种在不输出任何内容的情况下执行此操作的方法,适用于长轮询方案:

/* returns ESTABLISHED, CLOSE_WAIT, LAST_ACK, etc */
function getConnectionStatus() {

    $remote_ip = $_SERVER['REMOTE_ADDR']?:($_SERVER['HTTP_X_FORWARDED_FOR']?:$_SERVER['HTTP_CLIENT_IP']);
    $remote_port=$_SERVER['REMOTE_PORT'];

    $cmd="netstat -tn | fgrep ' $remote_ip:$remote_port '";

    $pfp=popen($cmd,"r");
    $buf = fgets($pfp, 1024);
    pclose($pfp);

    $buf=preg_replace('!\s+!', ' ', $buf); //remove multiple spaces
    $buf=trim($buf);

    $buf_r=explode(" ",$buf);

    if (count($buf_r)) {
        $state=$buf_r[count($buf_r)-1];
        return trim($state);
    }

    return "NOTFOUND";
}

按如下方式使用:

while(...) {
/* ... longpolling check code here ...*/

    if  (getConnectionStatus() != "ESTABLISHED") {
        break;
    }
}