URL-Requests mit PHP

PHP bietet in der Regel gleich mehrere Möglichkeiten, um selbst URL-Requests durchzuführen. Ein Request ist dabei nichts anderes, als der Aufruf einer URL, nur eben von deinem Webserver und mit PHP.

In diesem Artikel zeige ich Dir, wie Du das mit PHP Streams oder curl() hinbekommst.

file_get_contents() und PHP Streams verwenden

Mit der Funktion file_get_contents() können Inhalte einer Datei abgefragt werden. Doch die Funktion kann noch viel mehr. Du kannst auch ganz einfach eine URL als ersten Parameter übergeben und die Antwort der Website (z.B. den Quelltext) zurückgeben lassen, wenn fopen_wrappers erlaubt sind.

Der folgende Code etwa gibt Dir, wenn dein Server entsprechend konfiguriert ist, den Quelltext von WWW Coding zurück:

echo file_get_contents('http://www-coding.de');

Bitte beachte, dass der Request-Handler, immer angegeben werden muss. Ein http(s):// muss also vor der URL platziert werden. Möchtest Du https verwenden, so muss einfach nur das ’s‘ hinzugefügt werden. Du musst aber auf keinen Fall, wozu wir gleich kommen, das ‚http‘ im Stream ändern.

Was ist nun aber wenn wir einen PHP-Post-Request senden möchten? POST wird häufig für Formulare verwendet. Solltest Du kein POST verwenden, so wird PHP „GET“ für dich auswählen.

Um solche Requests durchzuführen, musst Du einen Stream erstellen. Das kannst Du mit stream_content_create() tun. Hier direkt einmal ein Beispiel:

$stream = array(
                 'http' => array(
                                  'method' =>     'POST',
                                  'header' =>        "User-Agent: ".$_SERVER['HTTP_USER_AGENT']."\r\n" .
                                                                        "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n" .
                                                                        "Accept-Charset: UTF-8,ISO-8859-1;q=0.7,*;q=0.7\r\n" .
                                                                        "Cache-Control: no-cache\r\n" .
                                                                        "Cache-Control: no-cache\r\n" .
                                                                        "Accept-language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3\r\n" .
                                                                        "DNT: 1\r\n",
                                  'content' =>    "field1=wort1+wort2&field2=true&field3=10"
                                                        )
                        );

echo file_get_contents('https://meinewebsite.de/formular/', false, stream_context_create($stream));

Das sieht nach einer ganzen Menge Code aus. Und das ist es auch. Deswegen gehen wir das jetzt noch einmal gemeinsam durch.

Wir geben mit diesen Skript den Rückgabe-Wert einer Website aus. Die Website, die wir in diesem Fall aufrufen ist https://meinewebsite.de/formular/. Der zweite Parameter für file_get_contents() ist auf false gesetzt, weil er mit dem include_path zu tun hat. Den benötigen wir aber nicht bei URL-Abfragen.

Als dritten Parameter übergeben wir einen Stream, den wir aus dem Array $stream erstellen lassen. Dieses Arrays ist besonders wichtig. Es enthält alle Header, die wir übergeben wollen und, wenn es sich um einen POST-Request handelt zusätzlich POST-Parameter.

Das Array selbst enthält den Index http, der auch im Falle einer https gleich bleibt, also ohne ’s‘. Dieser wiederum enthält ein Array, welches die Index-Werte method, header und content beinhaltet.

Mit method bestimmen wir die Methode, also, z.B. GET (einfacher URL-Aufruf) oder POST (Übergeben von Werten, z. B. beim Senden eines Formulars).

Der Index header enthält alle Header nach folgendem Schema: "Header-Name: Wert\r\n". Da es sich bei \r\n um Steuerungszeichen handelt, solltest Du für diese Zeichenketten immer doppelte Anführungszeichen in PHP verwenden.

In unserem Beispiel leiten wir etwa den User-Agent des Nutzers, der die Website mit diesem Code aufruft, an die Website weiter. Du kannst aber auch einen beliebigen User-Agent angeben. Die weiteren Header habe ich einfach mal aus dem normalen Request eines Browsers übernommen.

Interessant ist noch der DNT-Header. Mit dem Wert 1 legen wir fest, dass wir nicht getrackt oder verfolgt werden möchten.

Einige APIs, zum Beispiel die Twitter API, benötigen zusätzliche Header. Die kannst Du einfach auf diesem Wege festlegen und somit mitsenden.

Verbleibt nur noch der content-Index. Diesen benötigen wir in unserem Fall hauptsächlich bei POST-Requests. Wie es auch bei GET-Parametern üblich ist, können hier mehrere Parameter und deren Werte angegeben werden, bitte verwende dafür urlencode(). Ein Beispiel gefällig?

feld1=wort1+wort2&feld2=true&feld3[]=wert1&feld3[]=wert2

URL-Request Funktion für PHP

Download Button
Download: Url Request Funktion (PHP)

Ich habe Dir außerdem eine kleine Funktion gebastelt mit der Du recht einfach einen URL-Request in PHP auslösen kannst. Auf den anderen Server wird es dabei vermutlich so wirken, als handele es sich um einen normalen Nutzer.

Dennoch solltest Du nicht einfach automatisiert beliebige Seiten crawlen/abfragen. Wenn du derartiges regelmäßig tust, bist Du mit einer Genehmigung durch den anderen Webmaster auf der sicheren Seite.

Die Funktion kannst Du kostenlos downloaden und frei verwenden. Sie kann mit mehreren Parametern aufgerufen werden und bietet die Möglichkeit, einen eigenen User-Agent zu definieren, POST/GET auszuwählen, POST-Parameter zu übermitteln ($content) und zusätzliche Header zu definieren.

Schau Dir am besten die Beispiele an, die in der Datei enthalten sind, um zu verstehen, wie Du die Funktion verwenden kannst.

cURL in PHP verwenden

Wenn Du mit PHP und Streams arbeitest, wie oben gezeigt, hast Du bereits eine ganze Menge Möglichkeiten. Noch mehr bietet cURL.

Dieses Zusatz-Modul ist zwar nicht auf allen Servern installiert, doch das Gros unterstützt diese Bibliothek. Ob das auch für deinen Server gilt, kannst du mit phpinfo(); überprüfen.

Ein cURL-Aufruf kann beispielsweise so aussehen:

$ch = curl_init("http://url-der-website.de"); // cURL ínitialisieren
curl_setopt($ch, CURLOPT_HEADER, 0); // Header soll nicht in Ausgabe enthalten sein
curl_setopt($ch, CURLOPT_POST, 1); // POST-Request wird abgesetzt
curl_setopt($ch, CURLOPT_POSTFIELDS, 'feld1=wort1+wort2&feld2=true'); // POST-Felder festlegen, die gesendet werden sollen
curl_exec($ch); // Ausführen
curl_close($ch); // Objekt schließen und Ressourcen freigeben

Wir initialisieren zunächst cURL mit der gewünschten URL (1). Dann setzen wir mehrere cURL-Optionen: der Header soll nicht in der Ausgabe enthalten sein (2), es handelt sich um einen POST-Request (3), wir übergeben die POST-Felder (4), führen den Request aus (5) und löschen zuletzt das Objekt (6).

Mit den cURL-Optionen hast Du noch jede Menge Möglichkeiten, sodass etwa Cookies gesendet werden können oder die PUT-Methode verwendet werden kann.

Und da PUT zur Dateiübertragung dient, zeigt sich hieran auch, dass cURL auch das Senden und Empfangen von Dateien beherrscht.

Dateien von einem anderen Server auf den eigenen downloaden

Mit cURL könnten wir also theoretisch auch eine Datei von einem anderen Server downloaden und auf unserem eigenen Server speichern. Aber dafür gibt es auch noch eine andere, und wie ich finde bessere, Möglichkeit in PHP.

Du kannst dafür das bereits erwähnte file_get_contents() im Zusammenspiel mit file_put_contents() verwenden:

file_put_contents('pfad/zur/lokaler/datei.txt', file_get_contents('http://example.com/pfad/zur/datei.txt'));

Das Beispiel sollte selbsterklärend sein, trotzdem hier noch einmal die Kurzfassung: http://example.com/pfad/zur/datei.txt wird heruntergeladen und in pfad/zur/lokaler/datei.txt gespeichert.

Fazit

Wie Dir dieser Artikel gezeigt hat, bietet PHP gleich mehrere Möglichkeiten, um GET- und POST-Requests auszulösen. Mit POST-Requests kannst Du dann sogar das Abschicken eines Formulars simulieren.

Entscheidend ist in jedem Fall, egal ob bei den Streams oder cURL, dass dein Server die entsprechenden Voraussetzungen erfüllt. Bei den meisten kostenpflichtigen Hostern sollte dies aber der Fall sein – und dann kannst Du ohne Probleme und entweder mit cURL, mit meiner urlRequest-Funktion oder einer eigenen Variante URL-Requests in PHP ausführen.