#php #cron #symfony
#php #cron #symfony
Вопрос:
(Symfony3)
Я играю с идеей настроить несколько простых задач cron для создания отчетов о безопасности для наших менеджеров проектов, чтобы они могли планировать время обновления для разработчиков (или я забываю запускать их вручную).).
В качестве очень простой проверки я просто выполню…
php bin/console security:check
… чтобы узнать, что композитор может сказать об уязвимостях. В конечном итоге я хотел бы отправить этот вывод в электронное письмо или отправить его в задание slack channel или basecamp при запуске cron.
Проблема
Когда я запускаю команду с помощью терминала, она отлично работает. Выполнение команды внутри контроллера всегда возвращает ответ «Файл блокировки не существует«. Я предполагаю, что это относится к композитору.файл блокировки в корне проекта. Я могу подтвердить, что этот файл действительно существует.
Ниже приведен контроллер, который я использую в настоящее время, который адаптирован из этого:
http://symfony.com/doc/current/console/command_in_controller.html
<?php
namespace Treetop1500SecurityReportBundleController;
use SymfonyBundleFrameworkBundleControllerController;
use SymfonyBundleFrameworkBundleConsoleApplication;
use SymfonyComponentConsoleInputArrayInput;
use SymfonyComponentConsoleOutputBufferedOutput;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentHttpKernelExceptionUnauthorizedHttpException;
class DefaultController extends Controller
{
public function indexAction($key)
{
if ($key != $this->getParameter('easy_cron_key')) {
throw new UnauthorizedHttpException("You are not authorized to access this page.");
}
$kernel = $this->get('kernel');
$application = new Application($kernel);
$application->setAutoExit(false);
$input = new ArrayInput(array(
'command' => 'security:check'
));
// You can use NullOutput() if you don't need the output
$output = new BufferedOutput();
$application->run($input, $output);
// return the output, don't use if you used NullOutput()
$content = $output->fetch();
// return new Response(""), if you used NullOutput()
return new Response($content);
}
}
$content
всегда имеет значение «Файл блокировки не существует».
Я понимаю, что, вероятно, есть лучшие инструменты и способы сделать это, однако мне бы очень хотелось понять, почему это сгенерированный ответ из этого действия контроллера. Спасибо, что посмотрели!
Ответ №1:
Передайте абсолютный путь к composer.lock
файлу точно так же:
php bin/console security:check /path/to/another/composer.lock
Итак, в вашем примере это будет:
$input = new ArrayInput([
'command' => 'security:check',
'lockfile' => '/path/to/another/composer.lock'
]);
Подробнее: SecurityCheckerCommand от SensioLabs. Необязательный аргумент — это lockfile
, который проверяется SecurityChecker . В строке 46 они ищут composer.lock
файл (аргумент по умолчанию) и выдают исключение, когда они не найдены.
PS Ранее я вводил неправильные параметры в массив. Я проверил документацию Symfony (как вызывать другие команды) и исправил ответ.
Комментарии:
1. На самом деле это не работает и выдает ошибку
[SymfonyComponentConsoleExceptionCommandNotFoundException] Command "security:check XXX/XXX/../composer.lock" is not defined. Did you mean one of these? security:check security:encode-password
2. Мой плохой, исправлен ответ.
Ответ №2:
Решение этой проблемы заключается в передаче аргумента lockfile объекту ArrayInput следующим образом:
$lockfile = $this->get('kernel')->getRootDir()."/../composer.lock";
$input = new ArrayInput(array('command'=>'security:check','lockfile'=>$lockfile));