Я пытаюсь запустить пару команд из PHP с Exec () и, кажется, работает только для некоторых команд, определенных в моих переменных среды Windows, но не для всех.
В моей командной строке я могу выполнить все эти команды успешно с любого пути (C: \ или E: \ что угодно)
> pear -V // ... "PEAR Version: 1.9.5" ...
> dot -V // dot - graphviz version 2.38.0 (20140413.2041)
> phpdoc -V // phpDocumentor version 2.8.1
Все они возвращают правильную версию для каждой из указанных программ, это означает, что переменные среды хорошо настроены.
Но в PHP я могу запустить только некоторые команды, остальные из них терпят неудачу:
$out = array();
$ret = '';
exec('pear -V', $out, $ret);
echo var_dump($out); // $ret = 0, $out = array ..."PEAR Version: 1.9.5" ...
exec('phpdoc -V', $out, $ret);
echo var_dump($out); // $ret = 1, $out = array ..."Could not open input file: \phpdoc" ...
exec('dot -V', $out, $ret);
echo var_dump($out); // $ret = 1, $out = empty array
Итак, я что-то упустил?
РЕДАКТИРОВАТЬ: exec () работает нормально, он работает для некоторых из моих переменных среды, таких как груша, cmd, среди других, он не работает для указанного выше
PHPDoc
точка (GraphViz)
Хотя они работают в моей командной строке и хорошо настроены в моей среде Windows.
EDIT2:
@ Стефан Цветкович
Я догадываюсь, что это та часть, которую вы хотите увидеть из результата при запуске этой команды
shell_exec ( «установить»):
Path = C: \ ProgramData \ Oracle \ Java \ javapath; C: \ Windows \ system32; C: \ Windows, C: \ Windows \ System32 \ Wbem; C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \; C: \ Program Files \ TortoiseHg \; C: \ Program Files (x86) \ Universal Extractor; C: \ Program Files (x86) \ Universal Extractor \ bin; C: \ xampp \ php; PATHEXT = .COM; .EXE; .BAT; .CMD; .VBS; .VBE; .JS; .JSE; .wsf; .wsh; .msc
Возможно ли, что php не имеет доступа к моему «точечному» пути, потому что это отсутствует в этом результате:
...C:\xampp\php;C:\xampp\php\pear\phpDocumentor\vendor\graphviz\bin
dot.exe находится в C: \ xampp \ php \ pear \ phpDocumentor \ vendor \ graphviz \ bin и хорошо настроен, так как я могу запустить > dot -V
из моей командной строки.
Я также попытался изменить свою позицию в переменной PATH без удачи.
У меня просто была такая же проблема.
В случае, если у кого-то возникла такая же проблема, обязательно перезапустите веб-сервер (apache в моей настройке), поскольку переменная PATH была установлена недавно и, следовательно, была недоступна для процесса (httpd), который был запущен до установки переменной.
Я бы попробовал использовать gettype
на массивах или переменных, которые находятся под вопросом.
За исключением этого, я бы также запустить phpinfo()
чтобы увидеть, включен ли этот элемент на вашем сервере (или php.ini, который, я уверен, вы проверили?).
Увидел несколько интересных заметок на exec Exec () и Shell Exec http://php.net/manual/en/function.shell-exec.php, где элементу нужны права администратора для запуска. Возможно, это относится?
Попробуйте использовать shell_exec()
,
На платформе Linux, например, я не могу использовать exec для извлечения данных lm-sensor, но с shell_exec я могу, и вы получите полный вывод в виде sting.
Редактировать:
Попробуй это:
$command = new COM("WScript.Shell");
$shellCommand = $command->Exec("C:\program.exe");
Теперь возьмите выход.
$standard = $shellCommand->StdOut->ReadAll; # Standard output
$error = $shellCommand->StdErr->ReadAll; # Error
Хотя через два года я оказался в такой же ситуации и нашел решение:
<?php
putenv('PATH=' . $_SERVER['PATH']);
$currentBranch = exec('git rev-parse --abbrev-ref HEAD');
Переменная окружения отсутствует по неизвестной причине в exec
вызов,
но он существует в $_SERVER['PATH']
, код просто положить его обратно, и он работает