<?php
namespace App\EventListener;
use Symfony\Component\HttpKernel\Event\TerminateEvent;
class RunCommandListener
{
/**
* @var string
*/
public const ATTR_COMMAND = 'tmb.cmd';
/**
* @var string
*/
private $dir;
/**
* RunCommandListener constructor.
*
* @param string $dir
*/
public function __construct(string $dir)
{
$this->dir = $dir;
}
/**
* @param TerminateEvent $event
*/
public function onKernelTerminate(TerminateEvent $event): void
{
if (! $event->isMasterRequest()) {
return;
}
$request = $event->getRequest();
if (! $request->attributes->has(self::ATTR_COMMAND)) {
return;
}
$cmd = $request->attributes->get(self::ATTR_COMMAND);
if (empty($cmd)) {
return;
}
$this->runInBackground((string) $cmd);
}
/**
* @param string $cmd
*/
protected function runInBackground(string $cmd): void
{
$noHupCommand = sprintf('bash -c "exec nohup setsid %s/bin/console %s > /dev/null 2>&1 &"',
$this->dir,
$cmd
);
exec($noHupCommand);
}
}