PHP CURL – Funktionen und Anwendungsbeispiele. Erweiterte Verwendung von cURL in den PHP Curl-Befehlszeilenoptionen

(PHP 4 >= 4.0.2, PHP 5, PHP 7)

curl_setopt — Legt einen Parameter für die CURL-Sitzung fest

Liste der Parameter

cURL-Handle erhalten von curl_init().

Zu setzender Parameter CURLOPT_XXX.

Der Wert des Optionsparameters.

bool:

Parameter Anmerkungen
CURLOPT_AUTOREFERER WAHR zur automatischen Feldeinstellung Referrer: in Anfragen, die per Header umgeleitet werden Standort:.
CURLOPT_BINARYTRANSFER WAHR um die Rohantwort zurückzugeben, wenn eine Konstante verwendet wird CURLOPT_RETURNTRANSFER. Ab PHP 5.1.3 ist diese Option nicht mehr erforderlich: Bei Verwendung der Option wird immer eine Rohausgabe zurückgegeben CURLOPT_RETURNTRANSFER.
CURLOPT_COOKIESESSION WAHR um die aktuelle Sitzung anzuweisen, eine neue „Sitzung“ von Cookies zu starten. Dies führt dazu, dass libcurl alle „Sitzungs“-Cookies ignoriert, die es aus der vorherigen Sitzung hätte laden sollen. Standardmäßig speichert und lädt libcurl immer alle Cookies, unabhängig davon, ob es sich um „Sitzungs“-Cookies handelt oder nicht. „Sitzungscookies“ sind Cookies, die nicht ablaufen und nur für die aktuelle „Sitzung“ vorhanden sein dürfen.
CURLOPT_CERTINFO WAHR um SSL-Zertifikatsinformationen zum Streamen auszugeben STDERR mit sicheren Verbindungen. Hinzugefügt in cURL 7.19.1. Verfügbar ab PHP 5.3.2. Für den ordnungsgemäßen Betrieb muss diese Option aktiviert sein CURLOPT_VERBOSE.
CURLOPT_CONNECT_ONLY WAHR Weist die Bibliothek an, die erforderliche Proxy-Authentifizierung und den Verbindungsaufbau durchzuführen, überträgt jedoch keine Daten. Diese Option ist für HTTP, SMTP und POP3 implementiert. Hinzugefügt in 7.15.2. Verfügbar ab PHP 5.5.0.
CURLOPT_CRLF WAHR um Unix-Zeilenenden in CRLF zu konvertieren.
CURLOPT_DNS_USE_GLOBAL_CACHE WAHR um den globalen DNS-Cache zu verwenden. Diese Option ist nicht threadsicher und standardmäßig aktiviert.
CURLOPT_FAILONERROR WAHR für einen detaillierten Fehlerbericht, wenn der empfangene HTTP-Code größer oder gleich 400 ist. Das Standardverhalten gibt die Seite normal zurück und ignoriert den Code.
CURLOPT_FILETIME WAHR um zu versuchen, das Änderungsdatum eines Remote-Dokuments zu ermitteln. Dieser Wert kann mithilfe des Parameters CURLINFO_FILETIME aus der Funktion abgerufen werden curl_getinfo().
CURLOPT_FOLLOWLOCATION WAHR um einer Überschrift zu folgen "Standort: " vom Server in seiner Antwort gesendet (beachten Sie, dass dies rekursiv geschieht, PHP folgt allen gesendeten Headern "Standort: ", außer wenn eine Konstante festgelegt ist CURLOPT_MAXREDIRS).
CURLOPT_FORBID_REUSE WAHR um zu erzwingen, dass eine Verbindung nach Abschluss ihrer Verarbeitung geschlossen wird, sodass sie nicht wiederverwendet werden kann.
CURLOPT_FRESH_CONNECT WAHR um die Verwendung einer neuen Verbindung anstelle einer zwischengespeicherten Verbindung zu erzwingen.
CURLOPT_FTP_USE_EPRT WAHR um EPRT (und LPRT) für aktive FTP-Uploads zu verwenden. Verwenden FALSCH um EPRT und LPRT zu deaktivieren und nur PORT zu verwenden.
CURLOPT_FTP_USE_EPSV WAHR zum ersten Testen des EPSV-Befehls bei FTP-Übertragungen. Wenn der Befehl fehlschlägt, wird auf PASV zurückgegriffen. Einbauen in FALSCH um EPSV zu deaktivieren.
CURLOPT_FTP_CREATE_MISSING_DIRS WAHR um fehlende Verzeichnisse zu erstellen, wenn ein FTP-Vorgang auf einen nicht vorhandenen Pfad stößt.
CURLOPT_FTPAPPEND WAHR um eine Remote-Datei bis zum Ende zu schreiben, anstatt sie über eine vorhandene Datei zu überschreiben.
CURLOPT_TCP_NODELAY Gibt dauerhaft an, ob die Option TCP_NODELAY gesetzt oder gelöscht werden soll (1 = gesetzt, 0 = gelöscht). Standardmäßig ist die Option deaktiviert. Verfügbar ab PHP 5.2.1 für Versionen, die mit libcurl 7.11.2 oder höher erstellt wurden.
CURLOPT_FTPASCII Spitzname CURLOPT_TRANSFERTEXT. Verwenden Sie stattdessen dies.
CURLOPT_FTPLISTONLY WAHR um nur eine Liste von Namen aus dem FTP-Verzeichnis zurückzugeben.
CURLOPT_HEADER WAHR um Header in die Ausgabe einzuschließen.
CURLINFO_HEADER_OUT WAHR um die Handle-Abfragezeichenfolge zu verfolgen. Verfügbar ab PHP 5.1.3. Präfix CURLINFO_ gezielt eingesetzt.
CURLOPT_HTTPGET WAHR um die HTTP-Anfragemethode auf die GET-Methode zurückzusetzen. Da GET die Standardeinstellung ist, wird dieser Parameter nur benötigt, wenn die Anforderungsmethode zuvor geändert wurde.
CURLOPT_HTTPPROXYTUNNEL WAHR zum Tunneln über den angegebenen HTTP-Proxy.
CURLOPT_MUTE WAHR cURL-Funktionsmeldungen vollständig deaktivieren. In cURL 7.15.5 entfernt (CURLOPT_RETURNTRANSFER-Option kann verwendet werden)
CURLOPT_NETRC WAHR um die Datei ~/.netrc für den Benutzernamen und das Passwort für die Remote-Site zu lesen, mit der die Verbindung hergestellt wird.
CURLOPT_NOBODY WAHR um den Antworttext von der Ausgabe auszuschließen. Die Anforderungsmethode ist auf HEAD eingestellt. Ändern Sie diese Einstellung in FALSCHändert es nicht zurück in GET.
CURLOPT_NOPROGRESS

WAHR um die Fortschrittsanzeige bei cURL-Übertragungen zu deaktivieren.

Kommentar:

PHP setzt diesen Parameter automatisch auf WAHR, ändern Sie es nur zu Debugzwecken.

CURLOPT_NOSIGNAL WAHR um alle cURL-Funktionen zu ignorieren, die Signale an den PHP-Prozess senden. Diese Option ist in Multithread-SAPIs standardmäßig aktiviert, damit Timeout-Parameter ordnungsgemäß funktionieren.
CURLOPT_POST WAHR um reguläres HTTP POST zu verwenden. Diese POST-Methode verwendet die normale , häufig in HTML-Formularen verwendet.
CURLOPT_PUT WAHR um eine Datei mit der HTTP-PUT-Methode herunterzuladen. Die verwendete Datei muss über die Optionen eingestellt werden CURLOPT_INFILE Und CURLOPT_INFILESIZE.
CURLOPT_RETURNTRANSFER WAHR um das Ergebnis der Übertragung als String zurückzugeben curl_exec() statt direkter Ausgabe an den Browser.
CURLOPT_SAFE_UPLOAD WAHR um die Präfixunterstützung zu deaktivieren @ für heruntergeladene Dateien in CURLOPT_POSTFIELDS, was bedeutet, dass die Werte mit übergeben wurden @ können sicher als Felder übertragen werden. Anstelle eines Präfixes können Sie die Option verwenden CURLFile D. In PHP 5.5.0 mit Standardwert hinzugefügt FALSCH. In PHP 5.6.0 wurde es standardmäßig gleich WAHR.
CURLOPT_SSL_VERIFYPEER FALSCH um cURL daran zu hindern, das Host-Zertifikat zu überprüfen. Über den Parameter können alternative zu verifizierende Zertifikate angegeben werden CURLOPT_CAINFO oder das Verzeichnis mit den durch den Parameter angegebenen Zertifikaten CURLOPT_CAPATH. Standard ist WAHR seit cURL Version 7.10. Die Standardverteilung wird ab cURL-Version 7.10 installiert.
CURLOPT_TRANSFERTEXT WAHR um den ASCII-Modus für FTP-Übertragungen zu verwenden. Bei Verwendung von LDAP werden die Daten im Klartext statt im HTML-Format zurückgegeben. Auf Windows-Systemen der Thread STDOUT wird nicht auf den Binärmodus eingestellt.
CURLOPT_UNRESTRICTED_AUTH WAHR um bei Weiterleitungen weiterhin Login und Passwort zu senden (bei Verwendung von CURLOPT_FOLLOWLOCATION), auch wenn sich der Hostname ändert.
CURLOPT_UPLOAD WAHR um das Hochladen der Datei auf den Server vorzubereiten.
CURLOPT_VERBOSE WAHR um zusätzliche Informationen anzuzeigen. Schreibt die Ausgabe in einen Stream STDERR oder die durch den Parameter angegebene Datei CURLOPT_STDERR.

Für die folgenden Optionsparameterwerte muss der Wertparameter vom Typ sein ganze Zahl:

Parameter Wertwert festlegen Anmerkungen
CURLOPT_BUFFERSIZE Die Größe des Puffers, der für jeden Lesevorgang verwendet wird. Es gibt jedoch keine Garantie dafür, dass dieser Antrag bearbeitet wird. Hinzugefügt in cURL 7.10.
CURLOPT_CLOSEPOLICY Eine der Konstanten CURLCLOSEPOLICY_*.

Kommentar:

Diese Option ist veraltet, da sie nie in cURL implementiert wurde und nicht funktionierte.

In PHP 5.6.0 entfernt.
CURLOPT_CONNECTTIMEOUT Die Anzahl der Sekunden, die beim Verbindungsversuch gewartet werden soll. Verwenden Sie 0, um unbegrenzt zu warten.
CURLOPT_CONNECTTIMEOUT_MS Die Anzahl der Millisekunden, die beim Verbindungsversuch gewartet werden soll. Verwenden Sie 0, um unbegrenzt zu warten. Wenn libcurl mit dem Standard-Namenslöser des Systems kompiliert wird, verwendet die Verbindung weiterhin eine volle Sekunde Wartezeit als Zeitüberschreitung, wobei die minimal zulässige Zeitüberschreitung 1 Sekunde beträgt. Hinzugefügt in cURL-Version 7.16.2. Verfügbar ab PHP 5.2.3.
CURLOPT_DNS_CACHE_TIMEOUT Die Anzahl der Sekunden, die DNS-Einträge im Speicher gespeichert werden. Standardmäßig beträgt dieser Parameter 120 (2 Minuten).
CURLOPT_FTPSSLAUTH FTP-Authentifizierungsmethode (im aktiven Modus): CURLFTPAUTH_SSL(SSL wird zuerst geprüft), CURLFTPAUTH_TLS(TLS zuerst geprüft) oder CURLFTPAUTH_DEFAULT(cURL entscheidet selbst). Hinzugefügt in cURL-Version 7.12.2.
CURLOPT_HTTP_VERSION CURL_HTTP_VERSION_NONE (standardmäßig wählt CURL aus, welche Version verwendet werden soll), CURL_HTTP_VERSION_1_0 (HTTP/1.0 erzwingen) oder CURL_HTTP_VERSION_1_1 (HTTP/1.1 erzwingen).
CURLOPT_HTTPAUTH

Sie können den bitweisen Operator verwenden | (oder) mehrere Methoden miteinander zu kombinieren. In diesem Fall fragt cURL den Server nach unterstützten Autorisierungsmethoden ab und wählt die beste aus.

CURLAUTH_ANY ist ein Alias CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM.

CURLAUTH_ANYSAFE ist ein Alias CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM.

CURLOPT_INFILESIZE Die erwartete Dateigröße in Bytes beim Hochladen einer Datei auf einen Remote-Server. Bitte beachten Sie, dass durch die Verwendung dieser Option das Senden weiterer Daten über diesen Wert hinaus nicht verhindert wird, da die gesendeten Daten vom Ergebnis abhängen CURLOPT_READFUNCTION.
CURLOPT_LOW_SPEED_LIMIT Oberer Schwellenwert für die Datenübertragungsrate in Bytes pro Sekunde. Die Verifizierung erfolgt innerhalb CURLOPT_LOW_SPEED_TIME Sekunden, danach betrachtet PHP die Übertragung als zu langsam und bricht sie ab.
CURLOPT_LOW_SPEED_TIME Die maximale Anzahl an Sekunden, die die Übertragungsrate nicht überschreiten darf CURLOPT_LOW_SPEED_LIMIT, sonst markiert PHP die Übertragung als zu langsam und stoppt sie.
CURLOPT_MAXCONNECTS Maximale Anzahl dauerhafter Verbindungen. Wenn das Limit erreicht ist, wird der Parameter verwendet, um zu bestimmen, welche Verbindung geschlossen werden soll. CURLOPT_CLOSEPOLICY.
CURLOPT_MAXREDIRS Die maximale Anzahl akzeptierter Weiterleitungen. Verwenden Sie diese Option zusammen mit der Option CURLOPT_FOLLOWLOCATION.
CURLOPT_PORT Alternativer Anschlussport.
CURLOPT_POSTREDIR Eine Bitmaske mit 1 (301 Moved Permanently), 2 (302 Found) und 4 (303 See Other), um anzugeben, ob die HTTP-POST-Methode verarbeitet werden soll, wenn die Option aktiviert ist CURLOPT_FOLLOWLOCATION wenn die angegebene Art der Umleitung aufgetreten ist. Hinzugefügt in cURL 7.19.1. Verfügbar seit PHP 5.3.2.
CURLOPT_PROTOCOLS

Bitmaske von Werten CURLPROTO_*. Diese Maske schränkt die von libcurl verwendeten Protokolle ein. Dadurch können Sie libcurl mit einer großen Anzahl von Protokollen arbeiten lassen und den Betrieb bestimmter Übertragungen auf nur eine Teilmenge davon beschränken. Standardmäßig verwendet libcurl alle unterstützten Protokolle. Siehe auch Parameter CURLOPT_REDIR_PROTOCOLS.

Richtige Protokollwerte: CURLPROTO_HTTP, CURLPROTO_HTTPS, CURLPROTO_FTP, CURLPROTO_FTPS, CURLPROTO_SCP, CURLPROTO_SFTP, CURLPROTO_TELNET, CURLPROTO_LDAP, CURLPROTO_LDAPS, CURLPROTO_DICT, CURLPROTO_FILE, CURLP ROTO_TFTP, CURLPROTO_ALL

CURLOPT_PROXYAUTH HTTP-Autorisierungsmethoden, die beim Herstellen einer Verbindung zu einem Proxyserver verwendet werden. Verwenden Sie dieselben Bitmasken, die für den Parameter beschrieben wurden CURLOPT_HTTPAUTH. Derzeit werden nur CURLAUTH_BASIC und CURLAUTH_NTLM für die Proxy-Autorisierung unterstützt. Hinzugefügt in cURL-Version 7.10.7.
CURLOPT_PROXYPORT Die Portnummer des Proxyservers, zu dem die Verbindung hergestellt wird. Diese Anzahl kann auch über den Parameter eingestellt werden CURLOPT_PROXY.
CURLOPT_PROXYTYPE Entweder CURLPROXY_HTTP (Standard) oder CURLPROXY_SOCKS5 . Hinzugefügt in cURL 7.10.
CURLOPT_REDIR_PROTOCOLS Bitmaske von Werten CURLPROTO_*. Diese Bitmaske begrenzt die von libcurl beim Umleiten verwendeten Protokolle (bei aktiviertem Parameter). CURLOPT_FOLLOWLOCATION). Dadurch können Sie den Satz an Protokollen einschränken, die bei der Umleitung einiger Übertragungen verwendet werden. Standardmäßig unterstützt libcurl alle Protokolle außer FILE und SCP. In Versionen vor 7.19.4 wurde die Umleitung ausnahmslos für alle Protokolle verwendet. Siehe auch Parameterbeschreibung CURLOPT_PROTOCOLS für eine Liste von Konstanten mit Protokollwerten. Hinzugefügt in cURL-Version 7.19.4.
CURLOPT_RESUME_FROM Übertragungsstart-Offset in Bytes.
CURLOPT_SSL_VERIFYHOST Verwenden Sie 1, um zu prüfen, ob im SSL-Zertifikat ein allgemeiner Name vorhanden ist. Verwenden Sie 2, um zu überprüfen, ob der allgemeine Name vorhanden ist und auch mit dem angegebenen Host übereinstimmt. In einer Kampfumgebung sollte der Wert dieses Parameters 2 sein (standardmäßig eingestellt). Die Unterstützung für den Wert 1 wurde in cURL 7.28.1 entfernt
CURLOPT_SSLVERSION Eine der Konstanten CURL_SSLVERSION_DEFAULT (0), CURL_SSLVERSION_TLSv1 (1), CURL_SSLVERSION_SSLv2 (2), CURL_SSLVERSION_SSLv3 (3), CURL_SSLVERSION_TLSv1_0 (4), CURL_SSLVERSION_TLSv1_1(5) oder CURL_SSLVERSION_TLSv1_2 (6).
CURLOPT_TIMECONDITION Methode zur Parameterinterpretation CURLOPT_TIMEVALUE. Verwenden Sie CURL_TIMECOND_IFMODSINCE, um die Seite nur dann zurückzugeben, wenn sie sich seit der im Parameter angegebenen Zeit geändert hat CURLOPT_TIMEVALUE. Wenn die Seite nicht geändert wurde, wird der Titel zurückgegeben „304 nicht geändert“, was bedeutet, dass der Parameter CURLOPT_HEADER eingebaut WAHR. Verwenden Sie CURL_TIMECOND_IFUNMODSINCE für den gegenteiligen Effekt. Der Standardwert ist CURL_TIMECOND_IFMODSINCE.
CURLOPT_TIMEOUT Die maximal zulässige Anzahl von Sekunden für die Ausführung von cURL-Funktionen.
CURLOPT_TIMEOUT_MS Die maximal zulässige Anzahl von Millisekunden für die Ausführung von cURL-Funktionen. Wenn libcurl mit dem normalen Systemnamen-Resolver erstellt wird, verwendet diese Verbindungsspanne immer noch Zeitüberschreitungen für die zweite Runde, wobei eine Mindestzeitüberschreitung von einer Sekunde zulässig ist. Hinzugefügt in cURL-Version 7.16.2. Verfügbar ab PHP 5.2.3.
CURLOPT_TIMEVALUE Anzahl der Sekunden seit dem 1. Januar 1970. Diese Zeit wird vom Parameter verwendet CURLOPT_TIMECONDITION. Standardmäßig wird der Parameter CURL_TIMECOND_IFMODSINCE verwendet.
CURLOPT_MAX_RECV_SPEED_LARGE Wenn die Download-Geschwindigkeit diesen Wert (angegeben in Bytes pro Sekunde) im Durchschnitt während der gesamten Übertragung überschreitet, wird der Download angehalten, um die durchschnittliche Geschwindigkeit beizubehalten, die kleiner oder gleich diesem Parameter ist. Standardmäßig ist die Geschwindigkeit nicht begrenzt.
CURLOPT_MAX_SEND_SPEED_LARGE Wenn der Upload auf den Server diesen Wert (angegeben in Bytes pro Sekunde) im Durchschnitt während der gesamten Übertragung überschreitet, wird der Upload angehalten, um eine Durchschnittsgeschwindigkeit beizubehalten, die kleiner oder gleich diesem Parameter ist. Standardmäßig ist die Geschwindigkeit nicht begrenzt. Hinzugefügt in cURL 7.15.5. Verfügbar ab PHP 5.4.0.
CURLOPT_SSH_AUTH_TYPES Eine Bitmaske bestehend aus einer oder mehreren Konstanten: CURLSSH_AUTH_PUBLICKEY, CURLSSH_AUTH_PASSWORD, CURLSSH_AUTH_HOST, CURLSSH_AUTH_KEYBOARD. Installieren CURLSSH_AUTH_ANY damit libcurl eine davon unabhängig auswählen kann. Hinzugefügt in cURL 7.16.1.
CURLOPT_IPRESOLVE Ermöglicht einer Anwendung, den Typ der IP-Adresse auszuwählen, mit dem der Hostname bestimmt wird. Dies ist erforderlich, wenn Sie einen Hostnamen verwenden, der von mehr als einer Version der IP-Adresse abgeleitet ist. Mögliche Werte könnten sein CURL_IPRESOLVE_WHATEVER, CURL_IPRESOLVE_V4, CURL_IPRESOLVE_V6, und standardmäßig CURL_IPRESOLVE_WHATEVER. Hinzugefügt in cURL 7.10.8.

Für die folgenden Optionsparameterwerte muss der Wertparameter vom Typ sein Zeichenfolge:

Parameter Wertwert festlegen Anmerkungen
CURLOPT_CAINFO Der Name einer Datei, die ein oder mehrere Zertifikate enthält, anhand derer Knoten überprüft werden. Dieser Parameter ist nur in Verbindung mit sinnvoll CURLOPT_SSL_VERIFYPEER. Erfordert einen absoluten Pfad.
CURLOPT_CAPATH Ein Verzeichnis, das mehrere CA-Zertifikate enthält. Verwenden Sie diese Option in Verbindung mit CURLOPT_SSL_VERIFYPEER.
CURLOPT_COOKIE Header-Inhalt "Plätzchen:", wird in der HTTP-Anfrage verwendet. Bitte beachten Sie, dass mehrere Cookies durch ein Semikolon gefolgt von einem Leerzeichen getrennt werden (z. B. „ Frucht=Apfel; Farbe = rot")
CURLOPT_COOKIEFILE Der Name der Datei, die die Cookies enthält. Diese Datei muss im Netscape-Format vorliegen oder es müssen einfach HTTP-Header in die Datei geschrieben werden. Wird als Dateiname ein leerer String übergeben, werden Cookies zwar nicht gespeichert, ihre Verarbeitung ist aber trotzdem möglich.
CURLOPT_COOKIEJAR Der Name der Datei, in der nach dem Schließen des Handles, beispielsweise nach dem Aufruf von curl_close, alle internen Cookies der aktuellen Übertragung gespeichert werden.
CURLOPT_CUSTOMREQUEST

Stattdessen wird eine benutzerdefinierte Anfragemethode verwendet "ERHALTEN" oder "KOPF" wenn Sie eine HTTP-Anfrage stellen. Dies ist nützlich für Abfragen "LÖSCHEN" oder andere, seltenere HTTP-Anfragen. Richtige Bedeutungen wären Wörter wie "ERHALTEN", "POST", "VERBINDEN" usw; diese. Geben Sie hier nicht die gesamte HTTP-Anfragezeile ein. Zum Beispiel ein Hinweis „GET /index.html HTTP/1.0\r\n\r\n“ wird falsch sein.

Kommentar:

Verwenden Sie diese Funktion erst, wenn Sie sicher sind, dass der Server diese Art von Anfrage unterstützt.

CURLOPT_EGDSOCKET Wie CURLOPT_RANDOM_FILE, außer dass der Dateiname auf den Entropy Gathering Daemon-Socket festgelegt ist.
CURLOPT_ENCODING Header-Inhalt „Accept-Encoding:“. Dadurch kann die Anfrage entschlüsselt werden. Unterstützte Kodierungen sind "Identität", „entleeren“ Und „gzip“. Wenn ein leerer String übergeben wird, "" , wird ein Header gesendet, der alle unterstützten Kodierungstypen enthält. Hinzugefügt in cURL 7.10.
CURLOPT_FTPPORT Der Wert, der zur Bestimmung der IP-Adresse für den FTP-Befehl „PORT“ verwendet wird. Der Befehl „PORT“ teilt dem Server mit, mit welcher IP-Adresse er sich verbinden soll. Dies kann eine IP-Adresse, ein Hostname, ein Netzwerkschnittstellenname (unter Unix) oder einfach „-“ sein, um die Standard-IP-Adresse des Systems zu verwenden.
CURLOPT_INTERFACE Der Name der zu verwendenden Netzwerkschnittstelle. Kann ein Schnittstellenname, eine IP-Adresse oder ein Hostname sein.
CURLOPT_KEYPASSWD Für die Verwendung des privaten Schlüssels ist ein Passwort erforderlich CURLOPT_SSLKEY oder CURLOPT_SSH_PRIVATE_KEYFILE. Hinzugefügt in cURL 7.16.1.
CURLOPT_KRB4LEVEL Sicherheitsstufe KRB4 (Kerberos 4). Jeder der folgenden Werte (in der Reihenfolge vom schwächsten zum stärksten) ist korrekt: "klar", "sicher", "vertraulich", "Privat".. Wenn die angegebene Zeichenfolge von den angegebenen Werten abweicht, wird der Wert verwendet "Privat". Setzen Sie diese Option auf NULL wird die KRB4-Sicherheit vollständig deaktivieren. Derzeit funktioniert die KRB4-Sicherheit nur mit FTP-Transaktionen.
CURLOPT_POSTFIELDS Alle Daten, die in einer HTTP-POST-Anfrage übertragen werden. Um eine Datei zu übertragen, geben Sie vor dem Dateinamen an @ , und verwenden Sie auch den vollständigen Pfad zur Datei. Der Dateityp kann auch im Format „ ;type=mimetype„nach dem Dateinamen. Dieser Parameter kann als URL-codierte Zeichenfolge übergeben werden, z. B. „ para1=val1¶2=val2&...", und zwar in Form eines Arrays, dessen Schlüssel die Namen der Felder und die Werte deren Inhalte sind. Wenn value ein Array ist, der Header Inhaltstyp wird eingestellt Multipart-/Formulardaten. Ab PHP 5.2.0, beim Übertragen von Dateien mit dem Präfix @ , Wert muss ein Array sein. Seit PHP 5.5.0, Präfix @ ist veraltet und Dateien können mit gesendet werden CURLFile. Präfix @ kann deaktiviert werden, um Werte zuzulassen, die mit beginnen @ durch Setzen der Option CURLOPT_SAFE_UPLOAD in der Bedeutung WAHR.
CURLOPT_PROXY HTTP-Proxy, über den Anfragen weitergeleitet werden.
CURLOPT_PROXYUSERPWD Login und Passwort im Formular angegeben ":" , wird bei der Verbindung über einen Proxy verwendet.
CURLOPT_RANDOM_FILE Der Name der Datei, die zum Initialisieren des Zufallszahlengenerators für SSL verwendet wird.
CURLOPT_RANGE Bereich der herunterzuladenden Daten im Format „X-Y“, und entweder X oder Y können weggelassen werden. Das HTTP-Protokoll unterstützt auch die Übertragung mehrerer durch Kommas getrennter Bereiche, diese werden im Format angegeben „X-Y, N-M“.
CURLOPT_REFERER Header-Inhalt „Referrer:“, die in der HTTP-Anfrage verwendet wird.
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 Eine Zeichenfolge mit 32 Hexadezimalziffern. Die Zeichenfolge muss eine MD5-Prüfsumme des öffentlichen Schlüssels des Remote-Computers sein, und libcurl setzt die Verbindung zum Remote-Host zurück, bis die Prüfsumme mit dem öffentlichen Schlüssel übereinstimmt. Diese Option gilt nur für die Datenübertragung über SCP und SFTP. Hinzugefügt in cURL 7.17.1.
CURLOPT_SSH_PUBLIC_KEYFILE Der Dateiname für Ihren öffentlichen Schlüssel. Wenn nicht angegeben, verwendet libcurl standardmäßig die Datei $HOME/.ssh/id_dsa.pub, wenn die HOME-Umgebungsvariable festgelegt ist, und die Datei „id_dsa.pub“ im aktuellen Verzeichnis, wenn die HOME-Umgebungsvariable nicht festgelegt ist. Hinzugefügt in cURL 7.16.1.
CURLOPT_SSH_PRIVATE_KEYFILE Der Dateiname für Ihren privaten Schlüssel. Wenn nicht angegeben, verwendet libcurl standardmäßig die Datei $HOME/.ssh/id_dsa, wenn die Umgebungsvariable HOME festgelegt ist, und die Datei „id_dsa“ im aktuellen Verzeichnis, wenn die Umgebungsvariable HOME nicht festgelegt ist. Wenn die Datei passwortgeschützt ist, legen Sie das Passwort mit fest CURLOPT_KEYPASSWD. Hinzugefügt in cURL 7.16.1.
CURLOPT_SSL_CIPHER_LIST Liste der bei SSL-Übertragungen verwendeten Chiffren. Zum Beispiel, RC4-SHA Und TLSv1 sind gültige Chiffrierlisten.
CURLOPT_SSLCERT Der Name einer Datei mit einem korrekt formatierten PEM-Zertifikat.
CURLOPT_SSLCERTPASSWD Für die Nutzung des Zertifikats ist ein Passwort erforderlich CURLOPT_SSLCERT.
CURLOPT_SSLCERTTYPE Zertifikatsformat. Unterstützte Formate „PEM“(Default), „DER“ Und „ENG“. Hinzugefügt in cURL-Version 7.9.3.
CURLOPT_SSLENGINE Die Verschlüsselungs-Engine-ID für den im Parameter angegebenen privaten SSL-Schlüssel CURLOPT_SSLKEY.
CURLOPT_SSLENGINE_DEFAULT Die Kennung des Verschlüsselungsmechanismus, der für asymmetrische Verschlüsselungsvorgänge verwendet wird.
CURLOPT_SSLKEY Der Name der privaten SSL-Schlüsseldatei.
CURLOPT_SSLKEYPASSWD

Das geheime Passwort, das zur Verwendung des durch den Parameter angegebenen privaten SSL-Schlüssels erforderlich ist CURLOPT_SSLKEY.

Kommentar:

Da dieser Parameter ein wertvolles Passwort enthält, denken Sie daran, dieses PHP-Skript an einem sicheren Ort aufzubewahren.

CURLOPT_SSLKEYTYPE Der im Parameter angegebene Typ des privaten SSL-Schlüssels CURLOPT_SSLKEY. Die folgenden Schlüsseltypen werden unterstützt: „PEM“(Default), „DER“ Und „ENG“.
CURLOPT_URL Herunterladbare URL. Dieser Parameter kann auch beim Initialisieren einer Sitzung mit festgelegt werden curl_init().
CURLOPT_USERAGENT Header-Inhalt "User-Agent: ", in einer HTTP-Anfrage gesendet.
CURLOPT_USERPWD Login und Passwort, die während der Verbindung verwendet werden, im Format angegeben ":" .

Für die folgenden Optionsparameterwerte muss der Wertparameter ein Array sein:

Parameter Wertwert festlegen Anmerkungen
CURLOPT_HTTP200ALIASES Ein Array von HTTP 200-Antworten, die als korrekte und nicht als fehlerhafte Antworten behandelt werden. Hinzugefügt in cURL-Version 7.10.3.
CURLOPT_HTTPHEADER Ein Array festgelegter HTTP-Header im Format array("Content-type: text/plain", "Content-length: 100")
CURLOPT_POSTQUOTE Ein Array von FTP-Befehlen, die auf dem Server ausgeführt werden, nachdem eine FTP-Anfrage abgeschlossen ist.
CURLOPT_QUOTE Ein Array von FTP-Befehlen, die auf dem Server ausgeführt werden, bevor eine FTP-Anfrage gestellt wird.

Für die folgenden Optionsparameterwerte muss der Wertparameter ein Stream-Handle sein (z. B. von der Funktion zurückgegeben). fopen()):

Parameter Wertwert festlegen
CURLOPT_FILE Die Datei, in die das Übertragungsergebnis geschrieben wird. Standardausgabestream STDOUT(Browser Fenster).
CURLOPT_INFILE Die Datei, aus der Daten gelesen werden sollen, wenn sie auf den Server hochgeladen werden.
CURLOPT_STDERR Alternative Fehlerausgabedatei, die anstelle des Fehlerstroms verwendet wird STDERR.
CURLOPT_WRITEHEADER Die Datei, in die die Header des aktuellen Vorgangs geschrieben werden.

Für die folgenden Optionsparameterwerte muss der Wertparameter ein gültiger Funktionsname oder Abschluss sein:

Parameter Wertwert festlegen
CURLOPT_HEADERFUNCTION Die Callback-Funktion benötigt zwei Parameter. Der erste Parameter ist das cURL-Handle, der zweite Parameter ist ein String, der die zu schreibenden Header enthält. Header müssen mit dieser Callback-Funktion geschrieben werden. Sollte die Anzahl der geschriebenen Bytes zurückgeben.
CURLOPT_PASSWDFUNCTION Die Callback-Funktion benötigt drei Parameter. Der erste Parameter ist das cURL-Handle, der zweite Parameter ist die Zeichenfolge zur Kennwortaufforderung und der dritte Parameter ist die maximale Kennwortlänge. Sollte eine Zeichenfolge zurückgeben, die das Passwort enthält.
CURLOPT_PROGRESSFUNCTION

Die Callback-Funktion benötigt fünf Parameter. Der erste ist der cURL-Deskriptor, der zweite ist die Gesamtzahl der Bytes, die voraussichtlich vom Server heruntergeladen werden, der dritte ist die Anzahl der bereits heruntergeladenen Bytes, der vierte ist die Gesamtzahl der Bytes, die voraussichtlich an den Server gesendet werden, und das fünfte ist die Anzahl der bereits gesendeten Bytes.

Kommentar:

Die Callback-Funktion wird nur aufgerufen, wenn die Option CURLOPT_NOPROGRESS auf Wert setzen FALSCH.

Sie können einen Wert ungleich Null zurückgeben, um die Übertragung abzubrechen. In diesem Fall wird ein Fehler angezeigt CURLE_ABORTED_BY_CALLBACK.

CURLOPT_READFUNCTION Die Callback-Funktion benötigt drei Parameter. Der erste Parameter ist das cURL-Handle, der zweite Parameter ist die Stream-Ressource, die über die Option an cURL übergeben wird CURLOPT_INFILE und der dritte Parameter ist die maximal zulässige Datenmenge, die gelesen werden darf. Die Rückruffunktion muss eine Zeichenfolge mit einer Länge zurückgeben, die nicht größer als die angeforderte Datenmenge ist, normalerweise durch Lesen aus der übergebenen Streaming-Ressource. Sollte eine leere Zeichenfolge zurückgeben, um das Ende der Datei zu signalisieren EOF.
CURLOPT_WRITEFUNCTION Die Callback-Funktion benötigt zwei Parameter. Der erste Parameter ist das cURL-Handle und der zweite Parameter ist die Zeichenfolge, die die zu schreibenden Daten enthält. Mit dieser Funktion müssen Daten gespeichert werden. Es muss die genaue Anzahl der geschriebenen Bytes zurückgeben, andernfalls wird der Download mit einem Fehler abgebrochen.

Andere Bedeutungen:

Rückgabewerte

Kehrt zurück WAHR nach erfolgreichem Abschluss bzw FALSCH im Falle eines Fehlers.

Liste der Änderungen

Ausführung Beschreibung
5.6.0 Möglichkeit CURL_SAFE_UPLOAD hat jetzt einen Standardwert von WAHR.
5.6.0 Option entfernt CURLOPT_CLOSEPOLICY und die damit verbundenen Bedeutungen.
5.5.0 Die cURL-Ressource wird als erstes Argument zur Rückruffunktion hinzugefügt CURLOPT_PROGRESSFUNCTION.
5.5.0 Option hinzugefügt CURLOPT_SHARE.
5.3.0 Option hinzugefügt CURLOPT_PROGRESSFUNCTION.
5.2.10 Optionen hinzugefügt CURLOPT_PROTOCOLS Und CURLOPT_REDIR_PROTOCOLS.
5.1.0 Optionen hinzugefügt CURLOPT_AUTOREFERER, CURLOPT_BINARYTRANSFER, CURLOPT_FTPSSLAUTH, CURLOPT_PROXYAUTH Und CURLOPT_TIMECONDITION.
5.0.0 Optionen hinzugefügt CURLOPT_FTP_USE_EPRT, CURLOPT_NOSIGNAL, CURLOPT_UNRESTRICTED_AUTH, CURLOPT_BUFFERSIZE, CURLOPT_HTTPAUTH, CURLOPT_PROXYPORT, CURLOPT_PROXYTYPE, CURLOPT_SSLCERTTYPE Und CURLOPT_HTTP200ALIASES.

Beispiele

Beispiel Nr. 1: Initialisieren einer CURL-Sitzung und Laden einer Webseite

// eine neue cURL-Ressource erstellen
$ch = curl_init();

/* http://localhost/upload.php:
print_r($_POST);
print_r($_FILES);
*/

$ch = curl_init();

$data = array("name" => "Foo" , "file" => "@/home/user/test.png" );

Curl_setopt($ch, CURLOPT_URL, "http://localhost/upload.php");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

Curl_exec($ch);
?>

Das Ergebnis der Ausführung dieses Beispiels:

Array ( => Foo) Array ( => Array ( => test.png => image/png => /tmp/phpcpjNeQ => 0 => 279))

Anmerkungen

Kommentar:

Übergabe eines Arrays an CURLOPT_POSTFIELDS kodiert die Daten als Multipart-/Formulardaten, während die Übergabe einer URL-codierten Zeichenfolge die Daten als codiert application/x-www-form-urlencoded.

cURL ist ein Tool, das die Interaktion mit verschiedenen Servern ermöglicht und viele Protokolle unterstützt: HTTP, FTP, TELNET usw. cURL ist ursprünglich ein Befehlszeilendienstprogramm. Aber zum Glück unterstützt PHP die Arbeit mit der cURL-Bibliothek. In diesem Artikel werden wir uns nicht triviale Beispiele für die Arbeit mit cURL ansehen.

Warum cURL?

Tatsächlich gibt es viele andere Möglichkeiten, eine Anfrage an einen anderen Server zu senden, um beispielsweise den Inhalt einer Seite abzurufen. Viele Leute verwenden, meist aus Faulheit, einfache PHP-Funktionen anstelle von cURL:

$content = file_get_contents("http://www.example.com"); // oder $lines = file("http://www.example.com"); // oder readfile("http://www.example.com");

Sie ermöglichen jedoch keine effiziente Fehlerbehandlung. Es gibt auch eine Reihe von Aufgaben, die sie überhaupt nicht erledigen können – zum Beispiel das Arbeiten mit Cookies, die Autorisierung, Postanfragen, das Herunterladen von Dateien.

cUrl ist ein leistungsstarkes Tool, das mehrere Protokolle unterstützt und vollständige Anforderungsinformationen bereitstellt.

cUrl-Grundlagen

Bevor wir zu komplexen Beispielen übergehen, schauen wir uns die Grundstruktur einer cURL-Anfrage in PHP an. Um eine cURL-Anfrage in PHP durchzuführen, müssen Sie vier Hauptschritte ausführen:

  1. Initialisierung.
  2. Einstellmöglichkeiten.
  3. Ausführung der Anfrage.
  4. Reinigungsressourcen.
// 1. Initialisierung $ch = curl_init(); // 2. Optionen festlegen, einschließlich URL curl_setopt($ch, CURLOPT_URL, "http://www.google.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); // 3. Ausführen der Anfrage und Empfangen der Antwort $output = curl_exec($ch); // 4. Ressourcen bereinigen curl_close($ch);

Wir werden uns in diesem Artikel hauptsächlich mit Schritt 2 befassen, da dort die Magie geschieht. Die Liste der cURL-Optionen ist sehr umfangreich, daher werden wir heute nicht alle Optionen berücksichtigen, sondern diejenigen verwenden, die zur Lösung spezifischer Probleme nützlich sind.

Bug-Tracking

Bei Bedarf können Sie die folgenden Zeilen hinzufügen, um Fehler zu verfolgen:

// ... $output = curl_exec($ch); if ($output === FALSE) ( echo "cURL Error: " . curl_error($ch); ) // ...

Bitte beachten Sie, dass wir „===“ anstelle von „==“ verwenden, weil Es muss zwischen einer leeren Serverantwort und dem booleschen Wert FALSE unterschieden werden, der im Fehlerfall zurückgegeben wird.

Informationen zu einer Anfrage abrufen

Ein weiterer optionaler Schritt besteht darin, Informationen über die cURL-Anfrage zu erhalten, nachdem diese ausgeführt wurde.

// ... curl_exec($ch); $info = curl_getinfo($ch); echo „Genommen“ . $info["total_time"] . „Sekunden für URL“. $info["url"]; // ...

Als Ergebnis erhalten Sie ein Array mit folgenden Informationen:

  • „URL“
  • "Inhaltstyp"
  • „http_code“
  • „header_size“
  • „request_size“
  • „filetime“
  • „ssl_verify_result“
  • „redirect_count“
  • "Gesamtzeit"
  • „namelookup_time“
  • „connect_time“
  • „pretransfer_time“
  • „size_upload“
  • „size_download“
  • „speed_download“
  • „speed_upload“
  • „download_content_length“
  • „upload_content_length“
  • „starttransfer_time“
  • „redirect_time“

Redirect-Tracking, abhängig vom Browser

In diesem Beispiel schreiben wir ein Skript, das Weiterleitungen basierend auf verschiedenen Browsereinstellungen erkennt. Beispielsweise leiten einige Websites Besucher von Mobilgeräten an Besucher aus anderen Ländern weiter.

Wir verwenden die Option CURLOPT_HTTPHEADER, um unsere eigenen Header, einschließlich User-Agent und Language, festzulegen und zu sehen, wohin uns Websites weiterleiten.

// URLs $urls = array("http://www.cnn.com", "http://www.mozilla.com", "http://www.facebook.com"); // Browser $browsers = array("standard" => array ("user_agent" => "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5. 6 (.NET CLR 3.5.30729)", "Sprache" => "en-us,en;q=0.5"), "iphone" => Array ("user_agent" => "Mozilla/5.0 (iPhone; U; CPU wie Mac OS > „Mozilla/4.0 (kompatibel; MSIE 7.0; Windows NT 5.1; GTB6; .NET CLR 2.0.50727)“, „Sprache“ => „fr,fr-FR;q=0.5“)); foreach ($urls as $url) ( echo "URL: $url\n"; foreach ($browsers as $test_name => $browser) ( $ch = curl_init(); // Adresse festlegen curl_setopt($ch, CURLOPT_URL , $url); // Geben Sie den verwendeten Browser und die verwendete Sprache an. ]) ")); // Wir brauchen den Inhalt der Seite nicht. curl_setopt($ch, CURLOPT_NOBODY, 1); // Wir brauchen nur Header seiner Ausgabe: curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1); $output = curl_exec($ch); , $output, $matches)) ( echo "$test_name: leitet zu $matches\n weiter"; ) else ( echo "$test_name: keine Umleitung\n"; ) ) echo "\n\n"; )

In einer Schleife überprüfen wir Browser für jede URL. Zuerst legen wir die Optionen für unsere Anfrage fest: URL sowie Browser und zu testende Sprache.

Weil Wir haben eine spezielle Option festgelegt: Das Ergebnis der Anfrage enthält nur HTTP-Header. Mit einem einfachen regulären Ausdruck können wir prüfen, ob die Antwort die Zeichenfolge „Location:“ enthält.

Ergebnis der Skriptausführung:

URL: http://www.cnn.com Standard: Weiterleitung zu http://edition.cnn.com/ iPhone: Weiterleitung zu http://edition.cnn.com/ Französisch: Weiterleitung zu http://edition.cnn .com/ URL: http://www.mozilla.com Standard: Weiterleitungen zu https://www.mozilla.org/firefox/ iPhone: Weiterleitungen zu https://www.mozilla.org/firefox/ Französisch: Weiterleitungen zu https://www.mozilla.org/firefox/ URL: http://www.facebook.com Standard: Weiterleitungen zu https://www.facebook.com/ iPhone: Weiterleitungen zu http://m.facebook.com /?refsrc=http%3A%2F%2Fwww.facebook.com%2F&_rdr Französisch: keine Weiterleitung

Senden von POST-Anfragen

Beim Durchführen von GET-Anfragen können Daten im Abfragestring übergeben werden. Wenn Sie beispielsweise bei Google suchen, wird Ihre Suchanfrage in eine URL übersetzt:

http://www.google.com/search?q=google

Um das Ergebnis dieser Abfrage zu erhalten, benötigen Sie nicht einmal cURL, Sie können faul sein und „file_get_contents()“ verwenden.

Einige HTML-Formulare verwenden jedoch die POST-Methode. In diesem Fall werden die Daten im Textkörper der Anforderungsnachricht und nicht in der URL selbst gesendet.

Schreiben wir ein Skript, das POST-Anfragen sendet. Erstellen wir zunächst eine einfache PHP-Datei, die diese Anfragen akzeptiert und die an sie gesendeten Daten zurückgibt. Nennen wir es post_output.php:

$url = "http://localhost/post_output.php"; $post_data = array ("foo" => "bar", "query" => "FooBar", "action" => "Submit"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // eine POST-Anfrage stellen curl_setopt($ch, CURLOPT_POST, 1); // Daten hinzufügen curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $output = curl_exec($ch); curl_close($ch); echo $output;

Dieses Skript gibt Folgendes aus:

Array ( => bar => FooBar => Senden)

Dieses Skript hat eine POST-Anfrage an die Datei post_output.php gesendet. die den Inhalt des $_POST-Arrays ausgegeben hat und wir diese Antwort mit cURL erhalten haben.

Hochladen von Dateien

Erstellen wir wie im vorherigen Beispiel eine Datei, die Anfragen akzeptiert, upload_output.php:

Print_r($_FILES);

Und das Skript selbst, das die Dateien herunterlädt:

$url = "http://localhost/upload_output.php"; $post_data = array ("foo" => "bar", // hochzuladende Datei "upload" => "@/tmp/desert.jpg"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $output = curl_exec($ch); curl_close($ch); echo $output;

Wenn Sie eine Datei hochladen möchten, müssen Sie lediglich den Pfad zu dieser Datei übergeben, genau wie bei einem normalen POST-Anfrageparameter, mit dem Präfix „@“. Das Ergebnis des Skripts:

Array ( => Array ( => desert.jpg => application/octet-stream => /tmp/phpAhEvXy => 0 => 845941))

Multi-cURL

Eine der erweiterten Funktionen von cURL in PHP ist die Möglichkeit, mehrere Anfragen gleichzeitig und asynchron auszuführen.

Unter normalen Bedingungen stoppt das Skript und wartet auf den Abschluss der Anforderung. Und wenn Sie viele Abfragen ausführen müssen, kann das viel Zeit in Anspruch nehmen, weil... Sie werden nacheinander ausgeführt. Diese Einschränkung kann umgangen werden:

// Handler erstellen $ch1 = curl_init(); $ch2 = curl_init(); // Optionen festlegen curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/"); curl_setopt($ch1, CURLOPT_HEADER, 0); curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/"); curl_setopt($ch2, CURLOPT_HEADER, 0); //mehrfaches cURL-Handle erstellen $mh = curl_multi_init(); // Handler hinzufügen curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $running = null; // Anfragen ausführen do ( curl_multi_exec($mh, $running); ) while ($running > 0); // Ressourcen freigeben curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh);

Die Idee ist, dass Sie mehrere cURL-Handles erstellen, sie unter einem Multi-Handle kombinieren und asynchron ausführen können.

Zunächst ist alles wie bei einer regulären cURL-Anfrage – ein Deskriptor wird erstellt ( curl_init() ), Parameter werden eingestellt ( curl_setopt() ). Als nächstes wird ein Multideskriptor erstellt ( curl_multi_init() ) und die zuvor erstellten regulären Deskriptoren werden hinzugefügt ( curl_multi_add_handle() ). Anstatt normalerweise curl_exec() aufzurufen, rufen wir auf curl_multi_exec() Diese Funktion informiert uns über die Anzahl der aktiven Verbindungen mithilfe des zweiten Parameters – $running. Daher läuft die Schleife, bis $running gleich 0 wird. Und natürlich ist es nach Abschluss der Arbeit notwendig, Ressourcen freizugeben.

In diesem Beispiel geben wir das Ergebnis der Abfragen einfach auf STDOUT aus. Betrachten wir einen nicht trivialen Fall der Verwendung von Multi-cURL.

Externe Links in WordPress prüfen

Stellen Sie sich einen Blog mit vielen Beiträgen vor, die Links zu externen Websites enthalten. Einige dieser Links funktionieren möglicherweise nicht.

Schreiben wir ein Skript, das alle defekten Links findet und uns anzeigt.

Zuerst müssen wir alle externen Links aus der Datenbank ziehen:

// KONFIGURIEREN $db_host = "localhost"; $db_user = "root"; $db_pass = ""; $db_name = "wordpress"; $excluded_domains = array("localhost", "site"); $max_connections = 10; $url_list = array(); $working_urls = array(); $dead_urls = array(); $not_found_urls = array(); $aktiv = null; // Mit MySQL verbinden if (!mysql_connect($db_host, $db_user, $db_pass)) ( die("Verbindung konnte nicht hergestellt werden: " . mysql_error()); ) if (!mysql_select_db($db_name)) ( die("Könnte not select db: " . mysql_error()); ) // nimm alle Beiträge mit Links im Text $q = "SELECT post_content FROM wp_posts WHERE post_content LIKE "%href=%" AND post_status = "publish" AND post_type = "post " "; $r = mysql_query($q) or die(mysql_error()); while ($d = mysql_fetch_assoc($r)) ( // alle Links mit regulärem Ausdruck sammeln if (preg_match_all("/href=\"(.*?)\"/", $d["post_content"], $matches )) ( foreach ($matches as $url) ( // unnötige Domänen herausfiltern $tmp = parse_url($url); if (isset($tmp["host"]) && in_array($tmp["host"], $excluded_domains)) ( continue; ) // zusammensetzen $url_list = $url; ) ) ) // Wiederholungen entfernen $url_list = array_values(array_unique($url_list)); if (!$url_list) ( die("Keine zu überprüfende URL"); )

In diesem Teil des Skripts extrahieren wir einfach alle externen Links aus der Datenbank. Schauen wir sie uns an:

$mh = curl_multi_init(); // 1. Links hinzufügen für ($i = 0; $i< $max_connections; $i++) { add_url_to_multi_handle($mh, $url_list); } // основной цикл do { curl_multi_exec($mh, $curRunning); // 2. один из потоков завершил работу if ($curRunning != $running) { $mhinfo = curl_multi_info_read($mh); if (is_array($mhinfo) && ($ch = $mhinfo["handle"])) { // 3. один из запросов выполнен, можно получить информацию о нем $info = curl_getinfo($ch); // 4. нерабочая ссылка if (!$info["http_code"]) { $dead_urls = $info["url"]; // 5. 404? } else if ($info["http_code"] == 404) { $not_found_urls = $info["url"]; // 6. верная ссылка } else { $working_urls = $info["url"]; } // 7. удаляем отработавший дескриптор curl_multi_remove_handle($mh, $mhinfo["handle"]); curl_close($mhinfo["handle"]); // 8. добавим новый урл add_url_to_multi_handle($mh, $url_list); $running = $curRunning; } } } while ($curRunning >0); curl_multi_close($mh); echo "==Tote URLs==\n"; echo implode("\n", $dead_urls) . "\n\n"; echo "==404 URLs==\n"; echo implode("\n", $not_found_urls) . "\n\n"; echo "==Arbeits-URLs==\n"; echo implode("\n", $working_urls); echo "\n\n"; // 9. Fügt ein Handle mit der angegebenen URL-Funktion hinzu add_url_to_multi_handle($mh, $url_list) ( static $index = 0; // wenn noch Links vorhanden sind if (isset($url_list[$index])) ( // alles ist wie üblich $ ch = curl_init(); // Optionen setzen curl_setopt($ch, CURLOPT_URL, $url_list[$index]); // das Ergebnis zurückgeben, anstatt es anzuzeigen curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // erlauben leitet curl_setopt($ ch, CURLOPT_FOLLOWLOCATION, 1); // nur Header abrufen, um Zeit zu sparen curl_setopt($ch, CURLOPT_NOBODY, 1); // zum Multi-Handle hinzufügen curl_multi_add_handle($mh, $ch); $index++; ) )

Schauen wir uns den Code genauer an (die Nummerierung entspricht den Kommentaren im Code):

  1. Wir fügen eine anfängliche Anzahl von Deskriptoren hinzu, um das System nicht mit Threads zu überlasten. Die Anzahl wird durch die Variable $max_connections gesteuert.
  2. Die Variable $curRunning speichert die Anzahl der laufenden Threads, $running speichert den vorherigen Wert; wenn sie ungleich werden, dann hat einer der Threads seine Arbeit abgeschlossen.
  3. Wir erhalten eine Information über die abgeschlossene Anfrage.
  4. Erfolgt keine Antwort vom Server, funktioniert der Link nicht.
  5. Die Serverantwort ist 404.
  6. Ansonsten funktioniert der Link.
  7. Die Anfrage ist abgeschlossen, wir geben Ressourcen frei.
  8. Fügen wir dem Multideskriptor eine neue URL hinzu.
  9. Funktion add_url_to_multi_handle() Fügt dem Multideskriptor ein neues Handle mit der angegebenen URL hinzu.

Lassen Sie uns das Skript ausführen:

Tote URLs== xample1234.com/ ==404 URLs== www.google.com/dsfasdfafd ==Arbeitende URLs== ru.php.net/manual/ru/function.time.php www.cssbuttongenerator.com/ csslint. net/ codex.wordpress.org/Plugin_API/Action_Reference fortawesome.github.io/Font-Awesome/ fortawesome.github.io/Font-Awesome/ www.oracle.com/technetwork/java/javafx/downloads/index.html Codex. wordpress.org/Plugin_API/Filter_Reference codex.wordpress.org/Roles_and_Capabilities code.google.com/p/google-api-php-client/wiki/OAuth2#Google_APIs_Console jplayer.org/ code.google.com/p/google-api -php-client/ Developers.google.com/+/ Accounts.google.com/ServiceLogin?service=devconsole&passive=1209600&continue=https%3A%2F%2Fcode.google.com%2Fapis%2Fconsole%2F&followup=https%3A%2F %2Fcode.google.com%2Fapis%2Fconsole%2F daneden.github.io/animate.css/ github.com/daneden/animate.css ru2.php.net/manual/ru/function.autoload.php www.google. com/recaptcha/api/verify phpunit.de/phpunit.de/manual/current/en/phpunit-book.html

Die Überprüfung dauerte ca. 2 Sekunden. Durch die gleichzeitige Ausführung von 10 Threads erhöht sich die Leistung im Vergleich zu regulären cURL-Anfragen um das Zehnfache. Um den Inhalt der Serverantwort abzurufen, verwenden Sie die Funktion curl_multi_getcontent($ch) , wobei $ch ein von erhaltener Deskriptor ist curl_multi_info_read() .

Weitere cURL-Funktionen in PHP

HTTP-Authentifizierung

Wenn die HTTP-Anfrage eine Authentifizierung erfordert, verwenden Sie den folgenden Code:

$url = "http://www.somesite.com/members/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Benutzernamen und Passwort senden curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword"); // wenn Weiterleitungen erlaubt sind curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // cURL sendet das Passwort nach Weiterleitungen curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); $output = curl_exec($ch); curl_close($ch);

Hochladen per FTP

PHP verfügt über eine eigene Bibliothek für die Arbeit mit FTP, Sie können aber auch cURL verwenden:

// Datei lesen $file = fopen("/path/to/file", "r"); // URL enthält bereits die notwendigen Daten $url = "ftp://Benutzername: [email protected]:21/Pfad/zur/neuen/Datei"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Optionen curl_setopt($ch, CURLOPT_UPLOAD, 1); curl_setopt($ch, CURLOPT_INFILE, $fp); curl_setopt($ch, CURLOPT_INFILESIZE, filesize("/path/to/file")); curl_setopt($ch, CURLOPT_FTPASCII, 1); $output = curl_exec($ ch); curl_close($ch);

Verwendung eines Proxys

Anfragen können über einen bestimmten Proxy gestellt werden:

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://www.example.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Proxy-Adresse curl_setopt($ch, CURLOPT_PROXY, "11.11.11.11:8080"); // wenn eine Autorisierung erforderlich ist curl_setopt($ch, CURLOPT_PROXYUSERPWD,"user:pass"); $output = curl_exec($ch); curl_close($ch);

Rückruffunktionen

Es ist möglich, Rückrufe zu verwenden, während die Anfrage ausgeführt wird, ohne auf deren Abschluss warten zu müssen. Während beispielsweise die Serverantwort heruntergeladen wird, können wir die bereits empfangenen Daten verwenden, ohne auf den vollständigen Download warten zu müssen.

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://example.com"); curl_setopt($ch, CURLOPT_WRITEFUNCTION,"progress_function"); curl_exec($ch); curl_close($ch); Funktion progress_function($ch,$str) ( echo $str; return strlen($str); )

Die Rückruffunktion muss die Länge der Zeichenfolge zurückgeben, damit die Anfrage ordnungsgemäß funktioniert.

Jedes Mal, wenn der nächste Teil der Serverantwort empfangen wird, wird ein Rückruf aufgerufen.

Abschluss

In diesem Artikel haben wir uns die erweiterten Funktionen von cURL in PHP angesehen. Wenn Sie das nächste Mal URL-Anfragen stellen müssen, verwenden Sie cURL.

Wir müssen oft verschiedene Dateien aus dem Internet herunterladen, zum Beispiel ausführbare Programmdateien, Skriptdateien, Quellarchive. Dies muss jedoch nicht immer über den Browser erfolgen. In vielen Situationen ist es viel einfacher, alle Aktionen über das Terminal durchzuführen. Denn so können Sie den Prozess automatisieren. Andererseits müssen Webmaster von Zeit zu Zeit die Barrierefreiheit der Website testen, gesendete und empfangene Header überprüfen und vieles mehr.

Um solche Probleme und Probleme ähnlicher Größenordnung zu lösen, können Sie das Curl-Dienstprogramm verwenden. Damit können Sie ein viel größeres Spektrum an Problemen lösen und sogar Benutzeraktionen auf der Website simulieren. In diesem Artikel werden wir uns mit der Verwendung von Curl befassen, was es ist und warum dieses Programm benötigt wird.

Tatsächlich ist Curl mehr als nur ein Befehlszeilenprogramm für Linux oder Windows. Hierbei handelt es sich um eine Reihe von Bibliotheken, die die grundlegenden Funktionen für die Arbeit mit URL-Seiten und die Übertragung von Dateien implementieren. Die Bibliothek unterstützt die Arbeit mit Protokollen: FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, LDAP sowie POP3, IMAP und SMTP. Es eignet sich hervorragend zum Simulieren von Benutzeraktionen auf Seiten und anderen Vorgängen mit URLs.

Unterstützung für die Curl-Bibliothek wurde vielen verschiedenen Programmiersprachen und Plattformen hinzugefügt. Das Dienstprogramm „curl“ ist ein unabhängiger Wrapper für diese Bibliothek. Auf dieses Dienstprogramm konzentrieren wir uns in diesem Artikel.

Curl-Befehl

Bevor wir mit der Beschreibung der Verwendung des Befehls „curl linux“ fortfahren, werfen wir einen Blick auf das Dienstprogramm selbst und seine wichtigsten Optionen, die wir benötigen. Die Syntax des Dienstprogramms ist sehr einfach:

Link zu $ ​​Curl-Optionen

Schauen wir uns nun die wichtigsten Optionen an:

  • -# - beim Laden einen einfachen Fortschrittsbalken anzeigen;
  • -0 - Verwenden Sie das http 1.0-Protokoll;
  • -1 - Verwenden Sie das TLSV1-Verschlüsselungsprotokoll;
  • -2 - sslv2 verwenden;
  • -3 - SSLV3 verwenden;
  • -4 - IPv4 verwenden;
  • -6 - IPv6 verwenden;
  • -A- Geben Sie Ihren USER_AGENT an;
  • -B- Cookie in einer Datei speichern;
  • -C- Cookie aus einer Datei an den Server senden;
  • -C- Fahren Sie mit dem Herunterladen der Datei ab dem Haltepunkt oder dem angegebenen Offset fort;
  • -M- maximale Wartezeit auf eine Antwort vom Server;
  • -D- Daten mit der POST-Methode senden;
  • -D- vom Server zurückgegebene Header in einer Datei speichern;
  • -e- Legen Sie das Feld Referer-uri fest, das angibt, von welcher Site der Benutzer kam.
  • -E- ein externes SSL-Zertifikat verwenden;
  • -F- keine Fehlermeldungen anzeigen;
  • -F- Daten in Form eines Formulars senden;
  • -G- Wenn diese Option aktiviert ist, werden alle in der Option -d angegebenen Daten mit der GET-Methode übertragen.
  • -H- Header an den Server übertragen;
  • -ICH- nur den HTTP-Header empfangen und den gesamten Seiteninhalt ignorieren;
  • -J- Cookies aus einer Datei lesen und senden;
  • -J- Header aus der Anfrage entfernen;
  • -L- Weiterleitungen akzeptieren und verarbeiten;
  • -S- maximale Anzahl von Weiterleitungen über den Standort;
  • - Seiteninhalt in eine Datei ausgeben;
  • - Inhalte in einer Datei mit dem Namen der Seite oder Datei auf dem Server speichern;
  • -P- einen Proxy verwenden;
  • --proto- Geben Sie das zu verwendende Protokoll an;
  • -R- Speichern Sie den Zeitpunkt der letzten Änderung einer Remote-Datei.
  • -S- ein Minimum an Informationen über Fehler anzeigen;
  • -S- Fehlermeldungen anzeigen;
  • -T- Laden Sie die Datei auf den Server hoch;
  • -v- die detaillierteste Ausgabe;
  • -y- Mindest-Download-Geschwindigkeit;
  • -Y- maximale Download-Geschwindigkeit;
  • -z- Laden Sie die Datei nur herunter, wenn sie später als zum angegebenen Zeitpunkt geändert wurde.
  • -V- Version anzeigen.

Dies sind keineswegs alle Optionen für Curl Linux, aber es listet die Grundlagen auf, die Sie verwenden müssen.

Wie verwende ich Curl?

Wir haben alles behandelt, was mit der Theorie der Arbeit mit dem Curl-Dienstprogramm zu tun hat. Jetzt ist es an der Zeit, mit der Praxis fortzufahren und Beispiele für den Curl-Befehl anzusehen.

Die häufigste Aufgabe ist diese. Das Herunterladen der Datei ist sehr einfach. Übergeben Sie dazu einfach den Dateinamen oder die HTML-Seite in den Parametern an das Dienstprogramm:

Curl https://raw.githubusercontent.com/curl/curl/master/README.md

Doch hier erwartet Sie eine Überraschung: Der gesamte Inhalt der Datei wird an die Standardausgabe gesendet. Um es in eine beliebige Datei zu schreiben, verwenden Sie:

curl -o readme.txt https://raw.githubusercontent.com/curl/curl/master/README.md

Und wenn Sie möchten, dass die resultierende Datei denselben Namen wie die Datei auf dem Server erhält, verwenden Sie die Option -O:

curl -O https://raw.githubusercontent.com/curl/curl/master/README.md

curl -# -C - -O https://cdn.kernel.org/pub/linux/kernel/v4.x/testing/linux-4.11-rc7.tar.xz

Bei Bedarf können Sie mehrere Dateien mit einem Befehl herunterladen:

curl -O https://raw.githubusercontent.com/curl/curl/master/README.md -O https://raw.githubusercontent.com/curl/curl/master/README

Für einen Administrator kann es auch nützlich sein, eine Datei nur dann herunterzuladen, wenn sie geändert wurde:

curl -z 21.12.17 https://raw.githubusercontent.com/curl/curl/master/README.md -O https://raw.githubusercontent.com/curl/curl/master/README

Geschwindigkeitsbegrenzung

Mit der Option -Y können Sie die Download-Geschwindigkeit auf das erforderliche Limit begrenzen, um das Netzwerk nicht zu überlasten:

curl --limit-rate 50K -O https://cdn.kernel.org/pub/linux/kernel/v4.x/testing/linux-4.11-rc7.tar.xz

Hier müssen Sie die Anzahl der Kilobyte pro Sekunde angeben, die heruntergeladen werden können. Sie können die Verbindung auch beenden, wenn die Geschwindigkeit nicht ausreicht. Verwenden Sie dazu die Option -Y:

curl -Y 100 -O https://raw.githubusercontent.com/curl/curl/master/README.md

Dateien übertragen

curl -T login.txt ftp://speedtest.tele2.net/upload/

Oder prüfen wir, ob die Datei über HTTP gesendet wird; dafür gibt es einen speziellen Dienst:

curl -T ~/login.txt http://posttestserver.com/post.php

In der Antwort teilt Ihnen das Dienstprogramm mit, wo Sie die heruntergeladene Datei finden können.

Senden von POST-Daten

Mit der POST-Methode können Sie nicht nur Dateien, sondern beliebige Daten versenden. Ich möchte Sie daran erinnern, dass diese Methode zum Senden von Daten unterschiedlicher Form verwendet wird. Um eine solche Anfrage zu senden, verwenden Sie die Option -d. Zum Testen nutzen wir denselben Service:

curl -d "field1=val&fileld2=val1"http://posttestserver.com/post.php

Wenn Sie mit dieser Übermittlungsoption nicht zufrieden sind, können Sie so tun, als würden Sie das Formular abschicken. Dafür gibt es eine Option -F:

curl -F "password=@pass;type=text/plain" http://posttestserver.com/post.php

Hier übergeben wir das Passwortfeld mit dem Formular als Klartext, genauso wie Sie mehrere Parameter übergeben können.

Senden und Empfangen von Cookies

Cookies werden von Websites verwendet, um bestimmte Informationen auf der Benutzerseite zu speichern. Dies kann beispielsweise zur Authentifizierung erforderlich sein. Sie können Cookies mit Curl senden und empfangen. Um die empfangenen Cookies in einer Datei zu speichern, verwenden Sie die Option -c:

curl -c cookie.txt http://posttestserver.com/post.php

Anschließend können Sie den Curl-Cookie zurücksenden:

curl -b cookie.txt http://posttestserver.com/post.php

Header-Übertragung und -Analyse

Wir benötigen nicht immer unbedingt den Inhalt der Seite. Manchmal können nur die Schlagzeilen interessant sein. Um nur diese anzuzeigen, gibt es die Option -I:

curl -I https://site

Und mit der Option -H können Sie mehrere oder mehr an den Server senden. Sie können beispielsweise den If-Modified-Since-Header übergeben, sodass die Seite nur zurückgegeben wird, wenn sie geändert wurde:

Curl-Authentifizierung

Wenn der Server eine der gängigen Authentifizierungsarten wie HTTP Basic oder FTP erfordert, kann Curl diese Aufgabe sehr einfach bewältigen. Um Authentifizierungsdetails anzugeben, geben Sie diese einfach durch einen Doppelpunkt getrennt in der Option -u an:

curl -u ftpuser:ftppass -T - ftp://ftp.testserver.com/myfile_1.txt

Die Authentifizierung auf HTTP-Servern erfolgt auf die gleiche Weise.

Verwendung eines Proxys

Wenn Sie zum Herunterladen von Dateien einen Proxyserver verwenden müssen, ist das ebenfalls sehr einfach. Es reicht aus, die Proxy-Server-Adresse in der Option -x anzugeben:

curl -x Proxysever.test.com:3128 http://google.co.in

Schlussfolgerungen

In diesem Artikel haben wir uns mit der Verwendung von Curl befasst, warum dieses Dienstprogramm benötigt wird und welche Hauptfunktionen es bietet. Trotz ihrer Ähnlichkeit sind sie sehr unterschiedlich. Der Befehl „curl linux“ ist eher für die Analyse und Simulation verschiedener Aktionen auf dem Server konzipiert, während „wget“ eher zum Herunterladen von Dateien und zum Crawlen von Websites geeignet ist.

In diesem Artikel geht es um ein so leistungsstarkes Tool wie cURL sowie um die Bibliothek für PHP, die den Zugriff auf dieses Tool ermöglicht – libcurl. Wozu dient das alles? Zur Kommunikation mit dem Server über Datenübertragungsprotokolle, zum Beispiel http oder ftp. Der Rest der Protokolle ist für uns nicht besonders interessant; wer tiefer in dieses Thema eintauchen möchte, muss englischsprachige Ressourcen ausgraben, und dieser Artikel wird die Grundlagen und Anwendungsbeispiele enthalten.

Was genau sind cURL und libcurl? Allgemeine Punkte

Die libcurl-Bibliothek bietet uns also die Möglichkeit, Daten an den Server zu übertragen und Antworten von diesem zu empfangen. Was bringt uns das? Die Fähigkeit, Benutzerverhalten zu emulieren oder! Sie können den Inhalt von Seiten zum späteren Parsen empfangen, Sie können Service-Antwort-Header empfangen und sich programmgesteuert bei Websites anmelden, Skripte zum Posten von Nachrichten (z. B. auf Twitter oder in Foren) oder Informationen erstellen. Alles ist nur durch Ihre Vorstellungskraft begrenzt!

Installation von cURL auf Denwer (Denver). Wie fange ich an, libcurl zu verwenden?

Als erstes müssen wir die Bibliothek installieren. Auf meinem lokalen Computer verwende ich den Denwer-Build, wie die überwiegende Mehrheit der unerfahrenen Webmaster, für die der Artikel gedacht ist. Erfahrene Benutzer, die die PHP+Apache+MySQL-Kombination selbstständig installieren, können cURL installieren. Es ist nicht meine Aufgabe, ihnen zu erklären, wie das geht;) Und wir Anfänger verwenden vorgefertigte Lösungen, um es einfacher zu machen. Installieren Sie libcurl daher wie folgt:

  • Laden Sie das fertige Erweiterungspaket „PHP5: Zusatzmodule“ herunter.
  • Dementsprechend installieren wir es. Nichts Kompliziertes, stimme zu :)
  • Öffnen Sie die Datei im Notepad (ich empfehle immer Notepad++): X:/webservers/usr/local/php5/php.ini //wobei X Ihr Laufwerk ist, auf dem der Webserver installiert ist

    und entfernen Sie das Semikolon am Anfang der Begriffe:

    ;extension=php_curl.dll

  • Wir starten den Denver-Server neu.

Bereit. Um die Funktionalität der Bibliothek zu überprüfen, können Sie die Funktion phpinfo() aufrufen und dort die Zeile finden: cURL-Unterstützung aktiviert. Herzlichen Glückwunsch zum ersten Sieg.

Beschreibung von cURL und erste Schritte

Um mit dem Tool arbeiten zu können, muss es initialisiert werden. Dies geschieht wie folgt:

$ch = curl_init();

Wir haben die cURL-Sitzungsinitialisierungsfunktion verwendet. In diesem Fall können Sie die URL gleich wie folgt festlegen:

$ch = curl_init("https://site");

Und Sie können dies später in den Optionen tun. Die Reihenfolge, in der die Optionen installiert werden, spielt keine Rolle. Dies erledigt eine weitere Funktion:

Curl_setopt (Ressource ch, String-Option, gemischter Wert)

Wir haben den ersten Parameter dieser Funktion, nämlich die Ressource ch, bereits direkt oben erstellt, es gibt jedoch viele Options- und Wertparameter. Ich denke, dass Sie sie hier nicht alle kopieren und einfügen sollten, sondern einfach einen Link zu einer detaillierten Beschreibung der Funktion angeben sollten. Ich hoffe, dass niemand beleidigt ist: curl_setopt.

Ich gebe ein Beispiel für Einstellungsoptionen am Beispiel einer URL:

$url = "https://site"; curl_setopt($ch, CURLOPT_URL,$url);

Noch ein paar Beispiele für Einstellungsoptionen: Lassen Sie uns den Server-Antwortheader abrufen, ohne die Seite selbst abzurufen:

Curl_setopt($ch, CURLOPT_HEADER, 1); // Den Header lesen curl_setopt($ch, CURLOPT_NOBODY, 1); // NUR den Header ohne den Text lesen

Wir haben also die Sitzung initialisiert, die benötigten Parameter eingestellt, jetzt führen wir die resultierende Anfrage aus, schließen die Sitzung und zeigen das Ergebnis an:

$result = curl_exec($ch); curl_close($ch); echo $result;

Als Ergebnis erhalten wir unser erstes voll funktionsfähiges Beispiel für die Verwendung der libcurl-Bibliothek:

$ch = curl_init(); $url = "https://site"; curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_HEADER, 1); // Den Header lesen curl_setopt($ch, CURLOPT_NOBODY, 1); // NUR den Header ohne den Text lesen $result = curl_exec($ch); curl_close($ch); echo $result;

Wie es funktioniert, ist hoffentlich klar, da wir uns jeden Schritt einzeln angesehen haben :) Als Ergebnis erhalten wir vom Server einen HTTP-Antwortheader, den wir im Folgenden auf jeden Fall analysieren werden, um alle Phasen der Interaktion zwischen ihnen besser zu verstehen der Browser und der Server:

HTTP/1.1 200 OK Server: nginx/1.2..php 1

Fabelhaft! Wir haben den Antwortheader vom Server erhalten und die Bibliothek in Aktion getestet. Wie nützlich ist das für uns? Denn jetzt können Sie sich den Handlungsablauf bei der Arbeit mit cURL ungefähr vorstellen:

  • Sitzung initialisieren (curl_init)
  • Legen Sie die Optionen fest, die wir benötigen (curl_setopt)
  • Führen Sie die empfangene Anfrage aus (curl_exec)
  • Sitzung beenden (curl_close)

Struktur des HTTP-Anforderungsheaders

Ich habe zum Beispiel die Seite ya.ru aufgerufen und mir die generierte Browseranfrage und die vom Server erhaltene Antwort angesehen. Hier sind sie:
Anfrage
GET / HTTP/1.1 – Wir versuchen, die Seite unter / abzurufen, also die Hauptseite im Stammverzeichnis des Ordners. Wir verwenden die Protokollversion 1.1.
Benutzeragent: Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14— Wir stellen uns dem Server vor, wir sind der Opera-Browser.
Host: ya.ru – Domänenname der angeforderten Ressource.
Akzeptieren: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1– Liste akzeptabler Ressourcenformate.
Akzeptierte Sprache: ru-RU,ru;q=0.9,en;q=0.8— Liste der unterstützten Sprachen.
Akzeptierte Kodierung: gzip, deflate— Unterstützte Kodierungsmethoden.
Cookie: yandexuid=ХХХХХ – Cookies, falls erforderlich.
Verbindung: Keep-Alive – Bitte unterbrechen Sie die Verbindung nicht und bleiben Sie in Kontakt.
Antwort
HTTP/1.1 200 Ok – Wir erhalten eine Antwort mit dem Code 200, was bedeutet, dass alles in Ordnung ist.
Server: nginx – Der Server hat sich vorgestellt – das ist nginx.
Datum: So, 10. März 2013, 14:10:50 GMT– Aktuelles Datum und Uhrzeit auf dem Server.
Inhaltstyp: text/html; Zeichensatz=UTF-8— Inhaltstyp und Kodierung.
Verbindung: schließen – Der Server möchte keine dauerhafte Verbindung mit uns aufrechterhalten und schließt diese daher sofort. Bei der nächsten Anfrage wird eine neue Verbindung aufgebaut.
Cache-Kontrolle: kein Cache, kein Speichern, maximales Alter = 0, erneut validieren— Caching-Verwaltung. In diesem Fall ist es deaktiviert.
Läuft ab: So, 10. März 2013, 14:10:50 GMT— Datum des voraussichtlichen Ablaufs der Sitzung. In unserem Fall stimmt es mit der Öffnungszeit überein, da der Server es sofort nach der Verarbeitung geschlossen hat.
Zuletzt geändert: So, 10. März 2013 14:10:50 GMT— Zeitpunkt der letzten Änderung.
Inhaltskodierung: gzip – Methode zur Kodierung von Informationen.
Eine vollständige Liste aller Parameter, die im HTTP-Request-Header zu finden sind, finden Sie auf Wikipedia.
Jetzt haben Sie eine ungefähre Vorstellung davon, wie Ihr Browser und Ihr Webserver miteinander kommunizieren. Dies ist sehr nützlich zu wissen und zu verstehen, da wir versuchen werden, Browseraktionen mithilfe der libcurl-Bibliothek zu emulieren. Fortfahren.

Beispiel für die Arbeit mit der Bibliothek

Ich glaube, nachdem einige allgemeine Punkte bereits klar sind und alles klar zu sein scheint, ist es an der Zeit, mit dem Üben fortzufahren und Ihre Fähigkeiten anhand von Beispielen zu verfeinern. Persönlich juckt es mich immer in den Händen, alles in der Praxis auszuprobieren :)

Da cURL für Parser sehr gut geeignet ist, betrachten wir die Funktion, den Seitencode anhand seiner Adresse abzurufen. In diesem Fall ist die Ausgabe ein Array mit dem Titel, dem Seiteninhalt und sogar Fehlercodes, falls etwas schief geht.

Funktion get_web_page($url) ( $uagent = "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14"; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // gibt die Webseite zurück curl_setopt($ch, CURLOPT_HEADER, 0); // gibt keine Header zurück curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // folgt Weiterleitungen curl_setopt($ch, CURLOPT_ENCODING, ""); // Prozesse alle Kodierungen curl_setopt($ch, CURLOPT_USERAGENT, $uagent); // Useragent curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120); // Verbindungszeitlimit curl_setopt($ch, CURLOPT_TIMEOUT, 120); // Antwortzeitlimit curl_setopt($ch, CURLOPT_MAXREDIRS , 10); // Stopp nach der 10. Weiterleitung $content = curl_exec($ch); $err = curl_errno($ch); $errmsg = curl_error($ch); $header = curl_getinfo($ch); curl_close( $ ch); $header["errno"] = $err; $header["errmsg"] = $errmsg; $header["content"] = $content; return $header; )

Eingabeparameter:
URL – Seiten- oder Site-Adresse.
Ausgabeparameterwerte (Array mit drei Elementen):
header['errno'] – wenn etwas schief gelaufen ist, wird hier ein Fehlercode angezeigt.
header[‘errmsg’] – hier erscheint der Fehlertext.
header['content'] – die eigentliche Seite\Datei\Bild usw.

Wir verwenden die Funktion beispielsweise so:

$result = get_web_page("https://ya.ru"); if (($result["errno"] != 0)||($result["http_code"] != 200)) ( echo $result["errmsg"]; ) else ( $page = $result["content "]; echo $page; )

Alles sollte fehlerfrei ablaufen und Sie erhalten den Seitencode in der Variablen $page. Wenn wir versuchen, die nicht existierende Seite yaaaaaaaaaaaa.ru abzurufen, erhalten wir die Fehlermeldung:

Host konnte nicht aufgelöst werden: yaaaaaaaaaaaa.ru; Host nicht gefunden

Alles ist richtig und schön verarbeitet :)
Anschließend können Sie mit dem Seitencode machen, was Sie wollen, ihn beispielsweise mit regulären Ausdrücken analysieren. Aber das ist alles in den nächsten Lektionen, aber jetzt hören wir damit auf.

JavaScript ist in Ihrem Browser blockiert. Bitte aktivieren Sie JavaScript, damit die Website funktioniert!

Locken

PHP unterstützt libcurl, eine von Daniel Stenberg erstellte Bibliothek, die es ermöglicht, eine Verbindung zu verschiedenen Servertypen und unter Verwendung verschiedener Protokolle herzustellen.
libcurl unterstützt derzeit die Protokolle http, https, ftp, gopher, telnet, dict, file und ldap.
libcurl unterstützt außerdem HTTPS-Zertifikate, HTTP POST, HTTP PUT, FTP-Upload (dies kann auch mit der FTP-PHP-Erweiterung durchgeführt werden), HTTP-Formular-Upload, Proxys, Cookies und Benutzer+Passwort-Authentifizierung.

Diese Funktionen wurden in PHP 4.0.2 eingeführt.

curl_init

curl_init – initialisiert eine CURL-Sitzung.

Beschreibung

Ressource curl_init()

Funktion curl_init() Initialisiert eine neue Sitzung und gibt ein CURL-Handle zur Verwendung in den Funktionen , und zurück. Wenn der optionale Parameter URL bereitgestellt wird, erhält die Option CURLOPT_URL den Wert dieses Parameters. Sie können es manuell mit der . installieren.

curl_setopt

curl_setopt – legt Optionen für die CURL-Übertragung/Übertragung fest.

Beschreibung

bool curl_setopt(Ressource ch, String-Option, gemischter Wert)

Funktion curl_setopt() Legt Optionen für die durch den Parameter identifizierte CURL-Sitzung fest CH. Parameter Möglichkeit ist die Option, die Sie festlegen möchten, und Wert Dies ist der Optionswert Möglichkeit .

Parameter Wert muss für die folgenden Optionen lang sein (durch Parameter angegeben). Möglichkeit):

  • CURLOPT_INFILESIZE: Wenn Sie eine Datei auf eine Remote-Site hochladen, sollte diese Option verwendet werden, um PHP mitzuteilen, wie groß die erwartete Dateigröße sein wird.
  • CURLOPT_VERBOSE: Setzen Sie diese Option auf einen Wert ungleich Null, wenn CURL alle Aktionen melden soll.
  • CURLOPT_HEADER: Setzen Sie diese Option auf einen Wert ungleich Null, wenn der Header in die Ausgabe einbezogen werden soll.
  • CURLOPT_NOPROGRESS: Setzen Sie diese Option auf einen Wert ungleich Null, wenn Sie nicht möchten, dass PHP eine Fortschrittsanzeige für die CURL-Übertragung anzeigt. (PHP setzt diese Option automatisch auf einen Wert ungleich Null; Sie müssen sie nur beim Debuggen ändern.)
  • CURLOPT_NOBODY: Setzen Sie diese Option auf einen Wert ungleich Null, wenn Sie nicht möchten, dass der Text in die Ausgabe einbezogen wird.
  • CURLOPT_FAILONERROR: Setzen Sie diese Option auf einen Wert ungleich Null, wenn Sie möchten, dass PHP stillschweigend beendet wird, wenn der zurückgegebene HTTP-Code größer als 300 ist. Standardmäßig wird die Seite normal zurückgegeben, wobei der Code ignoriert wird.
  • CURLOPT_UPLOAD: Setzen Sie diese Option auf einen Wert ungleich Null, wenn PHP die Datei für den Upload vorbereiten soll.
  • CURLOPT_POST: Setzen Sie diese Option auf einen Wert ungleich Null, wenn Sie möchten, dass PHP einen regulären HTTP-POST durchführt. Dieser POST hat die normale Form application/x-www-form-urlencoded, die am häufigsten von HTML-Formularen verwendet wird.
  • CURLOPT_FTPLISTONLY: Setzen Sie diese Option auf einen Wert ungleich Null und PHP listet FTP-Verzeichnisnamen auf.
  • CURLOPT_FTPAPPEND: Setzen Sie diese Option auf einen Wert ungleich Null und PHP hängt an die Remote-Datei an, anstatt sie zu überschreiben.
  • CURLOPT_NETRC: Setzen Sie diese Option auf einen Wert ungleich Null und PHP durchsucht Ihre ~./netrc-Datei, um Ihren Benutzernamen und Ihr Passwort für die Remote-Site zu finden, zu der Sie eine Verbindung herstellen.
  • CURLOPT_FOLLOWLOCATION: Setzen Sie diese Option auf einen Wert ungleich Null, um jedem „Location:“-Header zu folgen, den der Server als Teil eines HTTP-Headers sendet (beachten Sie, dass es sich hierbei um eine Rekursion handelt, PHP folgt allen gesendeten „Location:“-Headern). )
  • CURLOPT_PUT: Setzen Sie diese Option auf einen Wert ungleich Null, um die Datei per HTTP PUT abzurufen. Die Datei für PUT muss mit CURLOPT_INFILE und CURLOPT_INFILESIZE festgelegt werden.
  • CURLOPT_MUTE: Setzen Sie diese Option auf einen Wert ungleich Null und PHP wird in Bezug auf CURL-Funktionen verborgen arbeiten.
  • CURLOPT_TIMEOUT: Übergeben Sie einen Long-Wert als Parameter, der die maximale Zeit in Sekunden enthält, die Sie CURL-Funktionen für die Ausführung zulassen.
  • CURLOPT_CONNECTTIMEOUT: Übergeben Sie einen Parameter vom Typ „long“, der die maximale Zeit in Sekunden enthält, die Sie beim Verbindungsversuch warten dürfen. Verwenden Sie 0, um ewig zu warten.
  • CURLOPT_LOW_SPEED_LIMIT: Übergeben Sie einen Long-Parameter als Parameter, der die Übertragungsgeschwindigkeit in Bytes pro Sekunde enthält, unter der die Übertragung während der Ausführung CURLOPT_LOW_SPEED_TIME in Sekunden ausgeführt werden muss, damit PHP sie als zu langsam betrachtet und abbricht.
  • CURLOPT_LOW_SPEED_TIME: Übergeben Sie einen Long-Parameter als Parameter, der die Zeit in Sekunden enthält, unter der die Übertragung ausgeführt werden muss, während CURLOPT_LOW_SPEED_LIMIT ausgeführt wird, damit PHP sie als zu langsam betrachtet und abbricht.
  • CURLOPT_RESUME_FROM: Übergeben Sie long als Parameter, der den Byte-Offset enthält, bei dem die Übertragung beginnen soll.
  • CURLOPT_SSLVERSION: Übergeben Sie einen Long-Wert als Parameter, der die zu verwendende SSL-Version enthält (2 oder 3). Standardmäßig versucht PHP, dies selbst zu ermitteln. In einigen Fällen müssen Sie dies jedoch manuell festlegen.
  • CURLOPT_SSL_VERIFYHOST: Übergeben Sie long, wenn CURL den allgemeinen Namen des Peer-Zertifikats in einem SSL-Handshake prüfen soll. Ein Wert von 1 gibt an, dass wir prüfen sollten, ob ein allgemeiner /common-Name vorhanden ist, ein Wert von 2 gibt an, dass wir sicherstellen sollten, dass er mit dem angegebenen Hostnamen übereinstimmt.
  • CURLOPT_TIMECONDITION: Übergeben Sie einen Long-Wert als Parameter, der bestimmt, wie CURLOPT_TIMEVALUE behandelt wird. Sie können diesen Parameter auf TIMECOND_IFMODSINCE oder TIMECOND_ISUNMODSINCE setzen. Dies funktioniert nur für HTTP.
  • CURLOPT_TIMEVALUE: Übergeben Sie einen Long-Wert als Parameter, der die Zeit in Sekunden seit dem 1. Januar 1970 angibt. Diese Zeit wird wie in der Option CURLOPT_TIMEVALUE angegeben verwendet, oder es wird die Standardeinstellung TIMECOND_IFMODSINCE verwendet.
  • CURLOPT_RETURNTRANSFER: Übergeben Sie einen Wert ungleich Null, wenn CURL die empfangenen Informationen direkt zurückgeben soll, anstatt sie direkt zu drucken.

Parameter Wert muss eine Zeichenfolge für die folgenden Parameterwerte sein Möglichkeit :

Die folgenden Optionen erwarten einen Dateideskriptor, der über die Funktion ermittelt wird fopen() :

  • CURLOPT_FILE: Die Datei, in der die Ausgabe Ihrer Übertragung abgelegt werden soll, standardmäßig ist sie STDOUT.
  • CURLOPT_INFILE: Die Datei, aus der Ihre Übertragungseingabe stammt.
  • CURLOPT_WRITEHEADER: Datei zum Aufzeichnen des Header-Teils der Ausgabe.
  • CURLOPT_STDERR: Datei zum Aufzeichnen von Fehlern, anstelle von stderr.

Parameter Wert long write_callback (resource ch, string data)( ... return strlen($data);) Möglichkeit :

  • CURLOPT_WRITEFUNCTION: .
  • CURLOPT_HEADERFUNCTION: .

Parameter Wert sollte eine Funktion der folgenden Form sein string read_callback (Ressource ch, Ressource fd, lange Länge)() für die folgenden Parameterwerte Möglichkeit :

  • CURLOPT_READFUNCTION: .

curl_exec

curl_exec – führt eine CURL-Sitzung aus.

Beschreibung

bool curl_exec(Ressource ch)

Diese Funktion sollte aufgerufen werden, nachdem Sie eine CURL-Sitzung initialisiert haben und alle Optionen für diese Sitzung bereits festgelegt wurden. Sein Zweck besteht lediglich darin, eine vordefinierte CURL-Sitzung auszuführen (im Parameter angegeben). CH).

curl_close

curl_close – schließt die CURL-Sitzung.

Beschreibung

Leere curl_close(Ressource ch)

Diese Funktion schließt die CURL-Sitzung und gibt alle Ressourcen frei. CURL-Handle CH wird ebenfalls gelöscht.

curl_errno

curl_errno – gibt eine Ganzzahl zurück, die die letzte Fehlernummer enthält.

Beschreibung

Beispiel 1: Initialisieren einer neuen CURL-Sitzung und Abrufen einer Webseite.
Beispiel 2: Verwenden des CURL-Moduls von PHP, um example.com abzurufen
Beispiel 3: Überprüfen der URL-Zugänglichkeit mit CURL von PHP
Beispiel 4: Trennen des Headers vom Body, der mit PHPs CURL erhalten wurde
Beispiel 5: Ermitteln einer Verweis-URL mithilfe von PHPs CURL
das Problem: curl_setopt($ch,FOLLOW_LOCATION,1); Der Fehler: Probleme mit open_basedir und Safe_mode. Die Lösung: Eine Funktion, die bereits von jemandem entwickelt wurde. Die Lösung Nr. 2: Dieselbe Funktion, modifiziert, funktioniert bei mir hervorragend.= $curl_max_loops) ( $curl_loops = 0; return FALSE; ) curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $data = curl_exec($ch); list($header, $data) = explosion("\n\n", $data, 2); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($http_code == 301 || $http_code == 302) ( $matches = ; preg_match("/Location:(.*?)\n/", $header, $matches); $url = @parse_url(trim (array_pop($matches))); if (!$url) ( //konnte die URL nicht verarbeiten, um zu $curl_loops = 0; return $data; ) $last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL)) ; if (!$url["scheme"]) $url["scheme"] = $last_url["scheme"]; if (!$url["host"]) $url["host"] = $last_url[ "host"]; if (!$url["path"]) $url["path"] = $last_url["path"]; $new_url = $url["scheme"] . "://" . $ url["host"] . $url["path"] . ($url["query"]?"?".$url["query"]:""); curl_setopt($ch, CURLOPT_URL, $new_url) ; debug("Redirecting to", $new_url); return curl_redir_exec($ch); ) else ( $curl_loops=0; return $data; ) ) ?>
Verwenden Sie diese Funktion einfach ohne de FOLLOW_LOCATION und sollte funktionieren. Das Problem bestand darin, dass, wenn Sie zu der Zeile gelangen, in der Sie die Daten zurückgeben, wenn http_code anders als 301 oder 302 war, $data veraltete oder keine Informationen enthält. also erledigt $debbbb den Job.
Beispiel 6: Parsen eines Cookies aus dem Header mit CURL PHP
Manchmal können Sie CURLOPT_COOKIEJAR und CURLOPT_COOKIEFILE aufgrund der PHP-Einstellungen des Servers nicht verwenden (Sie sagen, dass Sie mit diesen Optionen alle Dateien vom Server abrufen können). Hier ist die Lösung: 1) Verwenden Sie CURLOPT_FOLLOWLOCATION nicht. 2) Verwenden Sie curl_setopt($ch, CURLOPT_HEADER, 1) 3) Rufen Sie die Header-Cookies wie folgt ab: preg_match_all("|Set-Cookie: (.*);|U", $content, $results); $cookies = implode(";", $results); 4)Setzen Sie sie mit curl_setopt($ch, CURLOPT_COOKIE, $cookies);
Beispiel 7: Parsen eines Cookies aus dem Header mit CURL PHP
Wie Yevgen bereits erwähnt hat, können wir CURLOPT_COOKIEJAR und CURLOPT_COOKIEFILE manchmal nicht verwenden. Nachfolgend finden Sie eine Header-Callback-Funktion, die ich im Januar geschrieben habe und mit der Sie Cookies zwischen cURL-Anfragen verwalten können. Cookies werden bei allen Anfragen zu $ch hinzugefügt, auch während der Umleitung, sodass Sie dies können Verwenden Sie es zusammen mit CURLOPT_FOLLOWLOCATION. Hier ist der Code: function read_header($ch, $string) ( global $location; #Standort verfolgen/weiterleiten global $cookiearr; #cookies hier speichern global $ch; # ^überschreibt den Funktionsparameter $ch # das ist in Ordnung, weil wir # das globale $ch mit # neuen Cookies aktualisieren müssen $length = strlen($string); if(!strncmp($string, "Location:", 9)) ( #den Überblick behalten letzte Weiterleitung $location = trim(substr($string, 9, -1)); ) if(!strncmp($string, "Set-Cookie:", 11)) ( #get the cookie $cookiestr = trim(substr( $string, 11, -1)); $cookie = explosion(";", $cookiestr); $cookie = explosion("=", $cookie); $cookiename = trim(array_shift($cookie)); $cookiearr [$cookiename] = trim(implode("=", $cookie)); ) $cookie = ""; if(trim($string) == "") ( #execute only at end of header foreach ($cookiearr as $key=>$value) ( ​​​​$cookie .= "$key=$value; "; ) curl_setopt ($ ch, CURLOPT_COOKIE, $cookie); ) return $length; ) curl_setopt($ch, CURLOPT_HEADERFUNCTION, "read_header"); Dieser Code geht davon aus, dass Sie $ch wiederverwenden, ohne es jedes Mal zu initialisieren (rufen Sie „curl_init“ am Anfang nur einmal auf). Wenn Sie $ch zu irgendeinem Zeitpunkt in Ihrem Code erneut initialisieren müssen, können Sie auf die aktuell in $cookiearr gespeicherten Cookies zugreifen und sie in das neue $ch einbinden. Ich habe diese Funktion geschrieben, bevor ich genug Erfahrung mit regulären Ausdrücken hatte, sodass Sie hier keine preg_match-Aufrufe finden. Ich habe diesen Code eine ganze Weile verwendet und ohne Probleme beim Zugriff auf Gmail, Yahoo, Hotmail, AOL usw., wo ich musste Gehen Sie die Anmeldung und einige Seiten durch, bevor Sie zu dem gelangen, wonach ich gesucht habe.
Beispiel 8: Einrichten eines Header-Load-Handlers mit CURL PHP
Mit cURL musste ich ein Drittanbieter-Skript aufrufen, das Binärdaten als Anhang zurückgab, um die abgerufenen Daten erneut als Anhang weiterzugeben. Das Problem bestand darin, dass das Drittanbieter-Skript gelegentlich HTTP-Fehler zurückgab und ich in solchen Fällen vermeiden wollte, Anhänge mit der Länge Null weiterzugeben. Die Kombination aus der Verwendung von CURLOPT_FAILONERROR und CURLOPT_HEADERFUNCTION Callback hat dazu beigetragen, die HTTP-Fehler des Drittanbieter-Skripts sauber zu verarbeiten: function curlHeaderCallback($resURL, $strHeader) ( if (preg_match("/^HTTP/i", $strHeader)) ( header($strHeader ); header("Content-Disposition: attachment; filename="file-name.zip""); ) return strlen($strHeader); ) $resURL = curl_init("http://site/"); curl_setopt($resURL, CURLOPT_BINARYTRANSFER, 1); curl_setopt($resURL, CURLOPT_HEADERFUNCTION, "curlHeaderCallback"); curl_setopt($resURL, CURLOPT_FAILONERROR, 1); curl_exec($resURL); $intReturnCode = curl_getinfo($resURL, CURLINFO_HTTP_CODE); curl_close($resURL); if ($intReturnCode != 200) ( print "Fehler mit Code: " . $intReturnCode; )
Beispiel 9. Speichern einer Seite in einer Datei und Berechnen der Übertragungsrate mit CURL PHP
WritePageToFile("http://es.php.net", "es.php.net.txt"); function WritePageToFile($sHTMLpage, $sTxtfile) ( $sh = curl_init($sHTMLpage); $hFile = FOpen($sTxtfile, "w"); curl_setopt($sh, CURLOPT_FILE, $hFile); curl_setopt($sh, CURLOPT_HEADER, 0); curl_exec ($sh); $sAverageSpeedDownload = curl_getInfo($sh, CURLINFO_SPEED_DOWNLOAD); $sAverageSpeedUpload = curl_getInfo($sh, CURLINFO_SPEED_UPLOAD); echo "
"; echo "Durchschnittliche Downloadgeschwindigkeit == " . $sAverageSpeedDownload . " 
"; echo "Durchschnittliche Upload-Geschwindigkeit == " . $sAverageSpeedUpload ."
"; Echo "
"; $aCURLinfo = curl_getInfo($sh); print_r($aCURLinfo); echo "
"; curl_close($sh); FClose ($hFile); echo "( Sehen Sie sich die Datei „.$sTxtfile.“ im gleichen Pfad des Hostings an, in dem sich dieses PHP-Skript befindet).
"; }
Beispiel 9. Empfangen einer Seite über eine SSL-Verbindung (https)
$ch=curl_init("https://site"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Deaktivieren Sie den Fehler „SSL-Zertifikatproblem, überprüfen Sie, ob das CA-Zertifikat in Ordnung ist“ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // Deaktivieren Sie den Fehler „SSL: Zertifikatssubjektname „hostname.ru“ stimmt nicht mit dem Zielhostnamen „123.123“ überein“ curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); $out=curl_exec($ch); //$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); //echo "http_code=".$http_code,", err=".curl_error($ch); curl_close($ch);
Beispiel 10: Verwendung von Sitzungen und Cookies in Curl
$cookie_filename=sys_get_temp_dir()+"/cookie.tmp"; $curl=curl_init("http://site"); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_filename);//empfangene COOKIES in einer Datei speichern curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_filename); //sende die von ihm während der Autorisierung erhaltenen COOKIES an den Server $out=curl_exec($curl);
Beispiel 11: Datei-Upload und mehrdimensionales Array in Curl. CURLOPT_POSTFIELDS + CurlFile

Wenn Sie in einer POST-Anfrage ein mehrdimensionales Array und eine Datei senden müssen, stoßen Sie auf ein unlösbares Problem. Wenn Sie ein mehrdimensionales Array an CURLOPT_POSTFIELDS übergeben, wird die zweite Ebene als Zeichenfolge „Array“ übergeben. Wenn Sie mit http_build_query konvertieren, können Sie die Datei nicht übertragen.

Nachfolgend finden Sie eine Funktion zum Kodieren eines zweidimensionalen Arrays mit Dateiladen für Curl, die in beiden älteren Versionen von PHP 5.3, PHP 5.4 und PHP 5.6 funktioniert

/** konvertiert ein mehrdimensionales Array mithilfe komplexer Indizes in ein eindimensionales Array und ersetzt das @ im Präfix durch CurlFile zur Verwendung in Curl * @param $inputArray * @param string $inputKey * @return array $requestVars = array ("id" => array( 1, 2,"id"=>1234), "name" => "log", "logfile" => "@/tmp/test.log"); wir bekommen: ["id"]=> int(1) ["id"]=> int(2) ["id"]=> int(1234) ["name"]=> string(3) "log" [ "logfile"]=> string(13) "/tmp/test.log" ) */ function convertToStringArray($inputArray, $inputKey="") ( $resultArray=; foreach ($inputArray as $key => $value ) ( $tmpKey = (bool)$inputKey ? $inputKey."[$key]" : $key; if (is_array($value)) ( $resultArray+=convertToStringArray($value, $tmpKey); ) elseif ($value = = "@")( $resultArray[$tmpKey] = (class_exists(" CURLFile ", false)) ? new CurlFile(ltrim($value, "@")) : $value; ) else ( $resultArray[$tmpKey ] = $value; ) ) return $resultArray; ) // check $requestVars = array("id" => array(1, 2,"id"=>1234), "name" => "log", "logfile " => "@/tmp/test.log"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "site"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, convertToStringArray($requestVars)); $res = curl_exec($ch); curl_close($ch); Anwendungsbeispiele für die Verwendung von Curl