Я не могу заставить 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», и он пуст.
Настройка выглядит следующим образом:
- Windows 7
- XAMPP
- PHP ver 5.3.5
- wget последняя версия здесь
- PHP
safe_mode
выключен
wget установлен в "C: \ Program Files (x86) \ GnuWin32 \ bin", и он добавляется впеременная PATH Windows.
Я знаю, что настройка 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 (идентификатор процесса и т. д.).
ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ:
Получил работу благодаря предложению Crontab и использовал абсолютный путь для вызова wget
, также заключил его в двойные кавычки.
Используется WSHCOM-объект для запуска вместо простого 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), метод проверки ОС может быть не лучшим и т. д.