Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP
Code

Techniken zum Mastering von cURL

by
Difficulty:IntermediateLength:LongLanguages:

German (Deutsch) translation by Alex Grigorovich (you can also view the original English article)

cURL ist ein Tool zum Übertragen von Dateien und Daten mit URL-Syntax, das viele Protokolle unterstützt, einschließlich HTTP, FTP, TELNET und mehr. CURL wurde ursprünglich als Befehlszeilentool konzipiert. Zum Glück ist die cURL-Bibliothek auch von PHP unterstützt.  In diesem Artikel werden wir uns einige der erweiterten Funktionen von cURL ansehen und wie wir sie in unseren PHP-Skripts verwenden können.

Warum CURL?

Es ist wahr, dass es andere Möglichkeiten gibt, den Inhalt einer Webseite abzurufen.  Viele Male, hauptsächlich aufgrund von Faulheit, habe ich anstelle von cURL nur einfache PHP-Funktionen verwendet:

Sie haben jedoch praktisch keine Flexibilität und keine ausreichende Fehlerbehandlung.  Außerdem gibt es bestimmte Aufgaben, die Sie einfach nicht erledigen können, wie beispielsweise Cookies, Authentifizierung, Formularbeiträge, Dateiuploads usw.

cURL ist eine leistungsstarke Bibliothek, die viele verschiedene Protokolle, Optionen und detaillierte Informationen zu den URL-Anforderungen unterstützt.

Grundstruktur

Bevor wir uns den komplizierteren Beispielen zuwenden, betrachten wir die grundlegende Struktur einer cURL-Anfrage in PHP.  Es gibt vier Hauptschritte:

  1. Initialisieren
  2. Optionen einstellen
  3. Ergebnis ausführen und abrufen
  4. Geben Sie den CURL-Griff frei

Schritt 2 (d. H. Curl_setopt () - Aufrufe) wird ein großer Teil dieses Artikels sein, da dort die ganze Magie stattfindet.  Es gibt eine lange Liste von cURL-Optionen, die eingestellt werden können, um die URL-Anforderung detailliert zu konfigurieren.  Es kann schwierig sein, die gesamte Liste durchzugehen und alles auf einmal zu verdauen.  Daher werden wir heute nur einige der gebräuchlicheren und nützlichsten Optionen in verschiedenen Codebeispielen verwenden.

Auf Fehler prüfen

Optional können Sie auch eine Fehlerprüfung hinzufügen:

Bitte beachten Sie, dass wir zum Vergleich "=== FALSE" anstelle von "== FALSE" verwenden müssen.  Denn wir müssen zwischen der leeren Ausgabe und dem booleschen Wert FALSE unterscheiden, was auf einen Fehler hinweist.

Informationen erhalten

Ein weiterer optionaler Schritt ist das Abrufen von Informationen zur cURL-Anforderung, nachdem diese ausgeführt wurde.

Folgende Informationen sind im zurückgegebenen Array enthalten:

  • "url"
  • "content_type"
  • "http_code"
  • "header_size"
  • "request_size"
  • "filetime"
  • "ssl_verify_result"
  • "redirect_count"
  • "total_time"
  • "namelookup_time"
  • "connect_time"
  • "pretransfer_time"
  • "size_upload"
  • "size_download"
  • "speed_download"
  • "speed_upload"
  • "download_content_length"
  • "upload_content_length"
  • "starttransfer_time"
  • "redirect_time"

Erkennen Sie die Umleitung basierend auf dem Browser

In diesem ersten Beispiel schreiben wir ein Skript, das URL-Umleitungen anhand verschiedener Browsereinstellungen erkennen kann.  Beispielsweise leiten einige Websites Handybrowser oder sogar Surfer aus verschiedenen Ländern um.

Wir werden die Option CURLOPT_HTTPHEADER verwenden, um unsere ausgehenden HTTP-Header einschließlich der Benutzeragentenzeichenfolge und der akzeptierten Sprachen festzulegen.  Abschließend überprüfen wir, ob diese Websites versuchen, uns auf andere URLs umzuleiten.

Zuerst müssen wir eine Reihe von URLs testen, gefolgt von einer Reihe von Browsereinstellungen, um jede dieser URLs zu testen.  Dann durchlaufen wir diese Testfälle und stellen für jede eine cURL-Anfrage.

Aufgrund der Art und Weise, wie die cURL-Optionen eingerichtet werden, enthält die zurückgegebene Ausgabe nur die HTTP-Header (in $ output gespeichert).  Mit einem einfachen Regex können wir sehen, ob ein Header "Location:" enthalten ist.

Wenn Sie dieses Skript ausführen, sollten Sie eine Ausgabe wie diese erhalten:

POSTing an eine URL

Bei einer GET-Anfrage können Daten über die "Abfragezeichenfolge" an eine URL gesendet werden. Wenn Sie beispielsweise bei Google suchen, befindet sich der Suchbegriff im Abfragezeichenfolge-Teil der URL:

Sie benötigen cURL möglicherweise nicht, um dies in einem Web-Skript zu simulieren.  Sie können einfach nur faul sein und diese URL mit "file_get_contents ()" anklicken, um die Ergebnisse zu erhalten.

Einige HTML-Formulare sind jedoch auf die POST-Methode festgelegt.  Wenn diese Formulare über den Browser gesendet werden, werden die Daten nicht über die Abfragezeichenfolge, sondern über den HTTP-Anforderungstext gesendet.  Wenn Sie beispielsweise eine Suche in den CodeIgniter-Foren durchführen, POSTEN Sie Ihre Suchabfrage an:

Wir können ein PHP-Skript schreiben, um diese Art von URL-Anforderung zu simulieren.  Zuerst erstellen wir eine einfache Datei zum Akzeptieren und Anzeigen der POST-Daten.  Nennen wir es post_output.php:

Als Nächstes erstellen wir ein PHP-Skript, um eine cURL-Anforderung auszuführen:

Wenn Sie dieses Skript ausführen, sollten Sie eine Ausgabe wie diese erhalten:

Es hat einen POST an das post_output.php-Skript gesendet, das die Variable $ _POST ausgegeben hat, und wir haben diese Ausgabe über cURL erfasst.

Datei-Upload

Das Hochladen von Dateien funktioniert sehr ähnlich wie das vorherige POST-Beispiel, da für alle Dateiuploadformulare die POST-Methode verwendet wird.

Zuerst erstellen wir eine Datei für den Empfang der Anfrage und nennen sie upload_output.php:

Und hier ist das eigentliche Skript zum Hochladen der Datei:

Wenn Sie eine Datei hochladen möchten, müssen Sie lediglich den Dateipfad wie eine post-Variable übergeben und das @ -Zeichen voranstellen. Wenn Sie dieses Skript ausführen, sollten Sie eine Ausgabe wie diese erhalten:

Multi cURL

Eine der fortgeschritteneren Funktionen von cURL ist die Möglichkeit, ein "multi" cURL-Handle zu erstellen.  Auf diese Weise können Sie Verbindungen zu mehreren URLs gleichzeitig und asynchron öffnen.

Bei einer regulären cURL-Anforderung wird die Skriptausführung angehalten und gewartet, bis die URL-Anforderung abgeschlossen ist, bevor sie fortgesetzt werden kann.  Wenn Sie mehrere URLs treffen möchten, kann dies lange dauern, da Sie jeweils nur eine URL anfordern können.  Wir können diese Einschränkung durch Verwendung des Multi-Handles überwinden.

Schauen wir uns diesen Beispielcode von php.net an:

Die Idee ist, dass Sie mehrere cURL-Handles öffnen und sie einem einzigen Multi-Handle zuweisen können.  Dann können Sie warten, bis die Ausführung in einer Schleife abgeschlossen ist.

In diesem Beispiel gibt es zwei Hauptschleifen.  Die erste do-while-Schleife ruft wiederholt curl_multi_exec() auf.  Diese Funktion blockiert nicht.  Es wird so wenig wie möglich ausgeführt und gibt einen Statuswert zurück.  Solange der zurückgegebene Wert die Konstante 'CURLM_CALL_MULTI_PERFORM' ist, bedeutet dies, dass noch mehr Arbeit zu erledigen ist (z. B. das Senden von http-Headern an die URLs). 

Deshalb rufen wir ihn so lange auf, bis der Rückgabewert etwas anderes ist. In der folgenden while-Schleife machen wir so lange weiter, wie die $ active-Variable 'true' ist.  Dies wurde als zweites Argument an den Aufruf curl_multi_exec () übergeben.  Sie ist auf 'true' gesetzt, solange aktive Verbindungen mit dem Multi-Handle bestehen. Als nächstes rufen wir curl_multi_select () auf. Diese Funktion blockiert, bis eine Verbindungsaktivität vorliegt, z. B. eine Antwort.  Wenn dies passiert, gehen wir in eine weitere do-while-Schleife, um die Ausführung fortzusetzen.

Mal sehen, ob wir selbst ein Arbeitsbeispiel schaffen können, das einen praktischen Zweck hat.

Wordpress Link Checker

Stellen Sie sich ein Blog mit vielen Beiträgen vor, die Links zu externen Websites enthalten.  Einige dieser Links können aus verschiedenen Gründen nach einiger Zeit tot sein.  Vielleicht ist die Seite dort länger oder die gesamte Website ist verschwunden.

Wir werden ein Skript erstellen, das alle Links analysiert, nicht-ladende Websites und 404-Seiten findet und einen Bericht an uns zurücksendet.

Beachten Sie, dass dies kein echtes Wordpress-Plug-In sein wird.  Es ist nur ein eigenständiges Hilfsskript und dient nur zu Demonstrationszwecken.

Also lasst uns anfangen.  Zuerst müssen wir die Links aus der Datenbank abrufen:

Zuerst haben wir etwas Datenbankkonfiguration, gefolgt von einem Array von Domainnamen, die wir ignorieren werden ($ excluded_domains).  Außerdem legen wir eine Anzahl für die maximale Anzahl gleichzeitiger Verbindungen fest, die wir später verwenden werden ($ max_connections).  Dann stellen wir eine Verbindung zur Datenbank her, rufen Beiträge mit Links ab und sammeln sie in einem Array ($ url_list).

Der folgende Code kann etwas komplex sein, daher werde ich versuchen, ihn in kleinen Schritten zu erklären.

Und hier ist die Erklärung für den obigen Code.  Die Nummern in der Liste entsprechen den Nummern in den Codekommentaren.

  1. Ein Multi-Handle wurde erstellt.
  2. Wir werden später die Funktion add_url_to_multi_handle () erstellen.  Bei jedem Aufruf wird dem Multi-Handle eine URL hinzugefügt.  Anfangs fügen wir dem Multi-Handle 10 (basierend auf $ max_connections) URLs hinzu.
  3. Wir müssen curl_multi_exec () für die erste Arbeit ausführen.  Solange CURLM_CALL_MULTI_PERFORM zurückgegeben wird, ist noch etwas zu tun.  Dies dient hauptsächlich zum Erstellen der Verbindungen.  Es wird nicht auf die vollständige URL-Antwort gewartet.
  4. Diese Hauptschleife wird ausgeführt, solange der Multi-Handle aktiv ist.
  5. curl_multi_select () wartet das Skript, bis eine Aktivität mit einer der URL-Quests erfolgt.
  6. Wieder müssen wir cURL einige Arbeit erledigen lassen, hauptsächlich um Antwortdaten abzurufen.
  7. Wir prüfen nach Informationen.  Es wird ein Array zurückgegeben, wenn eine URL-Anforderung abgeschlossen wurde.
  8. Im zurückgegebenen Array befindet sich ein cURL-Handle.  Wir verwenden das, um Informationen über die individuelle cURL-Anforderung abzurufen.
  9. Wenn der Link nicht aktiv war oder das Zeitlimit überschritten wurde, wird kein http-Code angezeigt.
  10. Wenn der Link eine 404-Seite war, wird der http-Code auf 404 gesetzt.
  11. Ansonsten gehen wir davon aus, dass es eine funktionierende Verbindung war. (Sie können zusätzliche Prüfungen für 500 Fehlercodes usw. hinzufügen.)
  12. Wir entfernen den cURL-Handle aus dem Multi-Handle, da er nicht mehr benötigt wird, und schließen ihn.
  13. Wir können jetzt eine weitere URL zum Multi-Handle hinzufügen und die erste Arbeit erneut ausführen, bevor Sie fortfahren.
  14. Alles ist fertig.  Wir können den Multi-Handle schließen und einen Bericht drucken.
  15. Dies ist die Funktion, die dem Multi-Handle eine neue URL hinzufügt.  Die statische Variable $ index wird bei jedem Aufruf dieser Funktion inkrementiert, sodass wir verfolgen können, wo wir aufgehört haben.

Ich habe das Skript in meinem Blog ausgeführt (mit defekten Links zu Testzwecken), und so sah es aus:

Es dauerte nur weniger als 2 Sekunden, um etwa 40 URLs zu durchlaufen.  Die Leistungssteigerungen sind erheblich, wenn Sie mit noch größeren URL-Gruppen arbeiten.  Wenn Sie zehn Verbindungen gleichzeitig öffnen, kann sie bis zu zehnmal schneller ausgeführt werden.  Sie können auch die nicht blockierenden Eigenschaften des Multi-Curl-Handles nutzen, um URL-Anforderungen auszuführen, ohne Ihr Webskript anzuhalten.

Einige andere nützliche cURL-Optionen

HTTP-Authentifizierung

Wenn eine HTTP-basierte Authentifizierung für eine URL vorliegt, können Sie Folgendes verwenden:

FTP-Upload

PHP hat eine FTP-Bibliothek, Sie können jedoch auch cURL verwenden:

Proxy verwenden

Sie können Ihre URL-Anforderung über einen Proxy ausführen:

Rückruffunktionen

Es ist möglich, dass cURL während der URL-Anforderung bestimmte Callback-Funktionen abruft, bevor diese abgeschlossen ist. Wenn der Inhalt der Antwort heruntergeladen wird, können Sie beispielsweise die Daten verwenden, ohne auf den vollständigen Download zu warten.

Die Callback-Funktion MUSS die Länge der Zeichenfolge zurückgeben. Dies ist eine Voraussetzung dafür, dass dies ordnungsgemäß funktioniert.

Beim Abrufen der URL-Antwort wird bei jedem Empfang eines Datenpakets die Callback-Funktion aufgerufen.

Fazit

Wir haben heute die Leistungsfähigkeit und Flexibilität der cURL-Bibliothek untersucht.  Ich hoffe, Sie haben diesen Artikel genossen und gelernt.  Wenn Sie das nächste Mal eine URL-Anforderung in Ihrer Webanwendung stellen müssen, sollten Sie cURL verwenden.

Vielen Dank und einen schönen Tag!

Schreibe ein Plus-Tutorial

Wussten Sie, dass Sie bis zu 600 US-Dollar verdienen können, wenn Sie ein PLUS-Tutorial und / oder einen Screencast für uns schreiben?  Wir suchen ausführliche und gut geschriebene Tutorials zu HTML, CSS, PHP und JavaScript.  Wenn Sie die Möglichkeit haben, wenden Sie sich bitte an Jeffrey unter nettuts@tutsplus.com.

Bitte beachten Sie, dass die tatsächliche Kompensation von der Qualität des abschließenden Tutorials und des Screencasts abhängt.

Write a PLUS tutorial
Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.