创建与Zend框架的cronjob(Create cronjob with Zend Framewo

2019-07-18 05:54发布

我试图写一个cronjob控制器,所以我可以调用一个网站,并有所有模块cronjob.php执行。 现在我的问题是,我该怎么做呢?

将卷曲是一种选择,所以我也可以算错误和成功?

[更新]

我想我已经没有足够的解释它。

我想要做的是有一个文件,我可以打电话给像HTTP://服务器/的cronjob ,然后让它执行每/application/modules/*/controller/CronjobController.php或有做这样所有的另一种方式cronjobs是不是在一个地方,但在同一个地方的模块的位置。 这给我的优点,即如果一个模块不存在,不尝试运行它的cronjob。

现在我的问题是如何将你执行所有模块CronjobController或者你会做一个完全地不同的方式,因此仍然停留模块化?

我希望能够giveout多少cronjobs成功运行,并且有多少没

Answer 1:

一些研究和大量的拖延后,我来简单的结论,你的Zend Framework应用程序一个ZF-美化版的cron脚本应该包含所有的功能 - 无所有的观点的东西。 我创建我的应用程序目录中的新cronjobfoo.php文件来实现这一点。 然后,我把最低限度从:-My前端控制器(的index.php)-My bootstrap.php中

我拿出所有的视图的东西,专注于保持环境的设置,DB设置,自动加载机,和注册表设置。 我不得不采取一点时间来更正文档根目录变量,并删除了一些从我的引导复制OO功能。

从那以后,我只是编码路程。在我的情况下,它被编译并通过电子邮件发送出去夜间报告。 这是伟大的使用Zend_Mail中去。 当我有信心,我的剧本是工作,我想要的方式,我只是说是我的crontab。

祝好运!



Answer 2:

对于Zend框架我目前使用的波纹管中列出的代码。 该脚本只包含门户index.php文件,所有的路径,环境等Zendy代码自举。 通过在cron的脚本定义常量,我们取消了最后一步,在运行应用程序。

这意味着应用程序仅设置,甚至没有自举。 在这一点上,我们开始的Bootstrap我们需要的资源,那就是

//public/index.php

if(!defined('DONT_RUN_APP') || DONT_RUN_APP == false) {  
    $application->bootstrap()->run();
}

// application/../cron/cronjob.php

define("DONT_RUN_APP",true);
require(realpath('/srv/www/project/public/index.php'));
$application->bootstrap('config');
$application->bootstrap('db');

//cron code follows


Answer 3:

我要提醒把你cronjobs向公众开放的,因为他们可以正常的时间之外触发,并根据他们所做的事情,引起的问题(我知道这是不是你想要什么,而是将它们放入一个实际控制人就变成可达从浏览器)。 例如,我有一个cron的发送电子邮件。 如果有人发现cron的URL和刚开始打它我会不断的垃圾邮件。

我所做的就是让一个cron文件夹,并在那里创建了自举Zend框架(减去MVC)对我来说是heartbeat.php。 它检查其已安装的所有cron作业列表的数据库,如果现在是时候让他们跑,产生cron作业类的一个实例,并运行它。

在cron作业是从具有类似安装(),运行(方法的抽象类的cron),停用()等刚子类

要火了我的工作,我只是有一个运行每5分钟击中heartbeat.php一个简单的crontab项。 到目前为止,它的工作奇妙的在两个不同的地点。



Answer 4:

有人提到这篇博客前几天在FW-一般(一个邮件列表 ,我建议你阅读时,你使用Zend框架)。

还有一个建议Zend_Controller_Request_Cli ,这应该解决这个问题迟早的事。



Answer 5:

我有机会获得一个专用的服务器和我最初曾经为cron作业不同的引导。 我终于恨的想法,只是希望我可以在现有的MVC设置中做到这一点,而不必理会走动的事情。

我创建了一个文件cron.sh,保存的是我的网站根目录(不公开)中,并在其中我把一个系列,我想运行的命令。 因为我想在我一次我的控制器照常内写的PHP运行很多命令,并添加卷曲呼叫cron.sh.内这些网址 例如curl http://www.mysite.com/cron_controller/action然后cron的界面上,我跑bash /path/to/cron.sh

正如有人指出你的crons可以由任何人谁猜中URL所以有总是告诫被解雇。 你可以找到许多不同的方式解决这一点。



Answer 6:

看看zf-cli

  • GitHub上-在主从帕德里克/ ZFPlanet脚本

这种处理好所有的cron作业。



Answer 7:

为什么不创建一个crontab.php,包括,或要求的index.php引导文件?

考虑到自举正在执行Zend_Loader::registerAutoload()你就可以开始直接与模块的工作,例如, myModules_MyClass::doSomething();

这样,你跳过控制器。 该控制器的工作是控制通过HTTP访问。 在这种情况下,因为你是在本地访问你不需要控制器的方法。



Answer 8:

http://framework.zend.com/wiki/display/ZFPROP/Zend_Scheduler+-+Matthew+Ratzloff?rootCommentId=1819这个环节我发现googleing似乎藏汉会相当interessting。

它不是什么安静,我在寻找,但如果我似乎无法找到我一直在寻找,我将不得不自己。



Answer 9:

你有没有在模块的目录文件系统访问? 你可以遍历目录,并确定一个CronjobController.php可用。 然后,你既可以使用Zend_Http_Client通过HTTP访问控制器或使用像的方法Zend_Test_PHPUnit :本地模拟实际调度过程。



Answer 10:

你可以建立一个数据库表来保存到的cronjob脚本引用(在你的模块),然后使用exec命令与通返回值/失败。



Answer 11:

我伸出格雷戈尔答案与这个职位 。 这是哪冒出来的:

//public/index.php 

// Run application, only if not started from command line (cli)
if (php_sapi_name() != 'cli' || !empty($_SERVER['REMOTE_ADDR'])) {
    $application->run();
}

谢谢格雷戈尔!



Answer 12:

我的解决方案:

  • 卷曲/ cron的
  • 全球的cron方法include_once所有控制器
  • 检查是否每个controllors的有 - > cron的方法
  • 如果他们有,运行这些。

公共cron的网址(卷曲)是没有问题的,有很多种方法,以避免滥用。 至于说,检查远程IP是最简单的。



Answer 13:

这是我的方式来与Zend框架运行cron任务

引导我将保持环境设置,因为它是负MVC:

public static function setupEnvironment()
{
     ...
     self::setupFrontController();
     self::setupDatabase();
     self::setupRoutes();
     ...
     if (PHP_SAPI !== 'cli') { 
          self::setupView();
          self::setupDbCaches();
     }
     ...
}

此外,在引导,我会修改setupRoutes并添加自定义路线:

public function setupRoutes()
{   
    ...
    if (PHP_SAPI == 'cli') { 
        self::$frontController->setRouter(new App_Router_Cli());
        self::$frontController->setRequest(new Zend_Controller_Request_Http());        
    }
}

App_Router_Cli是一个新的路由器的类型,其确定所述控制器,动作,并且基于该类型的请求的可选参数: script.php controller=mail action=send 。 我在这里发现了这个新的路由器: 建立克朗与Zend框架1.11 :

class App_Router_Cli extends Zend_Controller_Router_Abstract 
{
    public function route (Zend_Controller_Request_Abstract $dispatcher) 
    {
        $getopt = new Zend_Console_Getopt (array());
        $arguments = $getopt->getRemainingArgs();
        $controller = "";
        $action = "";
        $params = array();

        if ($arguments) {

            foreach($arguments as $index => $command) {

                $details = explode("=", $command);

                if($details[0] == "controller") {
                    $controller = $details[1];
                } else if($details[0] == "action") {
                    $action = $details[1];
                } else {
                    $params[$details[0]] = $details[1];
                }
            }

            if($action == "" || $controller == "") {
                die("Missing Controller and Action Arguments == You should have: 
                     php script.php controller=[controllername] action=[action]");
            }
            $dispatcher->setControllerName($controller);
            $dispatcher->setActionName($action);
            $dispatcher->setParams($params);

            return $dispatcher;
        }
        echo "Invalid command.\n", exit;
        echo "No command given.\n", exit;
    }

    public function assemble ($userParams, $name = null, $reset = false, $encode = true)
    {
        throw new Exception("Assemble isnt implemented ", print_r($userParams, true));
    }
}

CronController我做一个简单的检查:

public function sendEmailCliAction()
{   
    if (PHP_SAPI != 'cli' || !empty($_SERVER['REMOTE_ADDR'])) { 
        echo "Program cannot be run manually\n";
        exit(1);
    } 
    // Each email sent has its status set to 0;

crontab的运行这样的命令:

    * * * * * php /var/www/projectname/public/index.php controller=name action=send-email-cli >> /var/www/projectname/application/data/logs/cron.log


Answer 14:

它没有意义的,运行在同一个目录或cron作业文件夹中的引导。 我创建实现cron作业工作,更好的和简单的方法。 请按照下面的东西,使你的工作变得容易和智能:

  1. 创建一个cron作业文件夹,例如任何你想要的“的cron”或“crobjob”等。

  2. 有时候,我们需要的cron作业与像1个小时间隔或1天的间隔不同区间的服务器上运行,我们可以设置在服务器上。

  3. 创建cron作业文件夹中的文件,就像我创建了一个“的init.php”,现在让我们假设你想简讯发送给用户,每天一次。 你不需要做了Zend代码的init.php。

  4. 所以刚成立的init.php卷曲功能,并添加您的控制器动作的URL在卷曲功能。 因为我们的主要目的是,一个动作应该在每天被调用。 例如,URL应该是这样的:

https://www.example.com/cron/newsletters

因此,建立在卷曲功能此URL,并调用的init.php此功能在同一个文件。

在上面的链接,你可以看到“的cron”是控制器和通讯的行动在这里你可以做你的工作,以同样的方式,并不需要运行的引导文件等。



文章来源: Create cronjob with Zend Framework