問題是這樣的。
連接形式UDP
$http_worker = new Worker("udp://0.0.0.0:8282");
我在onmessage里做了一個
$_SESSION=$maxadd+1;
?
也就是,只要接收數(shù)據(jù)就+1.
客戶端,我用PHP寫的,在服務(wù)器上http://localhost/index.php
$socket = socket_create(AF_INET,SOCK_DGRAM,SOL_UDP);
socket_connect($socket,'127.0.0.1',8282);
socket_write($socket,1,1);
?
然后,我用不同的瀏覽器訪問這個http://localhost/index.php
發(fā)現(xiàn),session的maxadd都在其他瀏覽器的基礎(chǔ)上+1了!?。?!
?
難道wokerman的UDP模式下,不需要在session_start()之前設(shè)置session_id('name');? 不需要設(shè)置這個ID嗎?UDP自動是多客戶端共享session內(nèi)存地址嗎?
也就是,其他客戶端如果修改了$_SESSION,那么其他客戶端都同步更新??
SESSION是基于http通訊協(xié)議實(shí)現(xiàn)的一種會話機(jī)制,一般在webserver才會實(shí)現(xiàn)它。
?
SESSION原理是在瀏覽器里記錄個sessionid的cookie,每次瀏覽器請求web服務(wù)的時候在http頭攜帶sessionid的cookie,服務(wù)器得到sessionid后在存儲(默認(rèn)是磁盤)中找對應(yīng)session的數(shù)據(jù),找到后把數(shù)據(jù)解析成數(shù)組賦值給$_SESSION變量,這樣就能恢復(fù)這個請求之前的會話數(shù)據(jù)。會話結(jié)束后如果$_SESSION有變動就再存回磁盤,接著清理所有和本次請求有關(guān)的數(shù)據(jù)變量,包括$_SESSION變量,干干凈凈的等待處理下一個請求,下個請求又會去在http頭里找對應(yīng)的sessionid,然后讀存儲恢復(fù)$_SESSION。
?
由此看SESSION是否工作取決于是否是http通訊,服務(wù)端和客戶端是否實(shí)現(xiàn)了SESSION機(jī)制。
?
你的是一個udp服務(wù),根本沒有http通訊,也不是基于webserver的http服務(wù),所以SESSION是沒有任何實(shí)現(xiàn)的。
拋開http協(xié)議和webserver,$_SESSION在php里就是一個全局變量,沒有其它作用。workerman是常駐內(nèi)存程序,在非http協(xié)議里$_SESSION被賦值后可以隨時使用,也可以被多個客戶端共享使用。
?
明白了。那完全可以用它實(shí)現(xiàn)共享數(shù)據(jù)。而且存儲臨時數(shù)據(jù),應(yīng)該沒有上限吧,哈哈。幾萬人,每個人幾KB的數(shù)據(jù),甚至是圖片。性能應(yīng)該比redis還好才對。@