TL;DR:
在这篇文章的末尾可以看到工作中的 .ebextentions
配置。
环境
如何使用crontab运行Laravel代码?
答案当然是最显而易见的,如果你对Laravel稍有了解,你肯定知道答案:使用Scheduling(调度)!
我不会让你感到无聊地解释 Laravel 调度的精髓,因为你可以自己阅读文档了解它。
但我们需要记住的关键是 Laravel 调度使用 crontab 来执行,正如文档所描述:
* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1
这就引出了下一个,可能有些棘手的问题...
如何在我的 Elastic Beanstalk 环境中设置 crontab?
乍一看,这个问题的答案似乎非常简单。 我在 AWS Knowledge Center 中找到了这篇文章:
如何在 Elastic Beanstalk 环境中的 EC2 实例上创建 crontab 作业?
在这里,他们描述了如何使用 .ebextentions 在您的 Elastic Beanstalk EC2 机器上设置 crontab 作业。 简而言之,它会在目录 /etc/cron.d/ 中创建一个新文件,我们将期望的 cron job 放置在其中。
然后,这个目录中的文件将由 crontab 以 root 用户身份进行处理。 我遇到的一些陷阱如下所述:
files:
"/etc/cron.d/mycron":
mode: "000644"
owner: root
group: root
content: |
* * * * * root /usr/local/bin/myscript.sh
一旦我们避开了所有这些陷阱,就该把上面的 Laravel 调度 cron 作业安装好了。应该看起来像这样:
files:
"/etc/cron.d/schedule_run":
mode: "000644"
owner: root
group: root
content: |
* * * * * root php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1
在很多情况下,这并不会真正起作用。这是因为Laravel调度程序将无法访问您的ENV变量,明显地也不会访问您的数据库设置。
我在这里找到了答案:
如何在AWS Elastic Beanstalk Cron上使 Laravel 任务调度正常工作
所以,向George Bönnisch致以最大的敬意; 我向您致敬,先生,感谢您分享这个!
因此,在拼图的最后一块中,我终于能够正确地设置工作:
工作解决方案
文件结构:
[Project root]
|-- .ebextensions
| |-- cronjob.config
cronjob.config:
files:
"/etc/cron.d/schedule_run":
mode: "000644"
owner: root
group: root
content: |
* * * * * root . /opt/elasticbeanstalk/support/envvars && /usr/bin/php /var/www/html/artisan schedule:run 1>> /dev/null 2>&1
commands:
remove_old_cron:
command: "rm -f /etc/cron.d/*.bak"
在AWS Elastic Beanstalk上使用Laravel调度的提示!
Elastic Beanstalk的一个关键特性是它可以在需要时自动扩展并添加更多的服务器,因此您可能想要查看Laravel调度中的新功能:在一个服务器上运行任务。
在许多情况下,您不希望您的cron作业在多个服务器上执行。例如,如果您有一个定时命令用于发送电子邮件,则不希望多次发送这些邮件。
注意:根据文档,这需要您将memcached或redis作为缓存引擎。如果没有,请查看AWS服务Elasticache。
注意2:当使用onOneServer()
时,您必须使用name()
方法(在调用onOneServer()
之前)为预定的任务命名。如下所示:
$schedule->command('my:task')
->name('my:task')
->daily()
->onOneServer()
remove_old_cron
命令部分上面是什么?旧的cron是否生成了任何.bak文件需要我们清理?您能否详细说明其有用性? - Dhrumil Bhankhar.bak
后缀。remove_old_cron
是用来删除旧的(如其名称所示)。 - Ehsan