我试图每分钟运行一次
php artisan schedule:run
,但似乎无法运行计划的任务。
我的 laravel 代码部署到 AWS EC2 实例内的 docker 容器中。
以下是相关信息:
app/Console/Kernel.php
protected function schedule(Schedule $schedule): void
{
$schedule->command('app:some-command')->everyMinute();
}
app/Console/Commands/SomeCommand.php
public function handle()
{
// some code
try {
// do something
} catch (\Throwable $e) {
Log::error($e->getMessage());
}
}
php artisan schedule:list
* * * * * php artisan app:some-command .....
crontab -e
// have tried the following
* * * * * php /var/www/html/artisan schedule:run >> /dev/null 2>&1
* * * * * cd /var/www/html/ && php artisan schedule:run >> /dev/null 2>&1
我参考了官方的doc,
php artisan schedule:run
和php artisan app:some-command
都按预期工作。
有人可以给我一些关于我在这里可能做错的事情的想法吗?
我想你有一个 docker 文件来创建你的 php 图像。我们将其命名为app.dockerfile。其中你应该有这样的东西:
FROM phpswoole/swoole:4.8-php8.2-alpine
.
.
.
RUN touch app.cron && \
echo "* * * * * php /app/artisan schedule:run" >> app.cron && \
crontab app.cron
EXPOSE 8000
那么你应该有一个单独的容器来存放你的 cron 作业。所以你有一个 docker-compose 文件。在 docker-compose 文件中,您应该定义如下命令:
command: [ "/bin/sh","-c" ]
args:
- |
php artisan optimize &&
php artisan event:cache &&
crond -l 2 -f