laravel队列出现Failed to open stream: Too many open files

Song5 次浏览0个评论2025年12月26日

在Laravel运行队列的过程中出现了Failed to open stream: Too many open files,但是正常的Web服务又没有问题,那么大概率是因为队列出现异常导致的。

一、解决办法

我们可以通过

ulimit -n

查看当前限制,如果当前限制过低可以改为65536即可。

ulimit -n 65536

但是如果是PHP则直接修改LimitNOFILE限制,但是这样一般解决不了问题;我们可以查看别的配置。

Laravel 官方已弃用 --daemon 模式,因为内存和资源泄漏无法避免。

我们队列的supervisor需要修改一下即可:

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/baidu/artisan queue:work --sleep=3 --tries=3
autostart=true
autorestart=true
user=www-data
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/baidu/storage/logs/worker.log
; 关键:让 worker 处理一定任务后退出,避免长期运行
stopwaitsecs=60

然后重启队列即可。

二、如何排查问题?

我们可以查看是什么原因占用了文件描述符,具体方法如下,如下方法查看全部占用,前面是数量后面是PID

lsof | awk '{print $2}' | sort | uniq -c | sort -nr | head -10

然后我们看到数量占用后即可查看什么软件占用,找到什么原因占用解决问题就方便了。

ps -p 1331 -o pid,ppid,cmd,user,%cpu,%mem,lstart

或者简单点:

ps -p 1331 -f


更多相关好文