我正在使用Zend Framework 1.9.6。我想开始使用cron作业。我是新手,所以我不太清楚如何做到这一点。
我认为将我的crons存储在/myapp/scripts
或/myapp/application/cronjobs
中是个好主意。你怎么看? (我的应用程序只有一个默认模块)
一旦我决定存放它们的地方,我将如何创建脚本?假设我想访问数据库,检查更改,并将电子邮件作为报告发送。我需要使用一些Zend_Db
组件和Zend_Mail
组件,以及读取默认配置值。我想我甚至可能想要Bootstrap应用程序?但我不需要任何意见,所以我不知道这是不是最好的主意。我不知道。我该怎么办,怎么办呢?同样,我使用的是版本1.9.6,并使用Zend_Tool
命令行脚本创建了我的应用程序。
我认为有关于如何将cron作业添加到crontab文件的足够信息。 (我的网络主机也提供了一个工具,使这个很容易,所以我对这部分不是很感兴趣。)
你是否在1.8+应用程序中完成了这项工作?你有可以分享的示例脚本吗?
自发布此问题以来,我已经开始了一项新工作,并且更容易使用Zend Framework。这就是我们现在为我工作的公司所做的工作。我不是说这是最佳做法,也不是理想做法,但这些信息可能对某人有所帮助。
bin
目录以存储所有命令行脚本。bin
目录中,因此无法公开访问。此外,由于它们是命令行脚本,因此它们不使用控制器或视图。它们大多是简单的小程序脚本。我们的cron作业是手动管理的,因此我们并不总是记得我们计划运行哪些cron作业。答案 0 :(得分:4)
通过创建在所有cronjobs和网站上共享创建应用程序的功能,我发现最简单的配置与我的主站点完全相同。
我是这样做的,因为虽然可能会有更多的开销,但这并不重要(cronjob上的额外几毫秒都没有)并且由于设置完全相同,我从未遇到任何问题使用共享代码的问题。例如,添加数据库配置位于完全相同的位置,如果我添加了另一个命名空间(正如您所看到的那样),我可以全局完成。
您可以考虑做的一件事是使用不同的引导程序,这可以降低成本,因为您不引导视图(cron作业不需要)
我的设置功能(由cronjobs和主应用程序调用):
function createApplication() {
require_once 'Zend/Application.php';
$application = new Zend_Application(
APPLICATION_ENV,
CONFIG_PATH . '/application.ini'
);
$application->bootstrap();
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->registerNamespace('Search_');
return $application;
}
如上所述,在我的cronjobs中,我没有打电话给$application->run()
但是,如上所述,您可以为cronjobs使用不同的bootstraps来避免设置视图。在调用$application->bootstrap()
之前,您需要致电$application->setBootstrap()
/*
* @param $path the path to Bootstrap.php, if not set it will default to the
* application bootstrap
* @return Zend_Application
*/
function createApplication($path = null) {
require_once 'Zend/Application.php';
$application = new Zend_Application(
APPLICATION_ENV,
CONFIG_PATH . '/application.ini'
);
if ( $path ){
$application->setBootstrap($path);
}
$application->bootstrap();
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->registerNamespace('Search_');
return $application;
}
答案 1 :(得分:0)
我刚刚开始使用带有ZF2的cron作业。在过去,我会在public_html下创建一个文件夹,并经常使用cpanel调用该文件。这样工作正常,我可以很容易地在我的服务器上运行一个单独的cron作业应用程序,但是由于我是积极的ZF2会有一些事情来处理一个共同的要求。
按照目前的情况,他们这样做,并且只需要很少的代码就可以开始工作,并且在视图中无法访问crons。
花五分钟时间阅读console routing。
使用起来非常简单。我创建了一个Cron模块:
Cron
config
module.config.php
src
Cron
Controller
IndexController.php
autoload_classmap.php
Module.php
正如您所看到的,由于我们选择使用控制台路由,因此未包含任何视图且不需要,因为您可以在下面的模块中看到:
module.config.php
return array(
// Placeholder for console routes
'controllers' => array(
'invokables' => array(
'Cron\Controller\IndexController' => 'Cron\Controller\IndexController'
),
),
'console' => array(
'router' => array(
'routes' => array(
//CRON RESULTS SCRAPER
'my-first-route' => array(
'type' => 'simple', // <- simple route is created by default, we can skip that
'options' => array(
'route' => 'hello',
'defaults' => array(
'controller' => 'Cron\Controller\IndexController',
'action' => 'index'
)
)
)
),
),
),
);
IndexController file ::
<?php
// Cron/src/Cron/Controller/IndexController.php
namespace Cron\Controller;
use Zend\Mvc\Controller\AbstractActionController;
class CronController extends AbstractActionController
{
public function indexAction()
{
echo "hello";
echo "\r\n";
}
}
请记住在主配置文件中包含新模块,否则它将无效!
The autoload_classmap.php and Module.php files are standard.
现在,Zend手册中有点模糊的部分是如何从命令行调用它。
从控制台导航到trunk(或public_html)(public之前的目录)并运行:
path/to/trunk>php public/index.php hello
将输出:
hello
path/to/trunk>
如果您愿意,可以剪切并粘贴以下代码:http://collabedit.com/58v4v
如果您从未使用过控制台来运行php文件,那么基本上您需要以“php”开头,然后是“php文件名”。你可以像这样调用任何php文件......
祝你好运