PHP - Symfony - Процесс прекращается сразу после выполнения - PullRequest
0 голосов
/ 15 апреля 2020

Я использую приложение, которое проксирует соединение между сервером и клиентом для соединения VN C.
Итак, я хотел бы запустить это приложение через компонент процесса Symfony в PHP.
Laravel Framework используется в этом проекте и пытается запустить приложение, запрашивая страницу (маршрут).

Проблема в том, что приложение должно работать непрерывно в фоновом режиме. Выходные данные процесса, запущенного из CMD.exe, приведены ниже:

websockify run from CMD.exe

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

    $process = new Process(['websockify.exe', '7777', '127.0.0.1:5901']);
    $process->start();
    $process->waitUntil(function ($type, $output) {
        echo $output;
        return strpos($output, 'proxying from');
    });

Вывод: output

Но процесс прекращается после того, как я получил этот вывод. Я просто хочу, чтобы он работал непрерывно в фоновом режиме.

Я также пытался с $process->run();, но запрашиваемая страница продолжает ждать завершения приложения до истечения времени ожидания. (Процесс выполняется успешно, но не может завершить запрос страницы)

Я пытался использовать функцию exe c (с / без > /dev/null 2>&1 &);

exec('websockify.exe 7777 127.0.0.1:5901 > /dev/null 2>&1 &');

Но все так же, как компонент Process , Он немедленно завершает процесс.
Также попробовал следующий код, но не повезло.

    $process = new Process(['websockify.exe', '7777', '127.0.0.1:5901', '&']);
    $process->disableOutput();
    $process->setTimeout(1800);
    $process->start();

В качестве резюме, я хотел бы запустить процесс, который должен продолжать работать в фоновом режиме в PHP.

Среда: Windows 10 и сервер WAMP
PHP версия: 7.4.0
Laravel версия: v7.6.1
Symfony Версия процесса: v5.0.7

Ссылка GitHub для приложения, которое я использовал: websockify

1 Ответ

0 голосов
/ 16 апреля 2020

Я решил проблему. Приложение запускается в другом потоке.

$process = Process::fromShellCommandline('wmic process call create "<FilePath>websockify.exe 7777 127.0.0.1:5901"');
$process->start();

Теперь вывод:

output

Я могу использовать «ProcessId» для обработки таких процессов, как остановка, проверка, запущен ли он.

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

PS: Это решение для Windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...