2012-04-22 2 views
2

В основном, моя ситуация выглядит следующим образом.PHP работает с внешней программой, Apache висит

  1. Загрузить файл внешний процесс
  2. Выполнить на файл (который генерирует другой файл)
  3. Когда внешний процесс вниз, процесс, созданный файл.

В настоящее время в PHP я запустить программу следующим образом:

$cmd = 'cd the_directory/; ./the_program' 
system($cmd); 

Программа прекрасно работает и все, но программа в конце говорит «Нажмите Enter для выхода ...» И, таким образом, Apache висит бесконечно, поскольку эта программа ждет ввода пользователя. Наш партнер заявляет, что эта программа полностью интегрирована в их бэкэнд и не испытывает этой проблемы. До сих пор все внешние программы, которые я выполнил в PHP, выходят, не требуя ввода пользователем, который, кажется, является нормой для этой ситуации.

Мне кажется, что в коде просто не должно быть конечного сообщения, требующего ввода пользователем. Я что-то упускаю? Или есть способ обойти это? Или им просто нужно изменить свой код? Спасибо!

+1

Какая ОС вы используете? – Ted

+1

Ubuntu, работает Apache2 и PHP5 –

+0

Ubuntu? Это очень похоже на сообщение, которое вы можете получить после того, как файл Windows BAT заканчивается иногда. Weird. – James

ответ

1

Я думаю, вы должны попробовать proc_open.

С его помощью вы можете выполнять не только внешнюю команду как процесс, но и устанавливать каналы для получения и отправки информации в этот процесс.

Присмотритесь к третьему параметру этой функции и изучить пример в PHP руководстве для этой функции, где вы можете увидеть что-то вроде этого:

fwrite($pipes[0], '<?php print_r($_ENV); ?>'); 

так, вы можете написать то, что вы необходимо, чтобы входной канал процесса, который вы только что открыли.

+0

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

0

при использовании среды Windows:

$run_cmd = "cmd /c c:/app_folder/app.exe"; 
$WshShell = new COM("WScript.Shell"); 
$oExec = $WshShell->Run($run_cmd, 0, false); 

Обратите внимание, что последний будет вызывать окно процесса, чтобы закрыть на конец

Если вы используете UNIX (не проверял это сам еще):

exec('\app_folder\app &'); 
+0

Я еще не пробовал этого, но я чувствую, что добавление '&' может помешать ему зависеть от Apache, но процесс все равно будет работать бесконечно. –

Смежные вопросы