web-dev-qa-db-fra.com

Comment utiliser wget en php?

J'ai ces paramètres pour télécharger un fichier XML:

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

Comment je dois utiliser cela en php pour ouvrir ce fichier XML?

28
Donatas Veikutis

Si l'objectif est simplement de charger le contenu dans votre application, vous n'avez même pas besoin d'utiliser wget:

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

Notez que cette fonction ne fonctionnera pas si allow_url_fopen est désactivé (activé par défaut) dans php.ini ou dans la configuration du serveur Web (par exemple, httpd.conf).

Si votre hôte le désactive explicitement ou si vous écrivez une bibliothèque, il est conseillé d'utiliser cURL ou une bibliothèque qui résume la fonctionnalité, telle que Guzzle .

use GuzzleHttp\Client;

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

$xmlData = $client->get('/file.xml');
31
Ja͢ck

wget

wget est une commande linux, pas une commande PHP. Pour l'exécuter, vous devez utiliser exec , qui est une commande PHP pour l'exécution des commandes Shell.

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

Cela peut être utile si vous téléchargez un fichier volumineux et que vous souhaitez surveiller la progression. Toutefois, lorsque vous travaillez avec des pages dans lesquelles vous ne vous intéressez qu'au contenu, vous disposez de fonctions simples.

La fonction exec est activée par défaut, mais peut être désactivée dans certaines situations. Les options de configuration pour cela résident dans votre php.ini, pour l'activer, supprimez exec de la chaîne de configuration disabled_functions.

alternative

En utilisant file_get_contents , nous pouvons récupérer le contenu de l’URL/URI spécifié. Lorsque vous avez juste besoin de lire le fichier dans une variable, il s’agit de la fonction idéale à utiliser pour remplacer curl - suivez la syntaxe URI lors de la construction de votre 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");

Comme indiqué par Sean the Bean - vous devrez peut-être aussi changer allow_url_fopen à true dans votre php.ini pour permettre l'utilisation d'une URL dans cette méthode, cependant, cela devrait être vrai par défaut.

Si vous voulez ensuite stocker ce fichier localement, il existe une fonction file_put_contents pour l'écrire dans un fichier, combiné au précédent, cela pourrait émuler un téléchargement de fichier:

file_put_contents("local_file.xml", $content);
44
Matt Clark

Vous pouvez utiliser curl afin de récupérer les données et d'être identifié ( pour "basic" et "digest" auth ), sans nécessiter d'autorisations étendues (telles que exec ou 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);

Votre résultat sera alors stocké dans la variable $result.

9
Adam

de nombreuses méthodes disponibles en php pour lire un fichier tel que exec, file_get_contents, curl et fopen, mais cela dépend de votre condition et de la permission du fichier.

Visitez cette file_get_contents vs cUrl

Pour l'essentiel, file_get_contents pour vous

$data = file_get_contents($file_url);
1
Navneet Garg

Si vous utilisez Curl en 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
Ravi Chauhan

Cette méthode n'est qu'une classe et ne nécessite pas l'importation d'autres bibliothèques ou la réutilisation de code.

Personnellement, j'utilise ce script que j'ai créé il y a quelque temps. Situé ici mais pour ceux qui ne veulent pas cliquer sur ce lien, vous pouvez le voir ci-dessous. Il permet au développeur d'utiliser la méthode statique HTTP::GET($url, $options) pour utiliser la méthode get en boucle tout en pouvant passer à travers les options de boucle personnalisées. Vous pouvez également utiliser HTTP::POST($url, $options) mais j'utilise à peine cette méthode.

/**
  *  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
Austin Kregel

Shellwrap est un excellent outil pour utiliser la ligne de commande en PHP!

Votre exemple peut être fait assez facilement et lisible:

use MrRio\ShellWrap as sh;

$xml = (string)sh::curl(['u' => 'user:pass'], 'http://example.com/file.xml');
1
Limon Monte
<?php
function wget($address,$filename)
{
  file_put_contents($filename,file_get_contents($address));
}
?>

utilisation:

<?php
wget(URL, FileName);
?>
0
Seyyed AMir

Je comprends que vous souhaitiez ouvrir un fichier XML à l’aide de php. Cela s'appelle analyser un fichier XML. La meilleure référence est ici.

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

0
user1888089

Pour exécuter la commande wget dans PHP, vous devez suivre les étapes suivantes:

1) Autorisez le serveur Apache à utiliser la commande wget en l’ajoutant à la liste des sudoers.

2) Vérifiez que la fonction "exec" est activée ou existe dans votre configuration PHP.

3) Exécuter la commande "exec" en tant qu’utilisateur root, c’est-à-dire utilisateur Sudo

Échantillon de code ci-dessous selon la machine Ubuntu

#Add Apache in sudoers list to use wget command
~$ Sudo nano /etc/sudoers
#add below line in the sudoers file
www-data ALL=(ALL) NOPASSWD: /usr/bin/wget


##Now in PHP file run wget command as 
exec("/usr/bin/Sudo wget -P PATH_WHERE_WANT_TO_PLACE_FILE URL_OF_FILE");
0
vinod