【问题标题】:Zend Cronjobs call a controllerZend Cronjobs 调用控制器
【发布时间】:2012-05-22 22:44:56
【问题描述】:

我想在 Zend Framework 中创建一个 cronjobs。我创建了一些示例,现在我的代码是这样的:(文件 \public\index.php )

<?php

date_default_timezone_set('Europe/Amsterdam');

// Define path to application directory
defined('APPLICATION_PATH') || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));


// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', 'development');

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library')  ,
    get_include_path(),
)));

/** Zend_Application */
require_once 'Zend/Application.php';

// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
    );

$application->bootstrap();

/** Cronjobs don’t need all the extra’s **/
if(!defined('_CRONJOB_') || _CRONJOB_ == false)
{
$application->bootstrap()->run();
}
?>

我在与应用程序相同的级别上添加了一个名为 cronjobs 的新文件夹,并添加了一个名为 cronjobs.php 的新文件

<?php
define("_CRONJOB_",true);
require('../public/index.php'); 

//HERE I NEED SOME CODE FOR CALLING EMAIL CONTROLLER

register_shutdown_function('__shutdown');

function __shutdown() {
global $time, $memory;
$endTime = microtime(true);
$endMemory = memory_get_usage();

echo '
Time [' . ($endTime - $time) . '] Memory [' . number_format(( $endMemory - $memory) / 1024) . 'Kb]';
}
?>

我需要在这个 cronjobs.php 文件中CALL一个控制器(我有一个我想调用它的电子邮件控制器)。我需要使用该控制器的一些操作,这将使用一些视图模板向我发送邮件。 我怎么能做到这一点?你能帮助我吗? 非常感谢, 波格丹。

【问题讨论】:

  • cronjobs 通常不调用控制器(无论如何都不使用 php -f)。如果你想调用控制器,最好在 *nix 上使用 wget

标签: zend-framework controller cron


【解决方案1】:

好吧..没那么容易。

首先你需要一个虚拟路由器,把它放到你的应用程序库中。我的命名空间是“Nc”,所以类在 library/Nc/Controller/Router/Cli.php 中。

class Nc_Controller_Router_Cli extends Zend_Controller_Router_Abstract
    implements Zend_Controller_Router_Interface
{

    public function route(Zend_Controller_Request_Abstract $dispatcher)
    {

    }

    public function assemble($userParams, $name = null, $reset = false, $encode = true)
    {

    }

    public function getFrontController()
    {

    }

    public function setFrontController(Zend_Controller_Front $controller)
    {

    }

    public function setParam($name, $value)
    {

    }

    public function setParams(array $params)
    {

    }

    public function getParam($name)
    {

    }

    public function getParams()
    {

    }

    public function clearParams($name = null)
    {

    }

}

接下来创建一个 run.php 脚本(引导程序),可能在您的作业文件夹中。它可能看起来像这样:

<?php
$time = microtime(true);
$memory = memory_get_usage();
set_time_limit(0);

define('APPLICATION_ENV', 'cronjob');
define('CRONJOB_RUNNING', true);

// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(),
)));

/** Zend_Application **/
require_once 'Zend/Application.php';

// initialize Zend_Application
$application = new Zend_Application (
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);

$application->bootstrap();

$getopt = new Zend_Console_Getopt(array(
    'action|a=s' => 'action to perform in format of "module/controller/action"',
    'help|h'     => 'displays usage information',
    'list|l'     => 'List available jobs',
));

try {
    $getopt->parse();
} catch (Zend_Console_Getopt_Exception $e) {
    // Bad options passed: report usage
    echo $e->getUsageMessage();
    return false;
}

if ($getopt->getOption('l')) {
    // add help messages..
}

if ($getopt->getOption('h')) {
    echo $getopt->getUsageMessage();
    return true;
}

if ($getopt->getOption('a')) {
    $front = $application->getBootstrap()->getResource('frontcontroller');

    $params = array_reverse(explode('/', $getopt->getOption('a')));
    $module = array_pop($params);
    $controller = array_pop($params);
    $action = array_pop($params);

    if (count($params)) {
        foreach ($params as $param) {
            $splitedNameValue = explode('=', $param);
            $passParam[$splitedNameValue[0]] = $splitedNameValue[1];
        }
    } else {
        $passParam = array();
    }

    $request = new Zend_Controller_Request_Simple($action, $controller, $module, $passParam);

    $front->setRequest($request)
          ->setResponse(new Zend_Controller_Response_Cli())
          ->setRouter(new Nc_Controller_Router_Cli());


    $application->run();

    $endTime = microtime(true);
    $endMemory = memory_get_usage();

    echo 'Time [' . ($endTime - $time) . '] Memory [' . number_format(( $endMemory - $memory) / 1024) . 'Kb]' . PHP_EOL;
}

现在在您的 cli 上,您可以像这样调用控制器操作:

php run.php -a 模块/控制器/动作

【讨论】:

  • 感谢您的解决方案。现在我将实施以查看它是如何工作的。我有一个愚蠢的问题。你说“首先你需要一个虚拟路由器,把它放在你的应用程序库中。我的命名空间是“Nc”,所以类在 library/Nc/Controller/Router/Cli.php 中。在我的结构中,我有文件夹:应用程序、应用程序/配置、应用程序/控制器、应用程序/布局、应用程序/视图和公共并且没有库(应用程序库在哪里?)。再次非常感谢。
【解决方案2】:

我发现了问题......我们需要代码:

require_once 'Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();

$loader->registerNamespace('Nc_');

而不是:

/** Zend_Application */
require_once 'Zend/Application.php';

谢谢你的帮助。我在这里找到了一些帮助我找到错误问题的网页: http://webdevbyjoss.blogspot.com/2010/09/running-zend-framework-application-from.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多