2013-07-12 12 views
2

我正在開發一個用於製作1v1聊天系統的小項目。我想在一個項目上工作,我可以很好地使用Server-Sent Events。它工作得很好,但最近我一直在對代碼進行一些更改,以便通常聊天會更有效率。當服務器發送的事件正在運行時,不會加載帶有session_start()的頁面

當我運行事件源時遇到了一個奇怪的問題。當我嘗試去其他具有session_start()的PHP頁面時,它不會加載。

我的事件源腳本看起來是這樣的:

<?php 
    session_start(); 

    require "connect.php"; 
    require "user.php"; 

    header("Content-Type: text/event-stream\n\n"); 
    header('Cache-Control: no-cache'); 

    set_time_limit(1200); 

    $ms = 5000; 
    //SOME MORE VARIABLES HERE 

    while (1) { 
     echo "data: SSESSION " . $_SESSION["conversation" . $_GET["id"]]; 
     echo "\n\n"; 

      /*CHAT SCRIPT HERE*/ 

     ob_flush(); 
     flush(); 
     usleep($ms * 1000); 
    } 
?> 

什麼會議應返回行是對談話的數量。它的確如此。

如果我去test.php

<?php 
    session_start(); 
    echo $_SESSION["conversation121643"]; 
?> 

雖然Server-Sent Event運行時,該頁面只是繼續加載,直到我取消該事件。

我試過使用ob_flush函數,但是這並沒有解決任何問題。

我不知道爲什麼我有這個問題。我希望有一個解決辦法。

+0

嘗試刪除標題('Cache-Control:no-cache'); –

+0

@ EtienneLepage-Lepitre這似乎不能解決問題。 – Shawn31313

+0

當我從事件源腳本中提取:'session_start();'時它有效。但我需要它。 – Shawn31313

回答

1

PHP獨佔鎖定會話。一次只能有一個進程可以使用它。這通常是不明顯的,因爲PHP進程開始和結束的速度很快,但通過SSE,您可以保持會話永遠打開,所有其他PHP進程將等待SSE進程結束。您可以執行session_write_close()將會話釋放到其他進程。

相關問題