Zend framework 如何设置作为zend framework项目一部分的cron作业脚本
我有一个zendframework项目,我需要定期运行一个脚本来上传文件夹的内容,然后再进行下载。脚本本身已经准备好了,但我正在努力找出在哪里或如何设置脚本以运行。到目前为止,我已经试过猞猁和卷发。我第一次遇到一个关于指定控制器错误的错误,我修复了这个错误,但现在我运行脚本时只得到一个空白屏幕,但文件没有上传 对于zendframework项目,如何设置由cron运行的脚本 编辑: 我的项目结构如下所示:Zend framework 如何设置作为zend framework项目一部分的cron作业脚本,zend-framework,cron,Zend Framework,Cron,我有一个zendframework项目,我需要定期运行一个脚本来上传文件夹的内容,然后再进行下载。脚本本身已经准备好了,但我正在努力找出在哪里或如何设置脚本以运行。到目前为止,我已经试过猞猁和卷发。我第一次遇到一个关于指定控制器错误的错误,我修复了这个错误,但现在我运行脚本时只得到一个空白屏幕,但文件没有上传 对于zendframework项目,如何设置由cron运行的脚本 编辑: 我的项目结构如下所示: mydomain.com application library
mydomain.com
application
library
logs
public
index.php
scripts
cronjob.php
tests
php是我需要运行的脚本。其中的前几行是:
<?php
define("_CRONJOB_",true);
require('/var/www/remotedomain.info/public/index.php');
但是,当我现在尝试运行脚本时,我得到了以下消息:
Message: Invalid controller specified (scripts).
这是否意味着我需要为此创建一个控制器?但是脚本文件夹在应用程序文件夹之外。如何修复此问题?首先,请确保将其放在PHP脚本的顶部(后面是打开的PHP标记): 如果要查看当前登录用户的当前cron作业,请执行以下操作:
$ crontab -l
或者,如果在cron.hourly、cron.weekly等文件夹中设置了cron作业,则可以通过执行以下操作查看哪些用户“拥有”这些作业:
$ cat /etc/crontab
然后在文件的底部,您将看到它们
现在,要设置cron作业,请运行以下命令打开编辑器:
$ crontab -e
然后输入您的值:
1 2 3 4 5 php /path/to/script.php
现在保存并关闭文件。显然,你将把123445
变成真实而有意义的东西。有关这方面的更多信息,请参阅(谷歌“cron”)
免责声明:我无论如何都不是cron主机。如果我错了,请纠正我的任何错误。我所做的是创建一个名为脚本的迷你应用程序。以下是结构:
Scripts
-- Jobs
-- Builds
Abstract.php //abstract each job / build inherit from
Bootstrap.php
Index.php
然后我使用php/path/to/Scripts/Index.php--j=folderScript或/path/to/Scripts/Index.php--b=folderScript作为构建脚本
然后我重载主zend_应用程序引导运行方法,如下所示
public function run()
{
$opts = new Zend_Console_Getopt(array(
'build|b-s' => 'Cron Build Script to Run',
'job|j-s' => 'Cron Job to run',
'params|p-s' => 'Parameters to set',
));
$opts->parse();
$front = $this->getResource('FrontController');
if (true === isset($opts->params)) {
parse_str($opts->params, $params);
$front->setParams($params);
}
$filter = new Zend_Filter_Word_CamelCaseToUnderscore();
if (true === isset($opts->build)) {
$build = $filter->filter($opts->build);
$className = sprintf('Scripts_Build_%s', ucfirst($build));
} else if (true === isset($opts->job)) {
$job = $filter->filter($opts->job);
$className = sprintf('Scripts_Jobs_%s', ucfirst($job));
} else {
$className = 'Scripts_Jobs_Dynamic';
}
if (false === class_exists($className)) {
throw new Exception('Class "' . $className . '" Does Not Exist');
} else {
$front->setParam('bootstrap', $this);
$logger = $this->initLogger();
$fp = fopen(DATA_PATH . '/locks/' . md5($className), 'w+');
if (!flock($fp, LOCK_EX | LOCK_NB)) {
$logger->info('Already Running');
exit(0);
}
$logger->Subject($className);
fwrite($fp, time());
try {
$class = new $className();
$class->setLogger($logger)
->init()
->run();
$logger->done('Operation Completed');
} catch (Exception $e) {
$logger->err($e->getMessage() . ' ' . $e->getTraceAsString());
$logger->done('done with error');
}
flock($fp, LOCK_UN);
}
}
希望这能让您开始,我曾考虑过在ZF中使用控制器/模块,但似乎开销太大
Symfony在其应用程序/控制台上也使用了一种很好的方法,可能值得查看其设置谢谢大家的回答。然而,对我有效的解决方案来自这个网站。原来的链接已失效,但可以在Internet存档中找到 我在这里贴了一段代码。但这不是我的解决方案。所有学分归原作者所有 cronjobs的诀窍是您不想加载整个视图 作为ZF的一部分,我们不需要任何类型的HTML输出!把这个送到 工作时,我在cronjob.php中定义了一个新常量,我将检查它 对于index.php中的 cronjob.php index.php
你能直接从命令行运行脚本吗?你问我时,我试着从命令行运行它,但它也不起作用。我收到了很多关于无法加载动态模块mhash.so的警告,还有一些不推荐的消息。
1 2 3 4 5 php /path/to/script.php
Scripts
-- Jobs
-- Builds
Abstract.php //abstract each job / build inherit from
Bootstrap.php
Index.php
public function run()
{
$opts = new Zend_Console_Getopt(array(
'build|b-s' => 'Cron Build Script to Run',
'job|j-s' => 'Cron Job to run',
'params|p-s' => 'Parameters to set',
));
$opts->parse();
$front = $this->getResource('FrontController');
if (true === isset($opts->params)) {
parse_str($opts->params, $params);
$front->setParams($params);
}
$filter = new Zend_Filter_Word_CamelCaseToUnderscore();
if (true === isset($opts->build)) {
$build = $filter->filter($opts->build);
$className = sprintf('Scripts_Build_%s', ucfirst($build));
} else if (true === isset($opts->job)) {
$job = $filter->filter($opts->job);
$className = sprintf('Scripts_Jobs_%s', ucfirst($job));
} else {
$className = 'Scripts_Jobs_Dynamic';
}
if (false === class_exists($className)) {
throw new Exception('Class "' . $className . '" Does Not Exist');
} else {
$front->setParam('bootstrap', $this);
$logger = $this->initLogger();
$fp = fopen(DATA_PATH . '/locks/' . md5($className), 'w+');
if (!flock($fp, LOCK_EX | LOCK_NB)) {
$logger->info('Already Running');
exit(0);
}
$logger->Subject($className);
fwrite($fp, time());
try {
$class = new $className();
$class->setLogger($logger)
->init()
->run();
$logger->done('Operation Completed');
} catch (Exception $e) {
$logger->err($e->getMessage() . ' ' . $e->getTraceAsString());
$logger->done('done with error');
}
flock($fp, LOCK_UN);
}
}
define("_CRONJOB_",true);
require('/var/www/vhosts/domain.com/public/index.php');
// rest of your code goes here, you can use all Zend components now!
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', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));
// 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();
}