Завершение работы shell exec() через несколько секунд


Итак, у меня есть этот код, в котором я выполняю программу на c++. $out просто содержит выходные данные программы.

$cmd = "c:/Server/www/Codice/LOGS/".$_SESSION['username']."/chorva.exe";
$out = shell_exec($cmd);
echo $out;

И это работает. Однако я хочу завершить программу через несколько секунд, скажем, через 6-10 секунд. (Это эквивалентно Ctrl-C, когда вы находитесь в терминале.) Это значит, что если программа выполняется слишком долго (или бесконечно, например, бесконечные циклы), ей не нужно ждать. Меня также беспокоит результат, который он производит за это время (если это вообще возможно). Как я могу это сделать это? Спасибо!

Author: Manu343726, 2014-07-05

1 answers

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

Я не знаю, существует ли уже какая-либо такая программа, но вы всегда можете создать свою собственную. И предположим, что вы хотите придерживаться языков сценариев, вот пример такой программы на VBScript

Dim WshShell, objFSO, oExec, cmd, wait, tempFile, objFile
Set WshShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")

wait = WScript.Arguments(0)
cmd = WScript.Arguments(1)
tempFile = objFSO.GetTempName()

Set oExec = WshShell.Exec(cmd & " > " & tempFile)

Do While oExec.Status <> 1
     WScript.Sleep 100
     wait = wait - 100
     If wait <= 0 Then Exit Do
Loop

oExec.Terminate()

Const ForReading = 1
Set objFile = objFSO.OpenTextFile(tempFile, ForReading)
Do While objFile.AtEndOfStream = False
    Wscript.Echo(objFile.ReadLine())
Loop
objFile.Close()
objFSO.DeleteFile(tempFile)

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

cscript //Nologo runcmd.vbs <time> <cmd>
 1
Author: boobl, 2014-07-05 15:13:46