【问题标题】:How do i refresh the session in comet?如何刷新彗星中的会话?
【发布时间】:2011-07-30 01:22:21
【问题描述】:

我想在我的页面上有一个类似彗星的 iframe,但是当会话更改 iframe 中的信息时 not 并且我在 iframe 中转储了 $_SESSION 变量和它没有改变。

我的问题是,当客户端$_SESSION 发生变化时,如何更新comet iframe 中的$_SESSION 变量?

非常感谢^_^

用代码更新:

客户:

<?php
    session_start();
    if(!isset($_SESSION['count'])) $_SESSION['count'] = 0;
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Test Comet</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <script type='text/javascript' src='../js/jquery.js'></script>
    <script type="text/javascript">
        function test_function(msg){

            $('p').html(msg)

        }

        $('div').click(clickMe);

        function clickMe(event){
            $.ajax({
                url: 'addSess.php'
            })
        }
    </script>
  </head>
  <body>
      <p>This is a test</p>
      <div>click me</div>
    <iframe src="output.php" width="0" height="0" style="display: none;"></iframe>
  </body>
</html>

彗星 iframe (output.php):

<?php
session_start();
ob_start();
echo 'hello';
flush_buffers();
while(true){

    echo "<script>window.parent.test_function('".time().' session: '.$_SESSION['count']."');</script>";

    flush_buffers();

    sleep(1);


}

function flush_buffers(){
    ob_end_flush();
    ob_flush();
    flush();
    ob_start();
}
?>

addSess.php:

<?php
session_start();

if(!isset($_SESSION['count'])) $_SESSION['count'] = 0;
$_SESSION['count']++;


echo $_SESSION['count'];
?>

我注意到的另一件事是它冻结了浏览器无法访问我的网站,一旦我关闭客户端,其他所有内容都会加载

【问题讨论】:

    标签: php jquery session comet


    【解决方案1】:

    只要您对$_SESSION 进行更改,所有重新加载到执行var_dump($_SESSION); 的iframe 都应该看到新会话。你正确使用session_start()吗?

    请更新一些代码,我们会看看如何提供帮助。

    更新

    首先,您的 comet 页面需要 set_time_limit(0);,因此它可以无限期运行(连接仍然会被切断,您需要做一些事情来重新启动 comet 连接)

    其次,输出缓冲可能会给你带来错误,PHP 在这个意义上是不稳定的,因此我的本地测试不适用于你的代码。如果我添加该行:

    <iframe src="output.php" width="0" height="0" style="display: none;" onload="alert('Iframe Loaded');"></iframe>
    

    我在更新主页的同时收到警报,这意味着刷新缓冲区未能真正刷新缓冲区。当我得到代码在这里工作时,我会回来。

    更新2

    叹息。简单...

    $('div').click(clickMe);
    

    需要在 HTML DOM 加载后调用。试试:

    $(function(){
        $('div').click(clickMe);
    });
    

    您还应该考虑将您的彗星代码更改为:

    <?php
    session_start();
    ob_implicit_flush(true);
    ob_end_flush();
    echo 'hello';
    while(true){
        echo "<script>window.parent.test_function('".time().' session: '.$_SESSION['count']."');</script>";
        sleep(1);
    }
    ?> 
    

    通过ob_implicit_flush,您不需要经常调用flush_buffers。您还需要 ob_end_flush 来取消输出缓冲。

    您还应该注意session_destroy 是必需的。否则,您的站点会等待 comet 会话关闭,然后才能开始新会话。

    session_start() 的实际工作方式是等待会话可用。这意味着您需要使用session_id 为您的彗星生成不同的会话或使用文件...或采用其他一些技术。

    【讨论】:

    • 嗯,有几件事是错误的:-?更新*我的帖子。
    • @Khez。问题是我在客户端看到 time() 更新,但不是会话。它会减慢我网站上的任何其他负载
    • @Khez,你的第二次更新仍然不起作用,是的,它现在注册了点击,但会话显示编号没有改变,我仍然遇到其他页面加载的问题
    • 这是由于 session_start() 的工作方式。检查我更新的帖子。您不能有 2 个页面具有相同的 session_id 调用 session_start();您在网络服务器上有 2 个不同的选项卡,一个必须完成,另一个才能启动。
    • @Khez 你能告诉我如何在我的实现中使用 session_destoy 和 session_id 吗?
    猜你喜欢
    • 1970-01-01
    • 2016-07-23
    • 2011-12-28
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 2010-11-24
    相关资源
    最近更新 更多