【问题标题】:How to work with cron job in zendframework 2? [duplicate]如何在 zendframework 2 中使用 cron 作业? [复制]
【发布时间】:2013-11-15 03:27:23
【问题描述】:

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

假设控制器名称是“FetchFromSourceController”,功能是“index”和“ical”。这些是我用的名字。

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

我听说我可以为此目的使用“cron 作业”,但以前从未使用过。请告诉我在 ZF2 中的何处编写 cron 作业代码以在特定时间运行这些功能。

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

【问题讨论】:

    标签: php cron zend-framework2 cron-task


    【解决方案1】:

    这取决于你的服务器和他安装的 cron 系统。 例如在 Debian/Ubuntu 上很容易http://www.pantz.org/software/cron/croninfo.html

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

    【讨论】:

      【解决方案2】:

      使用 Zf2,您可以通过 CLI 从命令行访问控制器操作,效果非常好。 您所要做的就是将路由添加到 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 控制器,同步操作,那里

      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
      

      【讨论】:

        【解决方案3】:

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

        Cron 作业是在特定时间执行的任务,通常在操作系统级别设置。在 unix 中,它是通过 crontab 完成的,在 windows 中,您可以使用任务调度程序。 ZF2 中没有任何内容可以在 12:00 和 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 作业服务 如果您正在寻找更简单的解决方案,您可以考虑使用其中一个 cron 服务,它会在给定时间加载特定的 URL。

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

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

        网址与命令行

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

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

        【讨论】:

        • BPosey,感谢您的详细解释。看,实际上我在管理模块中的控制器中有这些操作(索引和 ical),这意味着文件需要身份验证才能运行。如果我在网站setcronjob.com 中提供eveparis.com/admin/add-from-source/indexeveparis.com/admin/add-from-source/ical 之类的网址,它可以工作吗?因为要手动运行文件,需要进行身份验证。
        • 据我所知,SetCronjob 支持的唯一身份验证类型是HTTP Basic Authentication。我怀疑您的管理员有一个需要电子邮件/密码的正确登录页面,这意味着您需要开发自己的解决方案以使 SetCronjob 可以访问这些功能。也许您可以创建一个不需要身份验证的 CronController 并将您的索引和 ical 函数移到那里?
        • 是的,在另一个模块中创建另一个控制器是个好主意。谢谢您的帮助
        猜你喜欢
        • 2014-08-01
        • 1970-01-01
        • 2023-04-06
        • 2021-05-19
        • 1970-01-01
        • 1970-01-01
        • 2020-06-10
        • 1970-01-01
        • 2013-10-13
        相关资源
        最近更新 更多