Ich habe diese Parameter, um eine XML-Datei herunterzuladen:
wget --http-user=user --http-password=pass http://www.example.com/file.xml
Wie muss ich das in PHP verwenden, um diese XML-Datei zu öffnen?
Wenn Sie lediglich den Inhalt in Ihre Anwendung laden möchten, müssen Sie nicht einmal wget
verwenden:
$xmlData = file_get_contents('http://user:[email protected]/file.xml');
Beachten Sie, dass diese Funktion nicht funktioniert, wenn allow_url_fopen
in der php.ini oder der Webserverkonfiguration (z. B. httpd.conf) deaktiviert ist (standardmäßig aktiviert).
Wenn Ihr Host dies explizit deaktiviert oder wenn Sie eine Bibliothek schreiben, empfiehlt es sich, entweder cURL oder eine Bibliothek zu verwenden, die die Funktionalität abstrahiert, beispielsweise Guzzle .
use GuzzleHttp\Client;
$client = new Client([
'base_url' => 'http://example.com',
'defaults' => [
'auth' => ['user', 'pass'],
]]);
$xmlData = $client->get('/file.xml');
wget
wget
ist ein Linux-Befehl, kein PHP - Befehl. Um dies auszuführen, müssen Sie exec
verwenden. Dies ist ein PHP -Befehl zum Ausführen von Shell-Befehlen.
exec("wget --http-user=[user] --http-password=[pass] http://www.example.com/file.xml");
Dies kann nützlich sein, wenn Sie eine große Datei herunterladen - und den Fortschritt überwachen möchten. Wenn Sie jedoch mit Seiten arbeiten, an denen Sie nur an dem Inhalt interessiert sind, gibt es einfache Funktionen, die genau dies tun.
Die exec
-Funktion ist standardmäßig aktiviert, kann jedoch in einigen Situationen deaktiviert sein. Die Konfigurationsoptionen hierfür befinden sich in Ihrem php.ini
. Um diese zu aktivieren, entfernen Sie exec
aus der disabled_functions
-Konfigurationszeichenfolge.
alternative
Mit file_get_contents
können wir den Inhalt der angegebenen URL/URI abrufen. Wenn Sie die Datei nur in eine Variable einlesen müssen, ist dies die perfekte Funktion, um curl zu verwenden. Befolgen Sie die URI-Syntax , wenn Sie Ihre URL erstellen.
// 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");
Wie von Sean the Bean
vermerkt, müssen Sie möglicherweise auch ändern allow_url_fopen
um true
in Ihrer php.ini zuzulassen, um die Verwendung einer URL in dieser Methode zuzulassen, sollte dies standardmäßig true sein.
Wenn Sie diese Datei dann lokal speichern möchten, gibt es eine Funktion file_put_contents
, um diese in eine Datei zu schreiben, kombiniert mit der vorherigen. Dies könnte einen Dateidownload emulieren:
file_put_contents("local_file.xml", $content);
Sie können curl
verwenden, um die Daten abzurufen und identifiziert zu werden ( für "basic" und "digest" auth ), ohne dass erweiterte Berechtigungen erforderlich sind (wie exec oder 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);
Ihr Ergebnis wird dann in der Variable $result
gespeichert.
viele in PHP verfügbare Methoden, um eine Datei wie exec, file_get_contents, curl und fopen zu lesen, hängen jedoch von Ihren Anforderungen und Dateiberechtigungen ab
Besuchen Sie diese file_get_contents vs cUrl
Grundsätzlich file_get_contents für Sie
$data = file_get_contents($file_url);
Wenn Sie Curl in PHP verwenden ...
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;
?>
Diese Methode ist nur eine Klasse und erfordert nicht das Importieren anderer Bibliotheken oder das Wiederverwenden von Code.
Ich persönlich verwende dieses Skript, das ich vor einiger Zeit erstellt habe. hier aber für diejenigen, die nicht auf diesen Link klicken möchten, können Sie ihn unten anzeigen. Der Entwickler kann die statische Methode HTTP::GET($url, $options)
verwenden, um die Methode get in curl zu verwenden, während er benutzerdefinierte Curl-Optionen durchlaufen kann. Sie können auch HTTP::POST($url, $options)
verwenden, aber ich verwende diese Methode kaum.
/**
* 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 ist ein großartiges Werkzeug für die Verwendung der Befehlszeile in PHP!
Ihr Beispiel kann sehr einfach und lesbar gemacht werden:
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));
}
?>
benutzen:
<?php
wget(URL, FileName);
?>
Ich verstehe, dass Sie eine XML-Datei mit PHP öffnen möchten. Das wird aufgerufen, um eine XML-Datei zu analysieren. Die beste Referenz ist hier.
Um den Befehl wget in PHP auszuführen, müssen Sie folgende Schritte ausführen:
1) Erlauben Sie dem Apache-Server die Verwendung des Befehls wget, indem Sie ihn der Sudoers-Liste hinzufügen.
2) Prüfen Sie, ob die Funktion "exec" aktiviert ist oder in Ihrer PHP - Konfiguration vorhanden ist.
3) Führen Sie den Befehl "exec" als Root-Benutzer aus, d. H. Sudo-Benutzer
Nachfolgendes Codebeispiel gemäß Ubuntu-Gerät
#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");