Запустить отдельную бесконечную работу в Symfony - PullRequest
0 голосов
/ 27 ноября 2018
  • Symfony: 4.1
  • PHP: 7.1

У меня есть работающий сервер веб-сокетов, использующий Ratchet .Сама веб-розетка работает плавник.Я могу запустить его из терминала, используя команды Symfony

php bin/console app:websocket:execute

У меня возникают проблемы при решении некоторых из этих проблем:

  1. Вам необходимо посвятитьтерминал для запуска этой команды
  2. Большинство служб веб-хостинга не предоставляют вам доступ к терминалу
  3. Я хочу, чтобы администраторы могли включать и выключать сервер веб-сокетов
  4. Администраторам не обязательно знать, что такое терминал

. Для выпуска 1 я пытаюсь использовать этот «отсоединяемый» чит, но он не решает проблему 2:

php bin/console app:websocket:execute > /dev/null 2>&1 &

Для решения всех четырех вопросов.Я пытался использовать процесс.но проблемы с этим подходом:

  • $process->run() - запуск процесса с php bin/console всегда заканчивается тайм-аутом
  • $process-start() - запуск процесса означает, что он выполняется асинхронно, но это также означает, что процесс завершается после завершения запроса, что также завершает работу моего сервера веб-сокетов.

Вот пример

$process = new Process("php bin/console");
$process->setWorkingDirectory(getcwd() . "/../");
$process->setTimeout(10);
$process->run(); // Stalls for 10 seconds, then throws timeout exception
$process-start(); // Doesn't stall, but terminates at end of request

// $process->run() ==== unreachable code
if (!$process->isSuccessful()) {
    throw new ProcessFailedException($process);
}

Я попытался создать консольное приложение,и запустить команду оттуда.но здесь применимы те же проблемы, что и к процессу.

$application = new Application($this->kernel);
$application->setAutoExit(false);

$input = new ArrayInput(array(
    'command' => 'app:websocket:execute'
));

try {
    $ob = new BufferedOutput();
    $application->run($input, $ob);
    $output = $ob->fetch();
} catch (\Exception $e) {
    return null;
}

В качестве окончательного варианта я попробовал пакет с именем DtcQueueBundle , поскольку в нем упоминается следующее:

Простота использования

  • Отключение фоновых задач с одной или двумя строками кода
  • Простое добавление фоновых рабочих служб
  • Превращение любого кода в фоновую задачус несколькими строками

Итак, я сделал то, что они просили, создал работника и попытался запустить его как «фоновую задачу»

use App\Ratchet\ForumUpdater;
use Ratchet\Http\HttpServer;
use Ratchet\Server\IoServer;
use Ratchet\WebSocket\WsServer;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class SocketWorker extends \Dtc\QueueBundle\Model\Worker
{
    public function execute()
    {
        $server = IoServer::factory(
            new HttpServer(
                new WsServer(
                    new ForumUpdater()
                )
            ),
            8080
        );

        $server->run();

        return "Websocket started";
    }

    public function getName()
    {
        return "websocket-server";
    }
}

Ихдокументы являются абсолютным худшим!Я даже пытался копаться в их коде, чтобы начать работу изнутри моего контроллера.Но я не мог заставить его работать автономно.

Что бы ни случилось, я считаю, что моя команда не выполняется, потому что она захватывает мой поток PHP.Я хотел бы знать, возможно ли отсоединить этот бесконечный процесс?Можно ли даже запустить два экземпляра PHP вместе?Я бы так подумал!

Спасибо за любую помощь, извините за длинный пост

...