Выполнение команды в фоновом режиме с помощью shell_exec () - PullRequest
0 голосов
/ 29 октября 2018

В Linux я могу использовать shell_exec(), как показано ниже, для запуска команды в background :

shell_exec("/usr/bin/nohup curl -o /dev/null --data \"$data\" $url >/dev/null 2>&1 &");

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

Как мне добиться этого на Windows? Желательно быть встроенным в Windows.

1 Ответ

0 голосов
/ 29 октября 2018

Я бы ознакомился с компонентом Symfony Process для этого варианта использования. Он предоставляет методы для выполнения синхронно и асинхронно. Его можно легко установить через Composer, но для него требуется как минимум PHP 7.1.
Документацию можно найти здесь: https://symfony.com/doc/current/components/process.html

Пример для вашего варианта использования может выглядеть следующим образом:

$process = new Process(['curl', '--data', $data, $url]);
$process->start();

Обратите внимание, что я опустил опцию -o, потому что вывод подпроцесса не будет отображаться, если вы не запросите его явно. Быстрый просмотр дал несколько сообщений, в которых говорилось, что метод start() блокируется в Windows, но кажется, что патч уже был внедрен и объединен: https://github.com/symfony/symfony/pull/10420

РЕДАКТИРОВАТЬ: Если вы не хотите использовать библиотеку, вы можете использовать комбинацию popen(), pclose() и инструмента Windows start:

pclose(popen('start /B curl --data "'.$data.'" '.$url, 'r'));

Запускает программу в фоновом режиме, не открывая окно, и сразу же возвращается.

РЕДАКТИРОВАТЬ 2: Источник для трюка с start /B: http://php.net/manual/en/function.exec.php#86329

...