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

Използвам Zend Framework 1.9.6. Искам да започна да използвам cron задания. Нов съм в това, така че не съм съвсем сигурен как да направя това.

Мисля, че би било добра идея да съхранявам моите crons в /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 не са нищо) и тъй като настройката беше абсолютно същата, никога не се натъквах на никакви проблеми, използвайки споделен код. Например add database config е точно на същото място и ако добавя друго пространство от имена (както виждате, че съм го направил), мога да го направя глобално.
Единственото нещо, което можете да обмислите да направите, е да използвате различно bootstrapper, което би намалило разходите, тъй като не стартирате изгледите (от което 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
Можете ли да обясните как би изглеждал sh файлът на cronjob (код). Как го настроихте? - person Adil; 01.03.2011
comment
@gaoshan88 Уверете се, че файлът, който се извиква от заданието на cron, е извън публично достъпната директория - person Yacoby; 03.03.2011

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

В сегашния си вид те го правят и са необходими много няколко реда код, за да работят, а crons не са достъпни в изгледи.

Отделете пет минути, за да прочетете за конзолно маршрутизиране .

Наистина е лесен за използване. Създадох модул 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 ::

<?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 file name". Можете да извикате всеки php файл като този...

Късмет

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