PHP на компьютере с Windows; Запуск процесса в фоновом режиме


Я ищу лучший или любой другой способ действительно запустить процесс с php в фоновом режиме, чтобы я мог убить его позже в сценарии.

Прямо сейчас я использую: shell_exec(команда$); Проблема в том, что он ждет закрытия программы.

Я хочу что-то, что будет иметь тот же эффект, что и nohup, когда я выполняю команду оболочки. Это позволит мне запустить процесс в фоновом режиме, чтобы позже в сценарии его можно было закрыть. Мне нужно закрыть его, потому что это скрипт будет выполняться регулярно, и программа не может быть открыта при его запуске.

Я думал о создании файла .bat для запуска команды в фоновом режиме, но даже в этом случае, как мне позже завершить процесс?

Код, который я видел для linux:

$PID = shell_exec("nohup $Command > /dev/null & echo $!");
// Later on to kill it
exec("kill -KILL $PID");

РЕДАКТИРОВАТЬ: Оказывается, мне не нужно убивать процесс

Author: Mobiler, 2010-01-15

5 answers

Поможет ли эта функция из руководства по PHP ?

function runAsynchronously($path,$arguments) {
    $WshShell = new COM("WScript.Shell");
    $oShellLink = $WshShell->CreateShortcut("temp.lnk");
    $oShellLink->TargetPath = $path;
    $oShellLink->Arguments = $arguments;
    $oShellLink->WorkingDirectory = dirname($path);
    $oShellLink->WindowStyle = 1;
    $oShellLink->Save();
    $oExec = $WshShell->Run("temp.lnk", 7, false);
    unset($WshShell,$oShellLink,$oExec);
    unlink("temp.lnk");
}
 4
Author: Alix Axel, 2010-01-15 01:30:47

shell_exec('start /B "C:\Path\to\program.exe"');

Параметр /B здесь является ключевым.

Кажется, я больше не могу найти, где я это нашел. Но это работает для меня.

 9
Author: Jelmer, 2016-10-05 20:51:28

Пытался добиться того же на сервере Windows 2000 с PHP 5.2.8.

Ни одно из решений не сработало для меня. PHP продолжал ждать ответа.

Нашел решение следующим образом:

$cmd = "E:\PHP_folder_path\php.exe E:\some_folder_path\backgroundProcess.php";
pclose(popen("start /B ". $cmd, "a"));  // mode = "a" since I had some logs to edit
 2
Author: Rohit, 2013-04-12 07:55:02

Из руководства по php для exec:

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

Т.Е. передайте вывод в файл, и php не будет его ждать:

exec('myprog > output.txt');

По памяти я полагаю, что есть управляющий символ, который вы можете добавить (как вы сделайте с @) для семейства команд exec, которое также предотвращает приостановку выполнения - не могу вспомнить, что это такое.

Редактировать Нашел его! В unix программы, выполняемые с добавлением &, будут выполняться в фоновом режиме. Извините, но это вам не очень поможет.

 1
Author: Adam Hopkinson, 2010-01-14 22:15:28

На моих компьютерах с Windows 10 и Windows Server 2012 единственным решением, которое надежно работало в pclose/popen, был вызов команды запуска powershell, как в:

pclose(popen('powershell.exe "Start-Process foo.bat -WindowStyle Hidden"','r'));

Или более подробно, если вы хотите предоставить аргументы и перенаправить выходные данные:

pclose(popen('powershell.exe "Start-Process foo.bat 
             -ArgumentList \'bar\',\'bat\' 
             -WindowStyle Hidden
             -RedirectStandardOutput \'.\\console.out\' 
             -RedirectStandardError \'.\\console.err\'"','r'));
 1
Author: Mike Godin, 2017-05-26 18:46:38