Intereting Posts
Laravel – ввод формы – множественный выбор для отношения одного к другому Тип поля календаря Joomla 2.5 в пользовательских формах выбора даты и времени Microsoft® ODBC Driver 11 для SQL Server® на RedHat Linux с PHP – дает ошибку, когда параметр привязки с PDO для хранимых процедур Разбивка страницы с помощью Twig и Eloquent-5.2 Таймер для онлайн-экзаменационной системы для хранения времени для каждого отдельного раздела Прокрутите каждый ключ и значение многомерного массива php Возможно ли найти ширину и высоту изображения с помощью PHP DOM? Неопределенное смещение 1, массив в php Чтение метаданных PDF в PHP Как я могу загрузить более 50 МБ mp4 видео в codeigniter? IP-адрес машины в PHP дает :: 1, но почему? Как я могу очистить сайт с недопустимым HTML Простая система входа с использованием CodeIgniter, возвращающая 404 при входе в систему jQuery Validator Plugin – проверка существующего имени пользователя и электронной почты в базе данных mysql Неустранимая ошибка: нельзя использовать смещение строки в виде массива

WGET в Windows с помощью PHP exec () не работает

Я не могу заставить 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», и это добавляется в переменную 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-интерпретатор).