Как использовать wget в php?

У меня есть эти параметры для загрузки XML-файла:

wget --http-user=user --http-password=pass http://www.example.com/file.xml

Как я должен использовать это в PHP для открытия этого xml-файла?

27
@Adam Это определенно работает - доказательство ; и я не вижу этого конкретного требования в документации.
добавлено автор Ja͢ck, источник
@ nl-x Я думаю, что выбранный ответ (@Jack) предоставляет URI с аутентификацией, которая не документирована (и может быть не работает?): документация по PHP говорит, что вам нужно использовать stream_context_create , когда аутентификация необходимо с помощью file_get_contents()
добавлено автор Adam, источник
@ nl-x Для auth basic он работает, но не для auth-digest.
добавлено автор Adam, источник
добавлено автор Ravi Chauhan, источник

9 ответы

<Сильный> Wget

wget is a linux command, not a PHP command, so to run this you woud need to use exec, which is a PHP command for executing shell commands.

exec("wget --http-user=[user] --http-password=[pass] http://www.example.com/file.xml");

Это может быть полезно, если вы загружаете большой файл и хотите отслеживать прогресс, однако при работе со страницами, в которых вас интересует только контент, есть простые функции для этого.

Функция exec включена по умолчанию, но может быть отключена в некоторых ситуациях. Параметры конфигурации для этого находятся в php.ini , чтобы включить, удалить exec из строки конфигурации disabled_functions .

<Сильный> альтернатива

Используя file_get_contents , мы можем получить содержимое указанного URL/URI. Когда вам просто нужно прочитать файл в переменной, это будет идеальной функцией для использования в качестве замены для завивки - следуйте за Синтаксис URI при создании URL-адреса.

// standard url
$content = file_get_contents("http://www.example.com/file.xml");

// or with basic auth
$content = file_get_contents("http://user:[email protected]/file.xml");

As noted by Sean the Bean - you may also need to change allow_url_fopen to true in your php.ini to allow the use of a URL in this method, however, this should be true by default.

Если вы хотите сохранить этот файл локально, есть функция file_put_contents , чтобы записать это в файл в сочетании с предыдущим, это может эмулировать загрузку файла:

file_put_contents("local_file.xml", $content);
42
добавлено
Спасибо за отзывы, у меня на самом деле была эта проблема раньше! Я обновил ответ, чтобы включить этот факт, спасибо! : D
добавлено автор Matt Clark, источник
Отличное объяснение! Отвечает на вопрос и дает альтернативу, которая может быть лучше, с примерами обоих. Это должен быть принятый ответ. Также ничего не стоит, что allow_url_fopen должен быть включен в вашем php.ini или иначе file_get_contents не будет принимать URL-адрес.
добавлено автор Sean the Bean, источник
работает только в том случае, если PHP разрешено выполнять exec
добавлено автор I WAS BANNED BY SOME SNOWFLAKE, источник
Отличное объяснение, кстати. Я очень ценю этот ответ. Предотвратили от выполнения еще 2 поисковых запросов.
добавлено автор ihaveitnow, источник

Если целью является просто загрузить содержимое внутри вашего приложения, вам даже не нужно использовать wget :

$xmlData = file_get_contents('http://user:[email protected]/file.xml');

Обратите внимание, что эта функция не будет работать, если allow_url_fopen отключен (он включен по умолчанию) внутри php.ini или конфигурации веб-сервера (например, httpd.conf).

Если ваш хост явно отключает его или если вы пишете библиотеку, рекомендуется использовать cURL или библиотеку, которая абстрагирует функциональность, такую как Guzzle .

use GuzzleHttp\Client;

$client = new Client([
  'base_url' => 'http://example.com',
  'defaults' => [
    'auth'    => ['user', 'pass'],
]]);

$xmlData = $client->get('/file.xml');
30
добавлено
Лучший вариант - это отвлечь его на самом деле :)
добавлено автор Ja͢ck, источник
Я думаю, что cURL - лучший вариант, чем file_get_contents. Потому что allow_url_fopen всегда проблема. С точки зрения безопасности это может быть «0».
добавлено автор Ranjith Siji, источник

Вы можете использовать curl для того, чтобы как получить данные, так и идентифицироваться ( для «базового» и «дайджест» auth ), не требуя расширенных разрешений (например, exec или allow_url_fopen).

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/file.xml");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_USERPWD, "user:pass");
$result = curl_exec($ch);
curl_close($ch);

Затем ваш результат будет сохранен в переменной $ result .

9
добавлено
Обратите внимание, что даже если на него не влияет allow_url_fopen, для этого требуется расширение cURL.
добавлено автор Ja͢ck, источник

Shellwrap is great tool for using the command-line in PHP!

Ваш пример можно сделать довольно легко и легко:

use MrRio\ShellWrap as sh;

$xml = (string)sh::curl(['u' => 'user:pass'], 'http://example.com/file.xml');
1
добавлено

Если вы используете Curl в PHP ...

function disguise_curl($url) 
{ 
  $curl = curl_init(); 

 //Setup headers - I used the same headers from Firefox version 2.0.0.6 
 //below was split up because php.net said the line was too long. :/ 
  $header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,"; 
  $header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"; 
  $header[] = "Cache-Control: max-age=0"; 
  $header[] = "Connection: keep-alive"; 
  $header[] = "Keep-Alive: 300"; 
  $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7"; 
  $header[] = "Accept-Language: en-us,en;q=0.5"; 
  $header[] = "Pragma: ";//browsers keep this blank. 

  curl_setopt($curl, CURLOPT_URL, $url); 
  curl_setopt($curl, CURLOPT_USERAGENT, 'Googlebot/2.1 (+http://www.google.com/bot.html)'); 
  curl_setopt($curl, CURLOPT_HTTPHEADER, $header); 
  curl_setopt($curl, CURLOPT_REFERER, 'http://www.google.com'); 
  curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate'); 
  curl_setopt($curl, CURLOPT_AUTOREFERER, true); 
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
  curl_setopt($curl, CURLOPT_TIMEOUT, 10); 

  $html = curl_exec($curl);//execute the curl command 
  curl_close($curl);//close the connection 

  return $html;//and finally, return $html 
} 

// uses the function and displays the text off the website 
$text = disguise_curl($url); 
echo $text; 
?> 
1
добавлено

множество методов, доступных в PHP для чтения файла типа exec, file_get_contents, curl и fopen, но это зависит от вашего требования и разрешения файла

Visit this file_get_contents vs cUrl

В основном file_get_contents для вас

$data = file_get_contents($file_url);
1
добавлено

Этот метод является только одним классом и не требует импорта других библиотек или повторного использования кода.

Лично я использую этот сценарий, который я сделал некоторое время назад. Находите здесь , но для тех, кто не хочет нажимать на эту ссылку, вы можете просмотреть ее ниже. Он позволяет разработчику использовать статический метод HTTP :: GET ($ url, $ options) , чтобы использовать метод get в curl, имея возможность проходить через пользовательские параметры завивки. Вы также можете использовать HTTP :: POST ($ url, $ options) , но я вряд ли использую этот метод.

/**
  *  echo HTTP::POST('http://accounts.kbcomp.co',
  *      array(
  *            'user_name'=>'[email protected]',
  *            'user_password'=>'demo1234'
  *      )
  *  );
  *  OR
  *  echo HTTP::GET('http://api.austinkregel.com/colors/E64B3B/1');
  *                  
  */

class HTTP{
   public static function GET($url,Array $options=array()){
    $ch = curl_init();
    if(count($options>0)){
       curl_setopt_array($ch, $options);
       curl_setopt($ch, CURLOPT_URL, $url);
       $json = curl_exec($ch);
       curl_close($ch);
       return $json;
     }
   }
   public static function POST($url, $postfields, $options = null){
       $ch = curl_init();
       $options = array(
          CURLOPT_URL=>$url,
          CURLOPT_RETURNTRANSFER => TRUE,
          CURLOPT_POSTFIELDS => $postfields,
          CURLOPT_HEADER => true
          //CURLOPT_HTTPHEADER, array('Content-Type:application/json')
          ); 
       if(count($options>0)){
           curl_setopt_array($ch, $options);
       }
       $json = curl_exec($ch);
       curl_close($ch);
       return $json;
   }
}
1
добавлено
Вам не нужно устанавливать CURLOPT_CUSTOMREQUEST для чего-то стандартного, такого как POST; просто установите CURLOPT_POSTFIELDS , и он автоматически установит правильный метод ... также вы можете использовать curl_setopt_array() вместо циклов.
добавлено автор Ja͢ck, источник
Это очень верно, я сделал это, когда впервые узнал о завитке и о том, как это работает. В то время я не знал о curl_setopt_array() , я обновляю свой ответ только потому, что я был ленив, чтобы обновить мой фактический скрипт, чтобы использовать этот метод: 3
добавлено автор Austin Kregel, источник

Я понимаю, что вы хотите открыть XML-файл, используя php. Это вызвано для анализа XML-файла. Лучше всего здесь.

http://php.net/manual/de/function.xml-parse.php

0
добавлено
<?php
function wget($address,$filename)
{
  file_put_contents($filename,file_get_contents($address));
}
?>

использовать:

<?php
wget(URL, FileName);
?>
0
добавлено
Пожалуйста, добавьте некоторые объяснения, как этот ответ помогает OP или другим лицам в исправлении текущей проблемы вместо публикации только кода в качестве ответа. Спасибо
добавлено автор ρяσѕρєя K, источник
Вопрос требует использования http-аутентификации, который этот ответ не охватывает. Повторное внедрение wget в PHP следует избегать, если в системе уже существует wget .
добавлено автор apokryfos, источник
phpGeeks
phpGeeks
3 620 участник(ов)

Best PHP chat Еще: @dbGeeks - базы данных @phpGeeksJunior - новичкам @moscowProgers - IT Москва @ebanoePhp - весёлый канал о PHP @laravel_pro - Laravel @jobGeeks - вакансии @jsChat - JS Правила: https://t.me/phpGeeks/764859 ДР - 28.03.2016

PHP
PHP
1 309 участник(ов)

Группа про современный PHP. Обсуждаем ООП, TDD, BDD, DDD, SOLID, GRASP и прочие крутые базворды Для ознакомления: https://gist.github.com/mkusher/711bd46f0b62fbae851182e6fb3b1839 Группа PHP для новичков @phpGeeksJunior Вакансии: https://t.me/fordev

PHP — вакансии, поиск работы и аналитика
PHP — вакансии, поиск работы и аналитика
1 251 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению PHP, Laravel, Symfony, Yii и т.д. Здесь всё: full-time, part-time, remote и разовые подработки. См. также: @qa_jobs, @devops_jobs, @javascript_jobs, @nodejs_jobs, @uiux_jobs, @products_jobs

phpGeeksJunior
phpGeeksJunior
980 участник(ов)

Группа для новичков. Не стесняйтесь задавать вопросы по php. Не флудить!!!! Правила и полезные ссылки https://gist.github.com/exileed/a53dd0617b35a705ff44b38c8028e6a5 Бест от пхпгикс https://t.me/best_of_phpgeeks

phpclub.ru
phpclub.ru
872 участник(ов)

Официальный чат phpclub.ru - остерегайтесь подделок #rules Правила группы - уважайте друг друга. Скриншоты -> ссылками. Код -> pastebin.com. Вакансии строго -> https://goo.gl/4bNxym, в чат ссылку. За рекламу и мат - БАН!

Devall | PHP
Devall | PHP
272 участник(ов)

Пристанище для восходящих звёзд разработки, которые перейдут на более адекватные языки. http://combot.org/chat/-1001014863761 Инвайт: j.mp/devallphp