GlobalData数据共享组件存储已连接的AsyncTcpConnection异步闭包对象

CNG

业务要求为防止主进程阻塞,将异步连接独立出另一个worker进程并使用GlobalData组件将异步连接对象存储起来,后续进行send操作指定指定该内存数据发送到该异步接口中;
但目前遇到了GlobalData组件无法存储的问题:
“Exception: Serialization of 'Closure' is not allowed in E:\phpStudy\PHPTutorial\WWW\engineeringSupervision\ProjectMaster\vendor\workerman\GlobalData\src\
Client.php:202”

问题可能表述不清,现在论坛请大神指导一下方案或者程序逻辑是否存在问题,在此感谢~

截图
截图

2387 2 0
2个回答

CNG

目前引入了https://opis.io/closure的 composer包对闭包函数进行序列化,解决了组件存储闭包函数的相关报错

安装序列化composer包

composer require opis/closure

序列化闭包函数,输出序列化后的字符串

$b = \Opis\Closure\serialize($a);
echo $b . PHP_EOL;

反序列化闭包函数,执行还原的闭包函数

$c = \Opis\Closure\unserialize($b);
$c();

但是还原的闭包函数依然无法对该保存的异步连接对象进行send发送消息
相关代码:
截图

  • 暂无评论
walkor 打赏

所有的外部存储比如mysql、redis、包括GlobalData 都存储不了资源类型的数据(比如数据库连接、socket连接,打开文件的指针等等)。AsyncTcpConnection里面包含了socket资源,所以无法存储。

  • CNG 2020-10-21

    好吧,明白了,谢谢大佬的回复

年代过于久远,无法发表回答
×
🔝