WGET в Windows через PHP exec () не работает - PullRequest
2 голосов
/ 27 марта 2012

Я не могу заставить 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), метод проверки ОС может быть не лучшим и т. д.

1 Ответ

1 голос
/ 27 марта 2012

Попробуйте использовать абсолютный путь к wget - это, вероятно, не в пути вашего скрипта. Чтобы не использовать абсолютный путь, вы можете попробовать добавить putenv("PATH=<whatever-paths-you-need-colon-delimited>"); в ваш скрипт перед тем, как получить доступ к wget. Другим способом было бы напрямую изменить переменную среды PATH любого пользователя, на котором работает ваш веб-сервер (и, следовательно, любого пользователя, запускающего интерпретатор PHP).

...