Cron Jobs в приложении Zend Framework 1.8+? - PullRequest
3 голосов
/ 15 декабря 2009

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

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

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

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

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

Решение

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

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

Ответы [ 2 ]

4 голосов
/ 15 декабря 2009

Мне показалось, что проще всего иметь ту же конфигурацию, что и на моем главном сайте, с помощью функции, которая создала приложение, совместно используемое всеми 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;
}
0 голосов
/ 22 мая 2014

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

Как есть, так и есть, и очень мало строк кода, и cron не доступны в представлениях.

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

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

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

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

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 ::

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

Из консоли перейдите к транку (или public_html) (каталог перед общедоступным) и выполните:

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

Будет выведено:

hello
path/to/trunk>

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

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

Удачи

...