簡體   English   中英

PHP SESSION在websocket服務器中不起作用

[英]PHP SESSION not working in websocket server

我有一個用於實時聊天應用程序的簡單PHP Websocket。 我使用apache服務器以及websocket服務器。

當用戶名成功登錄后,我在login.php中使用值username設置SESSION。

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

我必須通過php server.php啟動websocket服務器。

因此,即使我開始會話,我也無法獲得$ _SESSION [“ user”]的值。 我作為未定義索引用戶給出了錯誤。

PHP文檔上的某人瘋狂地嘗試了此操作(我的回答是基於該人的)

但基本上,您要在當前的基於Web的命令行之間切換,就需要從Web上獲取當前的會話ID,並將其重新設置為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/zh/function.session-start.php#53293

但是,可以啟動與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
}

要么

您可以從此處逐步查看示例。

會話ID在cookie中可用,通常稱為PHPSESSID (取決於session.name php.ini設置),並且可以在執行期間使用session_name()進行檢查和更改。

用戶連接時,HTTP頭(包括cookie)可用於WebSocket服務器。 負責任的WS服務器存儲這些標頭,並通過用戶對象(或連接對象,或任何存儲的對象)將其提供給應用程序,並唯一標識用於將消息發送回連接的客戶端的資源。

另外,請注意,PHP會話系統在打開時會鎖定用戶的會話。 因為WebSocket服務器被設計為可以連續運行,所以它們永遠不會自行解鎖會話。

因此,如果在WS中打開用戶會話,則每個單個AJAX和正常的Web請求都將超時。 該用戶將完全無法使用您的網站。

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

因此,如果您打開會話,則必須使用session_write_close()盡快關閉該會話。

有關在WebSocket服務器中會話的特定實現的信息,請參見前面的問題和答案,以作為在實現中尋找內容的示例。 (注意:有些人可能會傾向於將此問題重復。盡管我希望這兩個問題都保持活躍,但我認為在任何情況下,該問題都應該放在這個問題上,因為它比較籠統(不涵蓋一台特定的WS服務器),由於該WS服務器的積極開發,最后一個問題中的建議很快就會過時。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM