Zend framework 如何设置作为zend framework项目一部分的cron作业脚本

Zend framework 如何设置作为zend framework项目一部分的cron作业脚本,zend-framework,cron,Zend Framework,Cron,我有一个zendframework项目,我需要定期运行一个脚本来上传文件夹的内容,然后再进行下载。脚本本身已经准备好了,但我正在努力找出在哪里或如何设置脚本以运行。到目前为止,我已经试过猞猁和卷发。我第一次遇到一个关于指定控制器错误的错误,我修复了这个错误,但现在我运行脚本时只得到一个空白屏幕,但文件没有上传 对于zendframework项目,如何设置由cron运行的脚本 编辑: 我的项目结构如下所示: mydomain.com application library

我有一个zendframework项目,我需要定期运行一个脚本来上传文件夹的内容,然后再进行下载。脚本本身已经准备好了,但我正在努力找出在哪里或如何设置脚本以运行。到目前为止,我已经试过猞猁和卷发。我第一次遇到一个关于指定控制器错误的错误,我修复了这个错误,但现在我运行脚本时只得到一个空白屏幕,但文件没有上传

对于zendframework项目,如何设置由cron运行的脚本

编辑: 我的项目结构如下所示:

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();
}