Функции PHP exec () и system () всегда возвращают false в IIS - PullRequest
1 голос
/ 02 апреля 2010

Я пытаюсь использовать PHP exec () или system () (или любую другую подобную функцию) для запуска пакетного файла, но я не могу заставить их что-либо вернуть.

Самый простой пример, который я видел, это то, что ничего не выводит:

<?php
    echo system('dir');
?>

Сценарий выполняется на компьютере с Windows XP на IIS с установленным PHP, и я также пробовал его на моей учетной записи общего хостинга под управлением Windows 2003 Server / IIS.

Кто-нибудь может подсказать, что мне нужно сделать, чтобы это работало, или предоставить какие-либо команды, которые я могу использовать для устранения неполадок?

Приветствия

Tom

Редактировать: второй пример

Основываясь на ответе pavun_cool, я попробовал следующее:

<?php
    $last_line = system('dir', $retval);
    echo 'last_line '.$last_line.'<br/> retval '.$retval;
?>

Вывод:

last_line
retval -1

Редактировать: третий пример

На основе Маноса Дилаверакиса я попробовал следующий код

<?php
exec('dir', $response);
foreach($response as $line) {
    echo $line . "<br>";
}
?>

Вывод:

<br>

т.е. пустая строка при отображении в браузере.

Также, глядя на php.ini, следующая строка (которая предположительно могла бы отключить эти функции) пуста:

disable_functions =

У кого-нибудь есть еще предложения или что-нибудь еще, что я могу попробовать?

Ответы [ 3 ]

1 голос
/ 29 октября 2018

При работе с Windows и PHP некоторые команды (включая dir и другие команды Windows, такие как ping) не выводят свои возвращаемые значения должным образом в двоичный файл php.exe. Например, попытка получить dir для вывода с помощью функции PHP shell_exec() всегда приведет к «false». Если вы попытаетесь присвоить ему значение типа dir c:\, это приведет к: NULL, что похоже на FALSE в том смысле, что оно не дает ничего полезного. ЕДИНСТВЕННЫЙ обходной путь - использовать встроенный в PHP scandir() и создать собственную версию dir вручную с PHP.

1 голос
/ 02 апреля 2010

Для получения возвращаемых значений вам нужно передать второй аргумент для системной функции.

$last_line = system('ls', $retval);

Здесь $retval будет иметь возвращаемое значение выполнения ls.

0 голосов
/ 02 апреля 2010

Здесь, если это не работает, возможно, exec отключен в php.ini, что означает, что вам придется изменить конфигурацию PHP

<?php
exec('dir', $response);
foreach($response as $line) {
    echo $line . "<br>";
}
?>
...