$_SESSION不能保存对象?

kevin

public static OnConnect($client_id)
{
$app = new App($client_id, $ip);
$_SESSION = $app;
}

会发现App的destruct函数被调用了,也就是说$_SESSION = $app;的时候,对象销毁了一次。
请问这是怎么回事。

谢谢

阅读 1952
2个回答

walkor

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对象没有任何引用了,就被回收了,所以就调用了析构函数。

  • 暂无评论
walkor

可以在全局保存一个数组,里面保存App对象,这样就不会被析构了。

public static OnConnect($client_id)
{
    global $app_array;
    $app = new App($client_id, $ip);
    $app_array = $app;
}

但是要注意在onClose时删除这个app对象,不然随着客户端不断的连接,$app_array会越来越大,导致内存不断增长。

  • 暂无评论