當然,第一種選擇是AJAX請求。 AJAX不存在無法快速輕鬆訪問WebSockets所具有的會話的問題。任何足夠頻繁的採樣率與實時無法區分。現在
,我在WebSockets的實施而冗長的解決方案:
HTTP頭握手期間可用於WebSocket的服務器,包括餅乾。在您使用的服務器中,PHP-Websockets的標題存儲在$headers
屬性中。
例如:從
session_start();
$_SESSION['Hi!'] = array('Hello!', 'where' => 'world!');
setcookie('MyCookie', 'My Value;[email protected]#$%', 0, '/', '127.0.0.1', false, true);
setcookie('MyNonhttponlyCookie', 'My Value', 0, '/', '127.0.0.1', false, false);
因此產生
var_dump($user->headers);
array(14) {
["get"]=>
string(8) "/echobot"
["host"]=>
string(14) "127.0.0.1:9000"
...snip...
["cookie"]=>
string(100) "PHPSESSID=jan9uknpc06mk4ddghph4870t1; MyCookie=My+Value%21%40%23%24%25; MyNonhttponlyCookie=My+Value"
}
這些cookie,的$user->headers['cookie']
值是分號和空間(;
)分隔的關鍵值對,其中的值的集合是URL編碼,並用等號分隔。 (PHP抱怨,如果你把保留字符的cookie名稱,因此該cookie鍵不能包含任何的URL編碼值。)
一個快速的方法來提取這些都是如下
$cookies = array();
$cookiesParts = explode('; ', $user->headers['cookie']);
foreach ($cookiesParts as $cookieParts) {
$interimCookie = explode('=', $cookieParts);
$cookies[$interimCookie[0]] = urldecode($interimCookie[1]);
}
var_dump($cookies);
array(3) {
["PHPSESSID"]=>
string(26) "jan9uknpc06mk4ddghph4870t1"
["MyCookie"]=>
string(14) "My Value;[email protected]#$%"
["MyNonhttponlyCookie"]=>
string(8) "My Value"
}
我們現在有會話ID。仔細檢查session_name()
,它會給你實際上保存會話ID的cookie的關鍵字。
我們可以序列化和反序列化存儲在服務器中的會話文件,指向session_save_path()
......但我想作弊。
由於內置會話系統會鎖定會話文件,因此我們不能只保留會話文件並持續監視更改,也不能長時間鎖定文件。
這將是理想的,如果我們能在這裏使用的__get()
和__set()
魔術方法以同樣的方式,我們會使用超全局$_SESSION
(如$myUser->_session['key'] = 'value';
),但PHP不允許處理這些方法爲數組。相反,我們必須設定一個更普通的命名方法。
<?php
class MyUser extends WebSocketUser {
public $session_id; // gets set somewhere. Good place is probably is your implementation of the `connected($user)` abstract method.
public getSession($key) {
session_id($this->session_id);
session_start();
$val = $_SESSION[$key];
session_write_close(); // very important!
return $val;
}
public setSession($key, $value) {
session_id($this->session_id);
session_start();
$_SESSION[$key] = value;
session_write_close(); // still very important!
}
}
(注:我還指着這個問題我feature request,立足我最終實施的cookie解析和會話處理這裏,讓我能記得我的研究,今晚我的工作)
在握手期間,HTTP頭文件(包括cookie)可供WS服務器使用。在那個特定的服務器中,頭文件在屬性'$ headers'下的用戶類中作爲數組實現。稍後我會添加一個完整的答案(並添加一個功能請求來解析cookie),但這應該有助於您朝着正確的方向前進。 – Ghedipunk