1

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

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

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

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

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

4

3 回答 3

4

使用 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
于 2013-11-04T13:53:16.833 回答
2

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。这里也有相关信息。这通常是首选方法,但在我看来,它涉及更多,并且可能是设置和调试的挑战,特别是如果您没有使用 Unix 的经验。

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

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

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

URL 与命令行

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

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

于 2013-11-04T19:07:46.987 回答
1

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

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

于 2013-11-04T13:48:50.337 回答