2013-01-02 29 views
10

我已經建立了一個服務器發送事件腳本與PHP和一個while循環,我不希望腳本不得不關閉,並必須repoll所以我把它放在一個while循環。如何在PHP中實現Server Sent Events?

問題在於腳本卡住了,我不得不放棄該路線,而是使用了node.js websocket後端。

我的問題是,如果我回到製作服務器發送事件的PHP腳本,我該如何實現它?
while循環似乎並沒有削減它,因爲它掛起腳本,如果它只是每秒連接和斷開連接,它與長輪詢沒有什麼不同,所以如何創建一個不會掛起的PHP腳本,同時通過SSE消息發送?

+0

你可以在循環中放一個'sleep()'來放鬆它。 – Musa

+0

@Musa我這樣做無濟於事。它仍然掛起。 – Neal

+0

是nohup的一個選項? –

回答

5

你似乎有問題的PHP輸出緩衝。嘗試添加這些行到您while循環結束:

ob_flush(); 
flush(); 

這應該禁止輸出緩衝。

編輯您也可以在一段時間後(即10分鐘)終止腳本以減少服務器負載。

我已經爲您創建了一個庫,可以非常輕鬆地完成它。檢查它here

第二編輯 您是否有逆向代理(例如nginx或varnish)?這可能是因爲代理嘗試緩存輸出的內容,但SSE腳本永遠不會結束,直到您停止它,因此整個事件都會掛起。捕獲輸出的其他東西可能會有類似的結果,例如mod_deflate。

第三編輯 如果您有反向代理,則可以嘗試關閉緩存以允許SSE工作。

PHP還有另一種方法禁用輸出緩衝。請看下面的代碼:

<?php 
for($i=0;$i<ob_get_level();$i++){ 
    ob_end_flush(); 
} 
@apache_setenv('no-gzip',1); 
@ini_set('implict_flush',1); 
ob_implict_flush(true); 
+1

這與我給類似問題的答案一致:http://stackoverflow.com/questions/7469396/how-to-implement-event-listening-in-php/8660897#8660897 – igorw

相關問題