public static OnConnect($client_id) { $app = new App($client_id, $ip); $_SESSION = $app; }
会发现App的destruct函数被调用了,也就是说$_SESSION = $app;的时候,对象销毁了一次。 请问这是怎么回事。
谢谢
GatewayWorker手册中有讲解session,包括原理。 http://www.workerman.net/gatewaydoc/gateway-worker-development/session.html
Gateway/Worker模型中,每个客户端的session数据是存储在Gateway进程内存中的,每次Gateway进程转发消息给BusibuessWorker进程时,都会顺便携带上对应客户端的session数据给BusibuessWorker进程,这时BusibuessWorker进程把session数据赋值给$_SESSION变量,Event.php中就能使用$_SESSION了。因为有个赋值覆盖的过程,所以之前$_SESSION保存的App对象被覆盖了,App对象没有任何引用了,就被回收了,所以就调用了析构函数。
可以在全局保存一个数组,里面保存App对象,这样就不会被析构了。
public static OnConnect($client_id) { global $app_array; $app = new App($client_id, $ip); $app_array = $app; }
但是要注意在onClose时删除这个app对象,不然随着客户端不断的连接,$app_array会越来越大,导致内存不断增长。
GatewayWorker手册中有讲解session,包括原理。
http://www.workerman.net/gatewaydoc/gateway-worker-development/session.html
Gateway/Worker模型中,每个客户端的session数据是存储在Gateway进程内存中的,每次Gateway进程转发消息给BusibuessWorker进程时,都会顺便携带上对应客户端的session数据给BusibuessWorker进程,这时BusibuessWorker进程把session数据赋值给$_SESSION变量,Event.php中就能使用$_SESSION了。因为有个赋值覆盖的过程,所以之前$_SESSION保存的App对象被覆盖了,App对象没有任何引用了,就被回收了,所以就调用了析构函数。
可以在全局保存一个数组,里面保存App对象,这样就不会被析构了。
但是要注意在onClose时删除这个app对象,不然随着客户端不断的连接,$app_array会越来越大,导致内存不断增长。