phpsocket.io连接量过大,连接阻塞,部分连接失败

tomlibao

之前连接量出现过6000-7000,我通过更改php.ini 的memory_limit 从 128m 改为 521m 解决了连接阻塞的问题。

但是现在连接量又升了一个等级,ESTABLISHED状态下的连接成功的数量就有 9k-1w,导致现在连接阻塞,部分客户端连接失败。

phpsocket.io 是单进程的,不知道该从哪方面入手让连接不阻塞。。。求老师指点!

ps:

1、已优化过Linux内核以及最大连接量。
2、已安装event扩展。
3、已将php.ini 的memory_limit 从 521m 改为 1024m。
4、服务器具体配置不知道,运维负责,但是不会差。

1544 1 0
1个回答

walkor

phpsocket.io 且是单进程的,只能利用一个cpu,并且内部机制比较复杂,1w在线估计已经占满一个cpu了,很难再优化了。

  • tomlibao 2022-02-11

    那能不能通过别的方式来提升这个连接量呢,比如和原生Workman结合起来,比如建两个相同的服务(两个连接地址)之间进行通讯等等?

  • walkor 2022-02-11

    参考这里开启多个实例试下。
    https://github.com/walkor/phpsocket.io/issues/77

    注意,多个实例所属不同的进程,进程间的变量不是共享的,所以多实例时业务不能依赖全局数组。

  • tomlibao 2022-02-17

    老大,您发我的这个亲测可行,已经上线运行了,已经分担了单进程单实例的一些压力。我在问一个这个问题之外的,我能在增加一个服务吗,比如我用gatewayworker开启一个ws服务,ws服务能否和phpsocket.io之间进行通讯?

  • walkor 2022-02-17

    可以,用 channel 组件
    gatewayWorker里在 Events的onWorkerStart里建立channel连接。
    phpsocket.io 在 $io->on('workerStart', function()use($io) {} 里建立channel连接。

  • tomlibao 2022-02-17

    但是我用socket.io 推送消息是$io->to()->emit,我用gatewayworker推送消息是Gateway::sendToClient,他们方法不同,一个需要clientid 一个需要socket->id 中间推送消息怎么办?

  • walkor 2022-02-17

    这个要自己想办法

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