Непоследовательные результаты запуска внешнего скрипта Python из PHP shell_exec

У меня проблема с получением непротиворечивого результата (иногда я получаю вывод скрипта python, иногда нет) с помощью shell_exec () или exec () в PHP для скрипта python, который работает 100% времени из командной строки. Мое предположение (необоснованное) заключается в том, что по какой-то причине php не ждет результата от сценария python до закрытия процесса, но я не уверен.

Заметка Я использую nginx / php5-fpm (не apache)

Обновить Я также добавляю проверку здравомыслия, которая также ДЕЛАЕТ Работа

 #sanity.py
import sys
sanity = sys.argv[1]
print "You are totally " + sanity

echo shell_exec(escapeshellcmd("/usr/bin/python sanity.py sane"));

У меня есть следующий код в PHP, который вызывает команду, которая запускает скрипт Python …

$command = escapeshellcmd("/usr/bin/python app.py $var1 $var2")
session_write_close();
shell_exec($command);

Сценарий Python (очень упрощенный)

import sys

var1 = sys.argv[1]
var2 = sys.argv[2:]

print some_function(var1,var2)

Теперь … когда я запускаю эту команду из командной строки следующим образом …

python app.py 1234 asdf

Я получаю результаты без каких-либо проблем. Тем не менее, код PHP только иногда возвращает результат (без какой-либо реальной причины, почему только иногда).

Кроме того, я написал следующий код в качестве альтернативы, и я получаю похожие или те же результаты … иногда это работает, иногда ничего не возвращает …

$command = escapeshellcmd("/usr/bin/python /var/app/" . $command);

$pipes = array();
$descriptors = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("pipe", "w"),
);
session_write_close();
$process = proc_open($command, $descriptors, $pipes) or die("Can't open process $command!");

$output = "";
while (!feof($pipes[2])) {
$read = array($pipes[2]);
stream_select($read, $write = NULL, $except = NULL, 0);
if (!empty($read)) {
$output .= fgets($pipes[2]);
}
}

fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);

proc_close($process);

return $output;

Есть ли способ решить проблему, что происходит, или решить эту проблему, чтобы она работала согласованно?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru