Как запустить работу cron с помощью zend framework 2

У меня есть приложение, встроенное в Zend Framework 2. Я хотел бы установить задание cron для обновления моих продуктов. Я знаю, что сценарии, такие как это, должны запускаться из-за пределов общедоступной папки, но, к сожалению, мой script в cron должен использовать файлы фреймворка.
Как я могу это сделать?
Единственный способ, которым я понял, - запустить script из-за пределов общей папки, затем добавить хэш или пароль и перенаправить на

www.domain.com/cron/test

Итак, у меня будут все функциональные возможности.
Будет ли это безопасно? Может быть, есть другой способ?

Ответ 1

Я настоятельно рекомендую использовать CLI для такого требования.

  • Создайте ConsoleController с помощью updateAction() внутри модуля приложения.
  • Добавьте консольный маршрут в ваш прикладной модуль module.config.php:

    array(
        'router' => array(
            'routes' => array(
            ...
            )
        ),
    
    'console' => array(
        'router' => array(
            'routes' => array(
                'cronroute' => array(
                    'options' => array(
                        'route'    => 'updateproducts',
                        'defaults' => array(
                            'controller' => 'Application\Controller\Console',
                            'action' => 'update'
                        )
                    )
                )
            )
        )
    )
    );
    
  • Теперь откройте терминал и

    $ cd /path/to/your/project
    $ php public/index.php updateproducts
    

Вот и все. Надеюсь, что это поможет.

Ответ 2

Я нашел решение в collabnet (который теперь мертв).

Я копирую решение здесь, так как ColabEdit иногда удаляет сообщения:

<?php
/*
Cron directory setup:

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

NOTES: Remember to include the Cron module in the main config file (trunk/config/application.config.php)

Once you have the route in place, write your cron and call it from your webhost cron manager.

*/

// Cron/config/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'
                        )
                    )
                )

            ),
        ),
    ),


);

<?php
// Cron/src/Cron/Controller/IndexController.php
namespace Cron\Controller;

use Zend\Mvc\Controller\AbstractActionController;

class IndexController extends AbstractActionControlle
{
    public function indexAction()
    {
        echo "hello";
        echo "\r\n";
    }
}

From the console navigate to trunk (or public_html) (the directory before public) and run:

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

hello
path/to/trunk>