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?
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');
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);
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
.
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);
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;
?>
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;
}
}
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');
<?php
function wget($address,$filename)
{
file_put_contents($filename,file_get_contents($address));
}
?>
utilisation:
<?php
wget(URL, FileName);
?>
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.
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");