Zend framework Zend Cronjobs调用控制器
我想在Zend框架中创建一个cronjobs。我创建了一些示例,现在我的代码是这样的:file\public\index.phpZend framework Zend Cronjobs调用控制器,zend-framework,controller,cron,Zend Framework,Controller,Cron,我想在Zend框架中创建一个cronjobs。我创建了一些示例,现在我的代码是这样的:file\public\index.php <?php date_default_timezone_set('Europe/Amsterdam'); // Define path to application directory defined('APPLICATION_PATH') || define('APPLICATION_PATH', realpath(dirname(__FILE__) .
<?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文件中调用一个控制器。我有一个电子邮件控制器,我想调用它。我需要使用该控制器的一些操作,这些操作将使用一些视图模板向我发送邮件。
我怎么能做到?你能帮助我吗?
谢谢,
博格丹。好的。。不那么容易
首先,您需要一个虚拟路由器,将其放在您的应用程序库中。我的命名空间是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脚本引导,可能在您的jobs文件夹中。它可以是这样的:
<?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
$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-模块/控制器/操作。。不那么容易
首先,您需要一个虚拟路由器,将其放在您的应用程序库中。我的命名空间是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脚本引导,可能在您的jobs文件夹中。它可以是这样的:
<?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
$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-模块/控制器/操作我发现了问题。。。。我们需要代码:
require_once 'Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace('Nc_');
而不是:
/** Zend_Application */
require_once 'Zend/Application.php';
谢谢你的帮助。我在这里找到了一些帮助我发现bug问题的网页:
我发现了问题。。。。我们需要代码:
require_once 'Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace('Nc_');
而不是:
/** Zend_Application */
require_once 'Zend/Application.php';
谢谢你的帮助。我在这里找到了一些帮助我发现bug问题的网页:
cronjobs通常不使用php-f调用控制器。如果您想调用控制器,最好使用wget on*nixcronjobs来调用控制器,但无论如何不要使用php-f。如果您想呼叫控制器,最好使用wget on*nix,谢谢您的解决方案。现在我将实现它,看看它是如何工作的。我有一个愚蠢的问题。你说首先你需要一个虚拟路由器,把它放在你的应用程序库中。我的命名空间是Nc,因此该类位于library/Nc/Controller/Router/Cli.php中。在我的结构中,我有文件夹:应用程序、应用程序/配置、应用程序/控制器、应用程序/布局、应用程序/视图和公共和无库。应用程序库在哪里?。再次非常感谢。谢谢你的解决方案。现在我将实现它,看看它是如何工作的。我有一个愚蠢的问题。你说首先你需要一个虚拟路由器,把它放在你的应用程序库中。我的命名空间是Nc,因此该类位于library/Nc/Controller/Router/Cli.php中。在我的结构中,我有文件夹:应用程序、应用程序/配置、应用程序/控制器、应用程序/布局、应用程序/视图和公共和无库。应用程序库在哪里?。再次非常感谢。