Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP会话的AJAX长轮询_Php_Jquery_Ajax_Session - Fatal编程技术网

使用PHP会话的AJAX长轮询

使用PHP会话的AJAX长轮询,php,jquery,ajax,session,Php,Jquery,Ajax,Session,我有以下资料: 脚本: function poll(){ $.ajax({ ... url: poll.php, success: function(res){ $('#count').html(res); poll(); } }); } poll(); poll.php: session_start(); $count = $_SESSION['count']; s

我有以下资料:

脚本:

function poll(){
    $.ajax({
        ...
        url: poll.php,
        success: function(res){
            $('#count').html(res);
            poll();
        }
    });
}
poll();
poll.php:

session_start();
$count = $_SESSION['count'];
session_write_close();
while(true){
    $newcount = $_SESSION['count'];
    if($newcount != $count){
        $count = $newcount;
        break;
    }
    sleep(1);
}
echo $count;
在我的php中,当
$\u会话['count']
发生更改时,它会中断
while循环,然后更新DOM元素
“\count
,然后再次轮询更改。但我的问题是,当我试图从另一个实例更改
$\u会话['count']
时,运行
轮询的实例一直在等待请求完成。这意味着在我的
poll.php
中,即使我从另一个实例更改了
$\u会话['count']
,它也不会中断
while循环


这里有什么问题?

在您完成
会话\u write\u close()
后,会话将关闭。这意味着进一步的更改不会反映在
$\u会话中

您需要重新打开会话才能从中读取:

session_start();
$count = $_SESSION['count'];
session_write_close();
while(true){
    session_start();
    $newcount = $_SESSION['count'];
    session_write_close();

    if($newcount != $count){
        $count = $newcount;
        break;
    }
    sleep(1);
}
echo $count;
然而,请注意,在Web服务器上运行这样的无限循环通常不是一个好主意。您可以很容易地让自己面临拒绝服务攻击:在无限循环中运行的每个php会话都在消耗内存和与web服务器的开放连接,因此您很快就会发现web服务器无法响应请求,因为它的所有工作人员都在无限循环中旋转


如果您确实需要在PHP中执行此操作,我强烈建议工作人员在一段时间后自动退出。更好的做法是使用专门用于长轮询的其他技术(例如,node.js WebSockets服务器)。

您在哪里更改会话['count']
?(它不在您粘贴的代码中。)@jb我只是使用
session_start()执行一个php
$\u会话['count']=anynum