如何在 zendframework 2 中使用 cron job


How to work with cron job in zendframework 2?

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

假设控制器名称为"FetchFromSourceController",函数为"index"和"ical"。 这些是我使用的名字。

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

听说我可以使用"cron job"来实现这个目的,但以前从未使用过。请告诉我在 ZF2 中在哪里编写 cron 作业代码以在特定时间运行这些函数。

或者至少给我一些在 Zendframework2 中使用 cron job 的教程。我搜索了它,但没有找到。提前谢谢。

使用 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'
                    )
                )
            ),
),

如您所见,它正在调用应用程序''控制器''计划控制器,同步操作,那里

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

ZF2 没有在特定时间自动运行脚本的"cron job"服务。

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

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

对于大多数托管环境,您可以通过您的网站托管管理面板(例如 Plesk 或 cPanel)设置"cron 作业"。 在那里,您可以通过输入要运行的时间和命令来计划作业。 以这种方式创建 cron 作业时,请记住,您将输入要通过命令行运行的命令。 通常这是直接调用 php 来执行特定的脚本,但你也可以使用 wget 从互联网上获取任何 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。 这里也有相关信息。 这通常是首选方法,但在我看来,它涉及更多,并且对设置和调试可能是一个挑战,特别是如果您没有Unix经验。

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

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

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

网址与命令行

使用选项 #

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

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

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

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