SocketIO客户端给服务端传递参数这个on一直在执行中,客户端再次连接服务端的时候 客户端控制台一直显示pending,难道on一直在执行的时候,客户端不能在连接了吗?

maxiaoteng

客户端代码:

服务端代码:

控制台:

1041 6 0
6个回答

walkor

不能用sleep,sleep会让进程睡眠,睡眠的进程不执行任何代码,就无法处理连接。
如果你想定时emit,用定时器。

$timer_id = Workerman\Timer::add(3, function() use ($sender_io, &$timer_id) {
    static $count = 0;
    if ($count++ < 3000) {
        $sender_io->emit(...);
    } else {
        // 执行3000次后删除自己
        Workerman\Timer::del($timer_id);
    }
});
  • 暂无评论
maxiaoteng

感谢你的回答,真及时。
像你那样写个timer的话确实可以执行 并且可以一直往客户端推送数据,但是我想的是就像js那种click点击事件,然后一直给客户端推送数据可以吗?

  • walkor 2022-02-23

    如果你的运算逻辑一直执行,其它代码就无法执行,包括phpsocket.io接收连接也无法执行,所以就一直pending了。解决方法就是想办法不让你的业务逻辑长时间卡着整个进程的执行

  • maxiaoteng 2022-02-23

    好 谢谢您了

maxiaoteng

我试了一下这种方法不行,因为现在的业务是导入数据,就是从一个数据库里取出数据导入到另一个数据库,这个只能等导入完成,才能客户端和服务端连接成功不pending,有什么办法才能让它既正在导入也能客户端连接成功给客户端推送数据?

  • walkor 2022-02-23

    你可以把phpsocketio.io作为一个即时通讯的通道,只做通讯。业务逻辑交给其他架构或者进程去做。

    例如导入工作通过http请求发给传统http框架,http框架完成导入后调用phpsocket.io接口通知对应客户端。
    例如将耗时操作放到队列,队列完成后通过调用phpsocket.io接口通知对应客户端。
    例如将耗时操作交给其他进程去做,其他进程完成后通过调用phpsocket.io接口通知对应客户端。

    你可以看下这个例子,同样适用于phpsocket.io
    https://www.workerman.net/doc/workerman/faq/async-task.html

maxiaoteng

是按照你发给我的那个连接做的,现在是拆分成了两个,但是一个服务重启后另一个服务就暂停了,是这样拆分成两个服务吗?



maxiaoteng

但是一个服务重启后,另一个服务就暂停了

  • walkor 2022-02-23

    那你就2个一起吧,好管理

maxiaoteng

在同一个类里也不能同时启动,只能一个启动,!

  • walkor 2022-02-23

    之前不是启动2个了么,就用那个方法

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