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