Консольное приложение из сайта на Symfony2

в 18:48, , рубрики: php, symfony2, web-разработка, Веб-разработка, метки: , ,

    Наворотили моделей, конфигурацию, и еще кучу завязанной на фреймворк бизнес-логики на вашем сайте, а потом вдруг оказалось, что нужно добавить несколько скриптов, которые бы запускались по крону для решения тяжелых задач? Давайте попробуем сделать так чтобы весь этот функционал, в т.ч. контроллеры, можно было запускать из консольного скрипта. Данный способ представляет из себя компромисс между практичностью и гипертрофированным чувством прекрасного, свойственным архитектуре Symfony в целом.

1. Создаем контроллер

Чтобы писать код нашего скрипта так же, как и в остальном веб-приложении, нам нужен контроллер.

php app/console generate:controller --no-interaction --controller=CronBundle:CronController

На том пока с контроллером и закончим.

2. Создаем маршруты

Создадим маршрут для экшена в котором будет находиться логика. Откроем routes.yml и добавим:

  cron_action:
    pattern: /cron/cron_action
    defaults: { _controller: CronBundle:Cron:cron }

3. Правим контроллер

Код контроллера должен быть примерно таким:

<?php
namespace AppCronBundleController;
use SymfonyComponentHttpFoundationResponse;

class CronController extends Controller {

    public function __construct() {

        /* 
           проверяем что контроллер вызывается из скрипта а не через http-запрос,
           вместо 'cron_script.php' подставьте имя файла скрипта который будет запускаться
           через cron 
        */
        if ($_SERVER["SCRIPT_NAME"] != "cron_script.php") {
            print("disallowed");
            exit();
        }
    }

    public function cronAction() {

       /* здесь логика вашего скрипта */

       // чтобы не было ошибки
       return new Response('');
    }
}

4. Создаем скрипт для запуска

В корневой директории проекта, там где находится src/, создайте папку с названием scripts, а в ней файл с именем cron_script.php. Его содержимое должно быть таким:

<?php

use SymfonyComponentClassLoaderApcClassLoader;
use SymfonyComponentHttpFoundationRequest;

$loader = require_once __DIR__.'/../app/bootstrap.php.cache';
require_once __DIR__.'/../app/AppKernel.php';
$kernel = new AppKernel('prod', false);
$kernel->loadClassCache();

// вместо '/cron/cron_action' должно быть URL маршрута который вы выбрали для экшена с логикой,
// именно URL, а не имя маршрута
$request = Request::create('/cron/cron_action');
$response = $kernel->handle($request);
$response->send();

$kernel->terminate($request, $response);

Этот файл и нужно будет подсунуть крону.Теперь можно использовать всю мощь Symfony и во вспомогательных скриптах.

Автор: PerlPower

Источник

Поделиться

* - обязательные к заполнению поля