Проблема с использованием команды PHP exec для выполнения командного файла - PullRequest
0 голосов
/ 02 июня 2009

Я пытаюсь заставить PHP вызвать пакетный файл, который возьмет RTF-файл и преобразует его в PDF с помощью макроса OpenOffice. Я проверил командный файл в командной строке, и он отлично работает, но мне не повезло звонить и использовать тот же командный файл из PHP.

Операционная система моего компьютера - XP Professional SP 3. Я использую IIS 6 и PHP версии 5.2.9. Я предоставил права на выполнение пользователю Интернета на c: \ windows \ system32 \ cmd.exe. Я указал полный путь к исполняемому пакетному файлу и полный путь к файлу RTF, который необходимо преобразовать.

PHP выглядит так, где $ arg - это RTF для преобразования:

$arg = "C:\\web_root\\whatever\\tempOutput.rtf";
$command = "c:\\windows\\system32\\cmd.exe /c c:\\web_root\\whatever\\convert.bat $arg";

Затем внутри try-catch я вызываю команду exec:

exec("$command 2>&1 && exit", $ret, $err);

Я повторяю результаты после улова:

echo "ret: ";
print_r ($ret);
print "<br>";
echo "err is ";
echo $err;
print "<br>";
echo "DONE!";

И вот что я вижу:

ret: Array ( ) 
err is 0
DONE!

RTF-файл не конвертируется, и я не вижу ошибок. Любые идеи о том, что я могу попробовать дальше? Спасибо !!!

Ответы [ 4 ]

1 голос
/ 02 июня 2009

Используете ли вы IIS в качестве веб-сервера? Если это так, функция exec PHP не будет работать по умолчанию, и вам НЕ следует обходить меры безопасности, которые мешают ее запуску.

Проверьте программу просмотра событий, и вы найдете ошибки, относящиеся к вашей проблеме. Запустите запрос через Google для: IIS PHP Exec. Это должно дать вам большой выбор информации о проблеме.

По сути, exec-функция PHP пытается создать новый экземпляр cmd.exe. IIS запрещает это, поскольку может открыть дыру в безопасности системы.

Лучшее решение, которое я придумал, - это чтобы ваш php-скрипт либо записал команду, которую вы хотите выполнить, в простой файл, либо сделал запись в базе данных. Затем вам нужно будет написать отдельный скрипт, который запускается планировщиком Windows для запуска каждые 10 минут или около того, который будет проверять ваш плоский файл или базу данных на наличие команд для запуска. После этого новый сценарий запустит команды и разместит либо результаты, либо подтверждение выполнения, к которому ваше веб-приложение сможет получить доступ позже.

Это наверняка.

1 голос
/ 02 июня 2009

Держу пари, что речь идет о разрешениях.

В типичной установке PHP работает как apache - так что вам нужно убедиться, что apache имеет права на выполнение командного файла.

также проверьте этот соответствующий вопрос и этот поиск в Google .

1 голос
/ 02 июня 2009

Похоже, выходной массив пуст. Ваш пакетный скрипт должен иметь вывод?

Также следует использовать escapeshellcmd и escapeshellarg

0 голосов
/ 02 июня 2009

PHP работает в безопасном режиме? Если это так, команды оболочки экранируются с помощью escapeshellcmd . Возможно, это проблема?

У вас есть контроль над сервером, на котором выполняется скрипт PHP?

...