workerman/redis-queue 运行一段时间后出现busy

laowang

截图
使用strace -ttp 16178
截图
kill -SIGALRM 16178
截图

911 1 0
1个回答

walkor

看起来是业务自己创建了子进程,并调用pcntl_wait 等待子进程退出。看下业务或者业务使用的库是否有调用pcntl_fork、 pcntl_wait

  • laowang 2022-06-01

    额 没有呢 业务里面有curl 请求 和 exec 的执行

  • walkor 2022-06-01

    那应该是 exec 执行的是慢任务导致的

  • laowang 2022-06-01

    额 慢任务会导致这个么 有没有什么处理办法 或者设置超时时间让他直接放弃这个任务

  • walkor 2022-06-01

    如果你确定exec是慢任务,可以不用管它。busy状态表明当前进程在忙于业务,并不一定产生了问题。exec函数不支持超时,即使你设置了超时参数比如2秒,status状态还是busy。

  • laowang 2022-06-01

    现在是这样,过一段时间进程会一个一个挂掉,然后会报错连接不上redis 5秒。我restart -d 以后恢复正常

  • walkor 2022-06-01

    你用 proc_open 代替exec吧,proc_open用法看下php手册。每次执行的时候设定一个定时器,比如2秒后关闭proc_open打开的进程。
    伪代码类似

    $r = proc_open();
    Timer::add(2, function() use ($r) {
        proc_close($r);
    });
  • laowang 2022-06-01

    好的 我尝试下

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