// 全局数组保存uid在线数据
$uidConnectionMap = array();
$live_agent_arr=array(); //自定义了个函数,在 $socket->on( 'login', function ( $uid )use( $socket ) 引用是null的,不解
echo "is_arraya-".is_array($live_agent_arr)." is_nulla-".is_null($live_agent_arr)." is_stringa-".is_string($live_agent_arr)."\n\n";
// PHPSocketIO服务
$sender_io = new SocketIO( 2120 );
// 客户端发起连接事件时,设置连接socket的各种事件回调
$sender_io->on( 'connection', function ( $socket ) {
// 当客户端发来登录事件时触发
$socket->on( 'login', function ( $uid )use( $socket ) {
global $uidConnectionMap,$last_online_count,$last_online_page_count,$live_agent_arr;
// 已经登录过了
if ( isset( $socket->uid ) ) {
return;
}
// 更新对应uid的在线数据
$uid = ( string )$uid;
if ( !isset( $uidConnectionMap ) ) {
$uidConnectionMap = 0;
}
echo "is_arrayb-".is_array($uidConnectionMap)." is_nullb-".is_null($uidConnectionMap)." is_stringb-".is_string($uidConnectionMap)."\n\n"; //执行结果 is_array($uidConnectionMap) 可以 true
echo "is_array-".is_array($live_agent_arr)." is_null-".is_null($live_agent_arr)." is_string-".is_string($live_agent_arr)."\n\n"; //执行结果 is_array($live_agent_arr) 是flase, is_null($live_agent_arr)=true
// 这个uid有++$uidConnectionMap个socket连接
++$uidConnectionMap;
if(isset($live_agent_arr)){
array_push( $live_agent_arr, array( "exten" => $uid, "channel" => "" ) );
}
// 将这个连接加入到uid分组,方便针对uid推送数据
$socket->join( $uid );
$socket->uid = $uid;
} );
} );
执行结果如下:
我十分不理解的是,为何 我自己定义的$live_agent_arr 在 function ($uid) use($socket) 是 null, 而例子里自带的$uidConntionMap可以正常使用? 我该怎么样使用自己定义的array?请各位大神不吝赐教,小白跪谢!!!
workerman本身并没有改变php的任何特性或者语法。
如果$uidConnectionMap 和 $live_agent_arr 如果是在函数里定义的,根据php的机制,2个默认不是全局数组。
你可以用 global关键字来声明他们。
global $uidConnectionMap = array();
global $live_agent_arr = array();
感谢大神回复!
额 ,我最终还是没搞定, global $live_agent_arr = array(); 我用这种写法获取全局得到的是null , 用例子里自带的 $uidConnectionMap 是可以获取到值的,没搞清楚是为什么, 就是很不理解为何我自己写的 $live_agent_arr 获取不到. 最终改用了 http://doc.workerman.net/components/global-data-server.html