Я не могу заставить wget
работать при вызове с PHP через exec()
.
Код:
exec('wget -b --timeout=300 --no-check-certificate -O c:\wgetlog.txt http://localhost/project/someparam/somevalue > c:\wgetout.txt')
Вызываемый URL-адрес – это действие из проекта, основанного на Zend Framework, который манипулирует некоторыми данными в базе данных MySQL.
Когда это выполняется, создается только «c: \ wgetout.txt» и пуст.
Настройка выполняется следующим образом:
safe_mode
отключен wget установлен в «C: \ Program Files (x86) \ GnuWin32 \ bin», и это добавляется в переменную Windows PATH.
Я знаю, что установка wget работает, потому что при запуске вышеуказанного параметра exec (как эхо)
wget -b --timeout=300 --no-check-certificate -O c:\\wgetlog.txt http://localhost/project/someparam/somevalue > c:\\wgetout.txt
в командной строке он работает нормально, я получаю ожидаемые результаты в базе данных и создаются оба файла «C: \ wgetlog.txt» и «C: \ wgetout.txt», причем последний содержит вывод wget (идентификатор процесса , и т.д).
ПОСЛЕДНИЙ РЕДАКТ:
Получил это работу благодаря предложению Кронтаба и использовал абсолютный путь для вызова wget
, также заключил его в двойные кавычки.
Использованный объект WSH COM для запуска его вместо простого exec()
.
Кроме того, в Windows параметр -b
не работает, если выход не перенаправлен где-то. Поскольку я не особо интересуюсь выходом, я направил его в > NUL 2>&1
(сюда также входят ошибки).
Я быстро сделал эту функцию, чтобы помочь мне протестировать мой проект на компьютере с Windows и работать с wget
, так что вот оно, на тот случай, если кто-нибудь найдет это полезным:
public function execWget($URL, $intTimeout = 30, $blnInBackground = true) { if (preg_match("/Win/i", PHP_OS)) { $runCommand = '"C:\Program Files (x86)\GnuWin32\bin\wget" ' . ($blnInBackground?'-b ':'') . '--timeout=' . (int)$intTimeout . ' --no-check-certificate ' . $URL . ($blnInBackground?' > NUL 2>&1':''); $WshShell = new COM("WScript.Shell"); $oExec = $WshShell->Run($runCommand, 7, false); } else { $runCommand = 'wget ' . ($blnInBackground?'-b ':'') . '--timeout=' . (int)$intTimeout . ' --no-check-certificate ' . ($blnInBackground?'-O /dev/null ':'') . $URL . ($blnInBackground?' > /dev/null 2>&1':''); exec($runCommand); } }
Имейте в виду, что он настроен для моей собственной установки (абсолютный путь к wget
), он предназначен только для тестирования (используется только для Windows-машины для тестирования, на самом деле производственная машина работает под управлением Linux), метод проверки ОС может быть не лучшим, и т. Д.
Попробуйте использовать абсолютный путь к wget
– это, вероятно, не в пути вашего скрипта. Чтобы избежать использования абсолютного пути, вы можете попробовать добавить putenv("PATH=<whatever-paths-you-need-colon-delimited>");
в вашем скрипте перед доступом к wget
. Другим способом было бы напрямую изменить переменную среды PATH любого пользователя, использующего ваш веб-сервер (и, следовательно, любой пользователь запускает PHP-интерпретатор).