#php #exec
#php #exec
Вопрос:
Если я запускаю процесс с помощью exec (), как я могу позже завершить этот процесс, скажем, нажатием / отправкой клавиши «q». Прямо сейчас, когда я выполняю процесс, PHP будет зависать, пока он не завершится и не вернется.
Ответ №1:
function PsExec($commandJob) {
$command = $commandJob.' > /dev/null 2>amp;1 amp; echo $!';
exec($command ,$op);
$pid = (int)$op[0];
if($pid!="") return $pid;
return false;
}
позже…
exec(«kill -9 $ pid», $output);
Комментарии:
1. Привет, Кристо, мне было интересно, не мог бы ты развить свое предложение и помочь мне настроить его под мои нужды. 1. Не могли бы вы объяснить, что происходит с «amp; echo $!» частью «> /dev /null 2>amp;1 amp; echo $! «Возможно, если бы вы могли объяснить все это, это могло бы быть полезным, чтобы я мог убедиться, что я нахожусь на той же странице. 2. Мне нужно отправить вывод ошибки в определенный файл. Я не уверен, как заставить приведенную выше строку кода сделать это и заставить ее все еще работать. Спасибо за вашу помощь.
2. Хехе, Джейсон, если ты хочешь перенаправить на файл, тебе определенно не нужен такой синтаксис! Я думаю, все, что вы хотите, это:
3. Упс, извините, проблема с вводом выше… Если вы хотите перенаправить на файл, вам определенно не понадобится такой синтаксис! Я думаю, все, что вам нужно, это: $command = $commandJob.’ >> myParticularLogFile.txt 2>myParticularErrLogFile.txt amp; echo $!’; 2>amp;1 просто перенаправляет stderr на amp;1, который, в свою очередь, является сокращением для /dev / null в моем сообщении. amp; echo $! forks (amp;) echo $! для вывода pid, чтобы вы могли сохранить его. Вам нужен pid, чтобы иметь возможность завершить работу позже.
4. почему бы просто не обновить свой ответ вместо добавления в комментарии?
Ответ №2:
если вы хотите, чтобы ваш скрипт завершался независимо от того, выполнено ли выполнение, вы можете перенаправить вывод, помещенный в другой файл,
exec("php dothis.php >> file.log");
я надеюсь, что это поможет вам
Комментарии:
1. Ибрагим, спасибо тебе за это предложение. Мне, однако, нужен способ завершить процесс, запущенный с помощью exec, и я не думаю, что это решило бы проблему.
Ответ №3:
Вы могли бы использовать pcntl_fork
и pcntl_exec
для запуска вашей программы и posix_kill
для ее завершения.
Ответ №4:
Если я запускаю процесс с помощью exec (), как я могу позже завершить этот процесс, скажем, нажатием / отправкой клавиши «q».
Вместо использования exec
вы могли бы посмотреть на использование proc_open
, которое требует, чтобы вы передавали массив, определяющий три потока — один для stdin
, один для stdout
и один для stderr
.
Это позволит вам легко вводить входные данные в программу во время обработки выходных данных, не блокируя просто ожидание его выполнения. Вы можете позже использовать proc_terminate
, чтобы жестоко убить его, если это необходимо.
Комментарии:
1. Привет, Чарльз, спасибо за твое предложение. Я никогда раньше не использовал proc_open, и у меня возник вопрос, на который, я надеюсь, вы сможете ответить за меня. Было бы правильно сказать, что «дескриптор массива» предназначен для процесса, выполняемого командой. а массив pipels — это то, как php-скрипт будет взаимодействовать с новым процессом? Также дескриптор ресурса автоматически закрывается в конце скрипта, или вам нужно закрыть его вручную?