Cron Jobs在Zend Framework 1.8+应用程序中?

时间:2009-12-15 19:30:39

标签: zend-framework cron

我正在使用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目录以存储所有命令行脚本。
  • 创建一个“CLI bootstrap”文件,该文件可以包含在任何命令行脚本中,这些脚本将引导应用程序,以便您可以像使用控制器一样轻松访问模型。
  • 我们所有的cron作业脚本都位于bin目录中,因此无法公开访问。此外,由于它们是命令行脚本,因此它们不使用控制器或视图。它们大多是简单的小程序脚本。我们的cron作业是手动管理的,因此我们并不总是记得我们计划运行哪些cron作业。

2 个答案:

答案 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文件......

祝你好运