问题是这样的。
连接形式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,那么其他客户端都同步更新??
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被赋值后可以随时使用,也可以被多个客户端共享使用。
明白了。那完全可以用它实现共享数据。而且存储临时数据,应该没有上限吧,哈哈。几万人,每个人几KB的数据,甚至是图片。性能应该比redis还好才对。@