Cron Jobs в приложении Zend Framework 1.8+?

Я использую Zend Framework 1.9.6. Я хочу начать использовать задания cron. Я новичок в этом, поэтому я не совсем уверен, как это сделать.

Я думаю, что было бы неплохо хранить мои cron в /myapp/scripts или /myapp/application/cronjobs. Что вы думаете? (в моем приложении есть только модуль по умолчанию)

Как только я выберу место для их хранения, как мне создать сценарий? Допустим, я хочу получить доступ к базе данных, проверить изменения и отправить электронное письмо в виде отчета. Мне нужно будет использовать некоторые компоненты Zend_Db и компоненты Zend_Mail, а также прочитать значения конфигурации по умолчанию. Думаю, я мог бы даже захотеть загрузить приложение? Но мне не нужны никакие представления, поэтому я не знаю, будет ли это лучшей идеей. Я не знаю. Что мне делать и как мне это сделать? Опять же, я использую версию 1.9.6 и создал свое приложение с помощью сценария командной строки Zend_Tool.

Я думаю, что в Интернете достаточно информации о том, как добавить задание cron в файл crontab. (Мой веб-хост также предлагает инструмент, который делает это очень простым, поэтому я не очень заинтересован в этой части).

Вы делали это в приложении 1.8+? У вас есть пример сценария, которым вы могли бы поделиться?

Решение

После публикации этого вопроса я начал новую работу и стал более комфортно работать с Zend Framework. Вот чем мы занимаемся в компании, в которой я сейчас работаю. Я не говорю, что это лучшая практика или идеал, но эта информация может быть кому-то полезна.

  • Создайте каталог верхнего уровня bin для хранения всех сценариев командной строки.
  • Создайте файл начальной загрузки CLI, который можно включить в любые сценарии командной строки, которые будут запускать приложение, чтобы у вас был легкий доступ к вашим моделям, как если бы вы работали с контроллером.
  • Все наши сценарии заданий cron находятся в каталоге bin, поэтому они недоступны для публики. Кроме того, поскольку они представляют собой сценарии командной строки, они не используют контроллеры или представления. В основном это простые небольшие процедурные скрипты. Наши задания cron управляются вручную, поэтому мы не всегда помним, какие задания cron мы запланировали запустить.

person Andrew    schedule 15.12.2009    source источник


Ответы (2)


Я обнаружил, что проще всего иметь ту же конфигурацию, что и мой основной сайт, имея функцию, которая создает приложение, совместно используемое всеми 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, чтобы избежать настройки представлений. Перед вызовом $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;
}
person Yacoby    schedule 15.12.2009
comment
Разве это не столкнется с проблемой доступности для всех (т. Е. Любой, у кого есть доступ к Интернету, может запустить эти задания cron... не будет ничего, что можно было бы увидеть, поскольку представления нет, но они все равно могут быть запущены)? - person rg88; 27.02.2011
comment
Можете ли вы объяснить, как будет выглядеть файл cronjob sh (код). Как вы его настроили? - person Adil; 01.03.2011
comment
@ gaoshan88 Убедитесь, что файл, вызываемый заданием cron, находится за пределами общедоступного каталога. - person Yacoby; 03.03.2011

Я только начал использовать задания cron с ZF2. Раньше я бы создал папку ниже public_html и часто вызывал файл с помощью cpanel. Таким образом, это прекрасно работает, и я мог бы довольно легко запустить отдельное приложение cron job на своем сервере, но это побеждает объект, поскольку я был уверен, что ZF2 будет что-то делать с общим требованием.

В нынешнем виде они работают, и для работы требуется всего несколько строк кода, а crons недоступны в представлениях.

Уделите пять минут, чтобы прочитать об консольной маршрутизации. .

Это действительно просто в использовании. Я создал модуль Cron:

Cron
    config
        module.config.php
    src
        Cron
            Controller
                IndexController.php
    autoload_classmap.php
    Module.php 

Как видите, представления не включены и не требуются, поскольку мы решили использовать маршрут console, как показано в модуле ниже:

модуль.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::

<?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 Manual, касается того, как вызывать это из командной строки.

Из консоли перейдите в trunk (или public_html) (каталог перед public) и запустите:

path/to/trunk>php public/index.php hello

Он выведет:

hello
path/to/trunk>

Если вы хотите, вы можете скопировать и вставить код с: http://collabedit.com/58v4v.

Если вы никогда раньше не использовали консоль для запуска php-файла, по сути, вам нужно начать с «php», а затем «имя php-файла». Вы можете вызвать любой файл php, подобный этому...

Удачи

person HappyCoder    schedule 22.05.2014
comment
В вопросе указан ZF1.x, который не содержит функций, предоставляемых ZF2.x. - person Tom Jowitt; 31.05.2014