2011-04-05 32 views
0

我想在我的頁面上有一個類似彗星的iframe,但是當會話更改iframe中的信息時而不是,並且我在iframe中做了$_SESSION變量的轉儲,並且沒有更改。我如何刷新彗星會議?

我的問題是,當客戶端$_SESSION更改時,如何更新彗星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']; 
?> 

也是另一件事我注意到的是它去我的網站,一旦你只要進行更改$_SESSION,所有重載凍結了瀏覽器,因爲我關閉客戶端,一切負載

回答

0

var_dump($_SESSION);應該看到新的會話的iframe。您是否正確使用session_start()

更新了一些代碼,請和我們會看到我們如何能幫助。

UPDATE

首先,你的彗星頁面需要set_time_limit(0);所以它運行無限期(連接仍然可以得到切斷,你需要做些什麼來重啓彗星連接)

二關,輸出緩衝可能會發生錯誤,PHP是靠不住在這個意義上,我的本地測試不與你的,因爲它的代碼工作。如果我添加一行:

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

我得到的警報,同時作爲更新的主網頁,這意味着刷新緩衝區沒有實際刷新緩衝區。我會在代碼在這裏工作時返回。

UPDATE2

嘆息。簡單...

$('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。否則,您的網站在啓動新會話之前等待彗星會話關閉。

session_start()的實際工作方式是否等待會話變爲可用。這意味着您需要使用session_id爲您的彗星或使用文件生成不同的會話...或使用其他技術。

+0

@Khez,我在底部添加了代碼和註釋 – Neal 2011-04-05 15:02:13

+0

那麼有幾件事情是錯誤的: - ?更新*我的帖子。 – Khez 2011-04-05 15:11:17

+0

@ khez,讓我知道它何時更新 – Neal 2011-04-05 15:13:26