2011-03-31 75 views
1

我想在Zend Framework中創建一個cronjobs。我創辦了一些例子,現在我的代碼是這樣的:(文件\公用\的index.php)Zend Cronjobs調用控制器

<?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]'; 
} 
?> 

我需要CALL在這個cronjobs.php文件(我有一個電子郵件控制器,我想稱呼它)的控制器。我需要使用該控制器的一些操作,它會使用一些視圖模板向我發送郵件。 我該怎麼做?你可以幫我嗎? 非常感謝, Bogdan。

+0

cronjobs通常不會調用控制器(不是使用php -f)。如果你想打電話給控制器,你最好在* nix – JohnP 2011-03-31 09:23:58

回答

4

好..不那麼容易。

首先你需要一個虛擬路由器,把它放到你的應用程序庫中。我的命名空間是「Nc」,因此該類在庫/ 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腳本(bootstrap),可能在您的作業文件夾中。它可以是這樣的:

<?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; 
} 

現在在你的命令行,你可以這樣調用控制器動作:

PHP run.php -a模塊/控制器/動作

+0

上使用'wget'感謝你的解決方案。現在我將執行以瞭解它是如何工作的。我有一個虛擬的問題。你說:「首先你需要一個虛擬路由器,把它放到你的應用程序庫中,我的命名空間是」Nc「,所以這個類在庫/ Nc/Controller/Router/Cli.php中。」在我的結構中,我有文件夾:應用程序,應用程序/配置,應用程序/控制器,應用程序/佈局,應用程序/視圖以及公共和無庫(應用程序庫在哪裏)。再次感謝。 – Bogdan 2011-03-31 15:01:48