UDP模式,workerman自动拥有session_id唯一标识?

zzccomet

问题是这样的。
连接形式UDP
$http_worker = new Worker("udp://0.0.0.0:8282");
我在onmessage里做了一个
$_SESSION=$maxadd+1;
 
也就是,只要接收数据就+1.
客户端,我用PHP写的,在服务器上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
发现,session的maxadd都在其他浏览器的基础上+1了!!!!
 
难道wokerman的UDP模式下,不需要在session_start()之前设置session_id('name');  不需要设置这个ID吗?UDP自动是多客户端共享session内存地址吗?
也就是,其他客户端如果修改了$_SESSION,那么其他客户端都同步更新??

2788 2 0
2个回答

walkor

SESSION是基于http通讯协议实现的一种会话机制,一般在webserver才会实现它。
 
SESSION原理是在浏览器里记录个sessionid的cookie,每次浏览器请求web服务的时候在http头携带sessionid的cookie,服务器得到sessionid后在存储(默认是磁盘)中找对应session的数据,找到后把数据解析成数组赋值给$_SESSION变量,这样就能恢复这个请求之前的会话数据。会话结束后如果$_SESSION有变动就再存回磁盘,接着清理所有和本次请求有关的数据变量,包括$_SESSION变量,干干净净的等待处理下一个请求,下个请求又会去在http头里找对应的sessionid,然后读存储恢复$_SESSION。
 
由此看SESSION是否工作取决于是否是http通讯,服务端和客户端是否实现了SESSION机制。
 
你的是一个udp服务,根本没有http通讯,也不是基于webserver的http服务,所以SESSION是没有任何实现的。
抛开http协议和webserver,$_SESSION在php里就是一个全局变量,没有其它作用。workerman是常驻内存程序,在非http协议里$_SESSION被赋值后可以随时使用,也可以被多个客户端共享使用。
 

  • 暂无评论
zzccomet

明白了。那完全可以用它实现共享数据。而且存储临时数据,应该没有上限吧,哈哈。几万人,每个人几KB的数据,甚至是图片。性能应该比redis还好才对。@

  • 暂无评论
年代过于久远,无法发表回答
🔝