业务要求为防止主进程阻塞,将异步连接独立出另一个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”
问题可能表述不清,现在论坛请大神指导一下方案或者程序逻辑是否存在问题,在此感谢~
目前引入了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发送消息
相关代码:
所有的外部存储比如mysql、redis、包括GlobalData 都存储不了资源类型的数据(比如数据库连接、socket连接,打开文件的指针等等)。AsyncTcpConnection里面包含了socket资源,所以无法存储。
好吧,明白了,谢谢大佬的回复