我一直在寻找一段时间,并认为我有我需要的部分信息,但只需要一些帮助将它们放在一起。
我想要实现的是定期调用一个 URL(一个 codeigniter 控制器),例如每 5 分钟一次,这将通过我的数据库邮件队列并使用亚马逊 SES 发送邮件。
到目前为止,我已经成功创建了控制器、模型、数据库,并且 SES 工作得很好。控制器一次发送 10 封电子邮件,当我手动点击 URL 时一切正常。
我对 cron 工作不太熟悉,但认为这是我需要去的地方。
我的应用程序设置在 AWS 上的 Elastic beanstalk 上。
我认为我需要.ebextensions
在我的 web 根目录中调用一个文件夹,其中包含一个文件something.config
,我可以在其中放置一些“容器命令”。我还认为我需要在某处包含“leader_only:true”,以避免我的复制实例执行相同的工作。
当我不明白我的容器命令应该是什么时,考虑到控制器是 ' http://myapplication/process_mail
' ?从我看到的示例中,我看不出它是如何确定频率的,甚至是“调用”URL 的代码。
在我的控制器中,我以前有以下代码来确保它只能从命令行调用。这是我可以保留和拥有的东西,还是容器命令会像任何其他用户一样点击 URL?
if (!$this->input->is_cli_request()) {
echo "Access Denied";
return;
}
在此先感谢您的任何帮助。我想我只需要帮助了解配置文件中应该包含的内容,但是我可能又完全走错了路!
更新:
到目前为止,我已经做到了:
我相信我需要像这样http://ellislab.com/codeigniter/user-guide/general/cli.html从命令行运行应用程序
所以我的命令是php index.php process_mail
所以我真正需要的是帮助每 5 分钟运行一次这个命令。这是我到目前为止所拥有的:
container_commands:
send_mail:
command: php index.php process_mail
leader_only: true
但我不明白的是我如何让它每 5 分钟运行一次,而不仅仅是在设置实例时运行。我是否需要在创建实例时创建一个 cron 作业文件,而不是使用 php 命令?
更新 2:
对于其他有同样问题的人,我最后得到了这样的排序:
一个看起来像这样的 ebextensions 文件:( .ebextensions/mail_queue.config
)
container_commands:
01_send_mail:
command: "cat .ebextensions/process_mail.txt > /etc/cron.d/process_mail && chmod 644 /etc/cron.d/process_mail"
leader_only: true
同一文件夹中名为 process_mail.txt 的文件如下所示:
# The newline at the end of this file is extremely important. Cron won't run without it.
*/5 * * * * root /usr/bin/php /var/app/current/index.php process_mail > /dev/null
因此,它每 5 分钟通过 cmd 行运行 codeigniter 主索引文件,并传入控制器名称。