2015-07-21 372 views
0

我有一個簡單的PHP websocket實時聊天應用程序。我使用Apache服務器以及websocket服務器。PHP SESSION不工作在websocket服務器

當用戶名登錄成功,我的login.php

@session_start(); 
$_SESSION["user"] = $username; 

設置會話與價值的用戶名下面我有PHP server.php啓動的WebSocket服務器。

因此我無法獲得$ _SESSION [「user」]的價值甚至我開始會話。 我給出的錯誤爲未定義的索引用戶

+0

您是否有session_start();在server.php? – Tobias

+0

http://stackoverflow.com/questions/23230830/how-to-pass-session-variables-to-a-websocket-server –

+0

是的,我開始session_start()開始會議; – tashi

回答

0

有人PHP文檔上是夠瘋狂嘗試這種(我的回答是從人爲主)

但基本上爲您提供了對命令行您當前的網絡之間進行切換,你需要抓住當前會話身份證從網絡,並將其設置回cli。

Write_session.php

<?php 

session_start(); 
$_SESSION['test']='test'; 

print_r($_SESSION); 

echo session_id(); 

?> 

輸出write_session.php

gqptpc3scf4k0h3vpl2d341u13 

Read_session.php(你需要找到一個安全的方式發送會話ID超過我想)

<?php 

$ssid = "gqptpc3scf4k0h3vpl2d341u13"; 

session_id ($ssid); 
session_start(); 

print_r($_SESSION); 

?> 

參考:http://php.net/manual/en/function.session-start.php#53293

+0

我仍然無法在server.php中獲得SESSION。我在login.php中設置了SESSION [「用戶名」] COOKIE。它的空白數組。其他解決方案? – tashi

0

但是,可以啓動與Apache服務器的會話,然後訪問websocket代碼中的會話cookie。

Apache服務器的文件啓動會話。每次向websocket服務器發送新消息時都可以發送會話ID,並且您可以使用會話ID輕鬆檢查會話。

看看這個:

session_id("your session_id");  
session_start(); 
if(isset($_SESSION["SESSION_NAME"])){ 
    //keep connected and process request 
} 
else{ 
    //disconnect 
} 

OR

您可以從here檢查一步一步的例子。

0

會話ID是可用在cookie中,通常命名爲PHPSESSID(依賴於session.name php.ini的設置,並且可以在執行過程中與session_name()進行檢查和修改。

HTTP頭,包括餅乾,可用當用戶連接到WebSocket服務器時,負責的WS服務器應該存儲這些頭並通過用戶對象(或連接對象或任何對象存儲並唯一標識要通過其發送的資源消息返回到連接的客戶端)

另外,請注意,PHP會話系統在用戶會話打開時會鎖定它。由於WebSocket服務器設計爲連續運行,因此它們永遠不會自行解鎖會話。

因此,如果用戶的會話在WS中打開,那麼每個AJAX和正常的Web請求都會超時。該用戶根本無法使用您的網站。

此外,一次只能在腳本中打開一個會話。如果第二個用戶連接到WS服務器,則該用戶將有權訪問第一個用戶的所有會話信息,並且不訪問他們自己的會話。 (有點大,巨大的安全漏洞。)

因此,如果您打開一個會話,您必須必須儘快使用session_write_close()關閉會議。

請參閱this previous question並回答WebSocket服務器中會話的具體實現,作爲在您的實現中尋找什麼的示例。 (注意:有些人可能會試圖將這個問題稱爲重複的問題,但我希望這兩個問題都能保持活躍,我認爲,這裏的這個問題應該是支持的問題,因爲它更一般化(不覆蓋了一個特定的WS服務器),並且由於該WS服務器的積極開發,最後一個問題中給出的建議將很快過時。)

+0

Web套接字需要更多的工作。所有這些看起來真的很詭異,也許一個來自Apache的專門的網絡套接字服務器會做到這一點。 –

+0

@Alex_Nabu:Apache的Web服務器將是錯誤的選擇,因爲HTTP流量和WebSocket流量是這樣一種不同的範例。用與應用程序相同語言編寫的WebSocket服務器確實是最好的選擇,尤其是因爲沒有辦法將類CGI接口放入WS連接(這是Web服務器如何處理向PHP發送Web請求的請求)。 - 瑕疵和黑客都完全放在PHP的肩膀上,但任何語言都會有自己的問題,除非像WS這樣的東西被明確地設計到語言中。 – Ghedipunk

+0

我只是在思考更多的標準化問題。使網絡發展成爲最大的開發者社區的一件事情是,有一種事實上的標準方式來完成一切。 Websockets有點改變。 TBH甚至沒有任何理由使用PHP,現在考慮到你可以用任何你想要的語言來做一個套接字服務器。我得到的是應該有一些流行的實現,有點標準化我們在處理Web套接字時如何做事。一些流行的lib使得像php這樣的東西變得很好很簡單,而在apache/nginx ect –

相關問題