Wie sende ich eine GET-Anfrage von PHP?

280

Ich plane, PHP für eine einfache Anforderung zu verwenden. Ich muss einen XML-Inhalt von einer URL herunterladen, für die ich eine HTTP-GET-Anforderung an diese URL senden muss.

Wie mache ich das in PHP?

Veera
quelle

Antworten:

378

Wenn Sie nicht mehr als nur den Inhalt der Datei benötigen, können Sie diese verwenden file_get_contents.

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

Für etwas komplexeres würde ich cURL verwenden .

Sasha Chedygov
quelle
3
Dies ist korrekt, es sei denn, Sie müssen Abfragezeichenfolgenparameter verwenden.
Raptor
2
@musicfreak: Abfragezeichenfolge wird manchmal von einigen Servern für Sicherheitseinstellungen ignoriert. Außerdem kann eine serverübergreifende Abfrage zu folgendem Fehler führen:failed to open stream: HTTP request failed!
Raptor
26
@ShivanRaptor: Ich bin nicht sicher, wovon Sie sprechen ... Die Abfragezeichenfolge ist nur ein Teil der Zeichenfolge. Es gibt keinen Grund, warum ein Server dies ignorieren würde. Jetzt können file_get_contentsSie die Anfrage natürlich nicht mit benutzerdefinierten Cookies, Headern und anderen Dingen stellen, die ein Browser normalerweise sendet, sodass Sie möglicherweise nicht die gesuchte Antwort erhalten. In diesem Fall ist es sowieso besser, CURL zu verwenden. (Aber das ist nicht der Fall des OP.)
Sasha Chedygov
1
Curl ist viel schneller als file_get_contents. Bevorzugen Sie Curl gegenüber file_get_contents in einer Umgebung mit hohem Datenverkehr
Deb
2
@Sasha - Ich habe dies in vielen Produktionsumgebungen erlebt, aber Sie konnten diese Links vorerst sehen: haltiko.blogspot.com/2013/02/… oder mdb9.wordpress.com/2011/03/06/…
Deb
132

Für erweiterte GET / POST-Anforderungen können Sie die CURL-Bibliothek ( http://us3.php.net/curl ) installieren :

$ch = curl_init("REMOTE XML FILE URL GOES HERE"); // such as http://example.com/example.xml
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
$data = curl_exec($ch);
curl_close($ch);
James Skidmore
quelle
10
Obwohl es wirklich nicht notwendig ist, CURL für eine "einfache Anforderung" zu verwenden, +1, weil es wirklich die beste Lösung ist, um mit HTTP-Anforderungen in PHP etwas Fortgeschritteneres zu tun.
XYZ
Wie bereits erwähnt, ist Curl viel schneller als file_get_contents(). Eine einfache 4-Buchstaben-Zeichenfolge dauerte ungefähr 10 Sekunden, während das Einrollen eine vernünftigere max. 1 Sekunde dauerte.
Peter Gordon
@pgmann Bist du dir in diesem Ergebnis sicher? Dies steht nicht im Einklang mit anderen Statistiken mit dem, was zitiert wurde. CURL ist zwar schneller, sollte aber nicht viel schneller sein. Vielleicht ist dieser Rückgang der Antwortzeit auf das serverseitige Zwischenspeichern einer Ressource usw. zurückzuführen? Vielleicht solltest du den Test wiederholen?
Rauni Lillemets
1
@Rauni Ich fürchte, ich kann nicht erneut testen, aber ich gehe immer mit cURL für die Geschwindigkeitssteigerung usw. Die Anforderungszeiten sind ungefähr, wie es sich beim Laden der Seite anfühlte. Ich habe es mehrmals versucht.
Peter Gordon
63

http_getsollte den Trick machen. Zu den Vorteilen von http_getover file_get_contentsgehört die Möglichkeit, HTTP-Header anzuzeigen, auf Anforderungsdetails zuzugreifen und das Verbindungszeitlimit zu steuern.

$response = http_get("http://www.example.com/file.xml");
William Brendel
quelle
83
Die http-Erweiterung ist nicht mit PHP gebündelt und auf gemeinsam genutzten Hosts häufig nicht verfügbar.
Imran
27
Dies erfordert pecl_http> = 0.1.0, das nicht standardmäßig installiert ist.
Raptor
5
"Die gesuchte Handbuchseite ( us2.php.net/manual/en/function.http-get.php ) ist derzeit auf diesem Server nicht verfügbar."
Pang
20

Denken Sie daran, dass Sie, wenn Sie einen Proxy verwenden, einen kleinen Trick in Ihrem PHP-Code machen müssen:

(PROXY WITHOUT AUTENTICATION EXAMPLE)

<?php
$aContext = array(
    'http' => array(
        'proxy' => 'proxy:8080',
        'request_fulluri' => true,
    ),
);
$cxContext = stream_context_create($aContext);

$sFile = file_get_contents("http://www.google.com", False, $cxContext);

echo $sFile;
?>
pepe
quelle
9

Abhängig davon, ob Ihr PHP-Setup das Öffnen von URLs zulässt, können Sie die URL auch einfach mit den get-Argumenten in der Zeichenfolge öffnen (z. B. http://example.com?variable=value ).

Edit: Re-Lektüre der Frage , die ich nicht sicher bin , ob Sie suchen Variablen zu übergeben oder nicht - wenn Sie nicht können Sie einfach die fopen Anfrage senden containg http://example.com/filename.xml - fühlen Sie sich frei um den variablen = wertteil zu ignorieren

Zxaos
quelle
5

Ich benutze dafür gerne fsockopen open.

pbreitenbach
quelle
5

Andererseits ist die Verwendung der REST-API anderer Server in PHP sehr beliebt. Angenommen, Sie suchen nach einer Möglichkeit, einige HTTP-Anforderungen auf den anderen Server umzuleiten (z. B. eine XML-Datei abzurufen). Hier ist ein PHP-Paket, das Ihnen hilft:

https://github.com/romanpitak/PHP-REST-Client

Also, die XML-Datei bekommen:

$client = new Client('http://example.com');
$request = $client->newRequest('/filename.xml');
$response = $request->getResponse();
echo $response->getParsedResponse();
Mostafa
quelle
5

Guzzle ist eine sehr bekannte Bibliothek, die es extrem einfach macht, alle Arten von HTTP-Aufrufen durchzuführen. Siehe https://github.com/guzzle/guzzle . Installieren mit composer require guzzlehttp/guzzleund ausführen composer install. Jetzt reicht der folgende Code für einen http-Aufruf.

$client = new \GuzzleHttp\Client();
$response = $client->get('https://example.com/path/to/resource');

echo $response->getStatusCode();
echo $response->getBody();
Mark Baaijens
quelle