如何在zendframework 2中使用cron作业?

时间:2013-11-04 13:41:56

标签: php cron zend-framework2 cron-task

我在zend框架2中有两个函数,它从另一个站点获取公寓的详细信息并将它们保存在我的数据库中。 (但是,只有当我运行功能时才会这样做。)

说控制器名称是'FetchFromSourceController',函数是'index'和'ical'。那些是我用的名字。

但我的要求是这两个功能应该在一天开始时一个接一个地自动运行,间隔为10分钟。即索引动作应在凌晨12:00运行,而动作应在每天凌晨12:10运行。

我听说我可以为此目的使用'cron job',但之前从未使用过。请告诉我在ZF2中编写cron作业代码的位置,以便在特定时间运行这些函数。

或至少给我一些在zendframework2中使用cron作业的教程。我搜索了它。但没找到任何。提前谢谢。

3 个答案:

答案 0 :(得分:4)

使用Zf2,您可以通过CLI从命令行访问Controller Actions,它的效果非常好。 您所要做的就是将路由添加到module.config.php

return array(
  ......
 'console' => array(
    'router' => array(
        'routes' => array(
            'synch' => array(
                'options' => array(
                    'route'    => 'synch (sites|items):task',
                    'defaults' => array(
                        'controller' => 'Application\Controller\Scheduled',
                        'action'     => 'synch'
                    )
                )
            ),
),

正如您所看到的,它正在调用Application \ Controller \ Scheduled controller,synch action,

public function synchAction()
{
    $task = $this->params('task');
    try{
        switch($task){
            case 'sites':
                   .......
            break; 
           case 'items':
                   .......
            break; 
        }

然后你可以创建简单的shell脚本zf2.sh

php /var/www/vhosts/mysite/httpdocs/public/index.php $1 $2

和crontab添加

0 6 * * * /home/admin/scripts/zf2.sh synch sites

或者只是从命令行运行

./zf2.sh synch items

答案 1 :(得分:2)

ZF2没有“cron job”服务来自动在特定时间运行脚本。

Cron作业是在特定时间执行的任务,通常在操作系统级别设置。在unix中,它是通过crontab完成的,在Windows中你可以使用任务调度程序。 ZF2中没有任何内容可以在12点和12点10分运行你的脚本。

选项#1:通过管理面板的Cron作业

对于大多数托管环境,您可以通过网站托管管理面板(例如Plesk或cPanel)设置“cron作业”。在那里,您可以通过输入时间和要运行的命令来安排作业。以这种方式创建cron作业时,请记住,您将输入要通过命令行运行的命令。通常这是直接调用php来执行特定脚本,但您也可以使用wget从Internet获取任何URL。如果您直接调用php,则需要根据Zdenek的答案设置控制台路由。

/usr/bin/php /path/to/zf2/public/index.php myIndexConsoleRoute

wget http://yoursite.com/fetch-from-source/index

选项#2:通过命令行设置Crontab

或者,如果您具有对服务器的命令行访问权限以及正确的用户权限,则可以根据Zdenek的答案通过命令行设置crontab。还有相关信息here。这通常是首选方法,但在我看来,它涉及更多,并且可能是设置和调试的挑战,特别是如果您没有使用Unix的经验。

选项#3:Cron作业服务 如果您正在寻找一个更简单的解决方案,您可能会考虑其中一个将在给定时间加载特定URL的cron服务。

例如,我过去曾使用过这项服务: https://www.setcronjob.com

创建帐户后,只需输入一个网址,然后选择您希望调用该网址的时间。通过设置两个作业,一个可以在12:00运行,另一个运行在12:10,您可以轻松地完成您的要求,以便在12:00和icalAction 12:10调用indexAction。 SetCronjob有一个可能符合您需求的免费计划,但请注意,他们要求您每30天输入一次验证码以续订您的免费帐户(这很好,但过了一段时间后会变得烦人)。

网址与命令行

使用选项#1中的“wget”和选项#3中的Cron服务,您需要通过http提供indexAction和icalAction。这可能是一个重要的考虑因素。即使您添加某种验证(通过检查您通过查询字符串或帖子发送的代码),如果他们知道正确的“秘密”URL,互联网上的任何人仍可能触发这些功能。通过http访问您的ical和index方法还有一个额外的好处,即如果您想手动运行这些脚本以强制更新,则可以轻松调用它们。

使用Zdenek提到的CLI方法,您可以在ZF2中创建控制台路由,并且通过命令行触发该路由的唯一方法。这通常是首选,因为您的索引和ical方法不会暴露给http,但它并不总是一个选项,具体取决于您的托管设置,它可能不是一个重要的问题,这取决于这些功能对您的数据和公共网站的作用。

答案 2 :(得分:1)

这取决于您的服务器和他的cron系统安装。 例如在Debian / Ubuntu上,它非常简单http://www.pantz.org/software/cron/croninfo.html

您可以使用此有用的模块来创建cron:https://github.com/heartsentwined/zf2-cron