PHP 长轮询脚本未结束

问题描述

我已经广泛搜索一个可行的答案,尽管关于这个问题的问题不乏问题,但还没有找到。

我有一个 PHP 脚本,它检查数据库是否有由 setTimeout 的 ajax 调用发起的更新。该页面就像一个游戏大厅,用户可以在其中创建、加入或离开游戏。当他们这样做时,侦听 ajax 函数在更新发生时中止,然后立即恢复。当我以单独用户的身份对其进行测试时,这非常有效,没有延迟或延迟,但是一旦另一个用户页面上,PHP 脚本似乎挂断并且不想退出循环,前面没有任何事情发生直到超时。

添加了 session_write_close、ob_flush 和flush(),在有和没有 session_start 的情况下都尝试过,但都无济于事。我确信 websockets 更适合,但它们目前不是一种选择。

AJAX

var hear,checking;
function listen(){
    hear = $.ajax({
             url: "check.PHP?last=0",success: function(data){
                 //do some stuff
                 checking = setTimeout({listen()},3000);
             }
    })
}
             //Now WHEN USER CLICKS JOIN FOR EXAMPLE-
clearTimeout(checking);
hear.abort();
              //Perform a different ajax call to update db,then resume listen()

CHECK.PHP

require_once("../abc/connection.PHP");  // connect to db

//*******START OF VARIoUS TRIED SETTINGS
session_start();
$id = $_SESSION['id'];
session_write_close();
ignore_user_abort(1);      
set_time_limit(40); 
ini_set('zlib.output_compression',0); 
ini_set('implicit_flush',1); 
//*********END OF VARIoUS TRIED SETTINGS

$last = isset($_GET['last']) ? MysqLi_real_escape_string($_GET['last']) : 0 ;
$true = 0;
while($true < 10){
    $true++;
    $str = " ";  //tried this line and below to help force script ackNowledgement of ajax abortion
    echo $str;
    if(connection_status() != CONNECTION_norMAL){
        echo str_repeat($str,1024);      // In case of minimum output requirement 1KB
        ob_flush();
        flush();
        break;
    }
    $sql = MysqLi_query($con,"SELECT * FROM games WHERE id > $last");
    if(MysqLi_num_rows($sql) > 0){
        echo "Change detected";
        break;
    }else{
        MysqLi_free_result($sql);
        sleep(3);
    }
}

此时我几乎准备恢复到每 3 秒进行一次 ajax 调用。非常感谢任何帮助。谢谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)