【发布时间】:2013-07-20 08:54:37
【问题描述】:
我已经搜索了一段时间,并认为我有我需要的部分信息,但只是需要一些帮助才能将它们放在一起。
我想要实现的是定期调用 URL(codeigniter 控制器),例如每 5 分钟将通过我的数据库邮件队列并使用亚马逊 SES 发送邮件。
到目前为止,我已经成功创建了控制器、模型、数据库,并且 SES 工作正常。控制器一次发送 10 封电子邮件,当我手动点击 URL 时一切正常。
我对 cron 工作不太熟悉,但认为这是我需要去的地方。
我的应用程序设置在 AWS 上的 Elastic beanstalk 上。
我认为我的 Web 根目录中需要一个名为 .ebextensions 的文件夹,其中包含一个名为 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 主索引文件,并传入控制器名称。
【问题讨论】:
标签: codeigniter amazon-web-services cron amazon-elastic-beanstalk