我正在使用 Laravel 帆。我想使用主管和 cronjob。但我不明白如何用sail 配置这些东西。
我找不到任何关于如何做到这一点的例子。
我正在使用 Laravel 帆。我想使用主管和 cronjob。但我不明白如何用sail 配置这些东西。
我找不到任何关于如何做到这一点的例子。
因为sail 使用Ubuntu 容器,您可以按照以下说明操作:https ://serverspace.io/support/help/automate-tasks-with-cron-ubuntu-20-04/
通常它们存储在其中,/var/spool/cron/crontabs
因此您可能希望创建一个卷来持久保存它们(否则它们将在容器下次重新启动时被删除)。
docker-compose exec laravel.test bash
您可以使用I believe连接到您的容器。
Laravel Sail 被设计为一个开发环境,因此我相信 Laravel 故意省略了 cron 作业和队列工作人员的自动运行,以支持开发人员使用适当的工匠命令来控制运行它们。
要在 Sail 中使用 Laravel 调度器,你可以简单地运行:
sail artisan schedule:work
该命令将在前台运行并每分钟调用一次调度程序,直到您终止该命令。
同样,如果你想在 Sail 中运行 Queue worker,你可以运行以下命令:
sail artisan queue:work
在本地运行这些命令可以让开发人员完全控制,而不是让任务和队列在容器内自动运行。
我强烈建议您坚持手动运行这些命令,这样您的应用程序就不会意外触发队列中的一百万封电子邮件或运行其他意外的作业或任务!
如果你反对这个建议,你确实想让 Laravel 调度程序在 Sail docker 容器中自动运行,那么步骤将是这样的:
sail artisan sail:publish
RUN apt-get install -y cron
/etc/cron.d/laravel
RUN /usr/sbin/service cron start
sail build --no-cache
同样,在发布 Sail 资产后,您还可以使用 supervisord编辑提供supervisord.conf
的自动运行队列。
我用另一种方式解决了我的问题。我将此代码添加到sail 的supervisor.conf 文件中。
process_name=%(program_name)s
command=/usr/bin/php -d variables_order=EGPCS /var/www/html/artisan horizon
user=sail
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/var/www/html/horizon.log
stopwaitsecs=3600
[program:cron-job]
process_name=%(program_name)s
command=crond -f
user=root ; crond should be started as root at all times
autostart=true
autorestart=true
numprocs=1
redirect_stderr=false
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
也许这不是最好的解决方案,但它确实有效。
要为 Laravel 队列设置Supervisor ,这是我在 Laravel Sail 的 Docker 容器中尝试的。
进入容器:
docker-compose exec laravel.test bash
在容器内运行:
apt update
apt install nano
cd /etc/supervisor/conf.d
touch laravel-worker.conf
nano laravel-worker.conf
粘贴:
[supervisord]
nodaemon=false
user=root
logfile=/var/log/supervisor/laravel-worker.log
pidfile=/var/run/laravel-worker.pid
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/artisan queue:work
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=sail
numprocs=8
redirect_stderr=true
stdout_logfile=/var/www/html/storage/logs/worker.log
stopwaitsecs=3600
startsecs=0
[supervisorctl]
用 Nano 保存:
ctrl + o
ctrl + x
运行队列工作者:
supervisord -c /etc/supervisor/conf.d/laravel-worker.conf
如果您的应用程序代码发生更改,要重新启动队列工作程序:
service supervisor restart
请记住,队列工作者是长期存在的进程,并将启动的应用程序状态存储在内存中。因此,它们在启动后不会注意到您的代码库中的更改。因此,在您的部署过程中,请务必重新启动您的队列工作程序。此外,请记住,您的应用程序创建或修改的任何静态状态都不会在作业之间自动重置。队列 - Laravel - 运行队列工作者
注意:如果 Docker 容器重新启动,您需要再次手动运行 supervisord 命令。
从深入研究 Laravel Sail 开始,看起来你不应该改变/etc/supervisor/conf.d/supervisord.conf
,因为它与 Docker 息息相关。例如,如果主管进程被杀死,容器将停止,即网络服务器停止并且您退出。这使得更改队列工作者配置变得更加困难,因为它需要重新启动进程。
请参阅sail/runtimes/8.0/start-container。
最后的想法:总的来说,如果我必须重新开始知道我现在所知道的,我可能已经在主机系统上的 Docker 容器之外配置了 Supervisor(和 cron)。在 Sail 更新的情况下,它不太复杂,将来可能不太容易中断。