问下laravel,对于耗时的操作,除了队列执行还有什么其他方式吗?
情况是我这边有个违禁词检查功能,这功能耗时挺长的,所以我希望能放到后台执行,这样用户发帖之后,能返回审核中的结果,而不是要等违禁词检查完之后才返回结果
我查了下队列可以做到,但是队列需要 php artisan queue:listen 一直执行,这东西会断掉,还要守护进程什么的,太麻烦想问下有其他方式吗?
与laravel甚至与语言无关。
单纯耗时长的,那必然只能异步操作。
你自己说了
这功能耗时挺长的,所以我希望能放到后台执行
,这句话意思本身就是要用队列
。laravel的队列只需要 依赖supervisor,由supervisor负责监控进程,进程挂掉自动再启起来。
supervisor本身的保活由systemd来控制,systemd为内核进程不可能挂,他挂了就是系统整个已经崩了。
---另---
生产环境用
queue:work
不要用listen
,弊端就是修改代码后需要通过supervisor重启或者执行php artisan queue:restart
来重启。queue:listen
另外一个问题是,会导致频繁的进程启动、挂起、结束。会导致CPU飙高。queue:restart
命令的原理是通过缓存写入一个时间戳,因此,如果多台服务器同时跑队列,必须一定要用redis等类似的服务来集中存放缓存数据,否则queue:restart
在哪台服务器上执行,只有这台服务器的队列才能重启。