Curl-ramen gebruiken. PHP CURL - functies en gebruiksvoorbeelden. Gegevens ophalen met cURL

21 antwoorden

Het kan zijn dat je al een krul hebt

Mogelijk hoeft u niets te downloaden:

  • Als u Windows 10 versie 1803 of hoger gebruikt, wordt uw besturingssysteem geleverd met een exemplaar van curl dat al is geconfigureerd en klaar voor gebruik.
  • Als je meer esoterische behoeften hebt (je hebt bijvoorbeeld cygwin-builds, builds van derden, libcurl, headerbestanden, bronnen, enz.) nodig, gebruik dan de curl-downloadwizard. Nadat u vijf vragen heeft beantwoord, krijgt u een lijst met downloadlinks te zien.

    Krul verwijderen en aanpassen

    Zoek curl.exe in uw gedownloade pakket; het staat waarschijnlijk onder bin\ .

    Selecteer een locatie op uw harde schijf die als permanent onderkomen voor de krullen zal dienen:

    • Als je van curl een eigen map wilt maken, kun je C:\Program Files\curl\ of C:\curl\ gebruiken.
    • Als u veel gratis uitvoerbare bestanden heeft en niet veel afzonderlijke mappen aan uw PATH wilt toevoegen, gebruik dan hiervoor één map, zoals C:\Program Files\tools\ of C:\tools\ .

    Plaats curl.exe in de map. En verplaats de map of de inhoud ervan nooit.

    Vervolgens wilt u curl overal op de opdrachtregel beschikbaar maken. Om dit te doen, voegt u de map als volgt toe aan PATH:

    1. Klik op het Windows 10 Start-menu. Begin met het typen van 'omgeving'.
    2. U krijgt het zoekresultaat te zien. Systeemomgevingsvariabelen bewerken. Kies dit.
    3. Het venster Systeemeigenschappen wordt geopend. Klik op de knop Omgevingsvariabelen omlaag.
    4. Selecteer de variabele "Pad" in het gedeelte "Systeemvariabelen" (onderste veld). Klik op de knop Wijziging.
    5. Klik op " Toevoegen" en plak het pad naar de map waar curl.exe zich bevindt.
    6. Klik OK, indien nodig. Sluit geopende consolevensters en open ze opnieuw zodat ze het nieuwe PATH krijgen.

    Geniet nu van het typen van curl op elke opdrachtregel. Tijd om plezier te hebben!

    Om curl uit te voeren vanaf de opdrachtregel

    a) Klik met de rechtermuisknop op het pictogram Deze computer

    b) Selecteer "Eigenschappen"

    d) Ga naar het tabblad [Geavanceerd] - knop "Omgevingsvariabelen".

    e) Selecteer onder "Systeemvariabele" "Pad" en "Bewerken"

    f) Voeg een puntkomma toe en vervolgens het pad naar waar u uw curl.exe hebt geplaatst (bijvoorbeeld D:\software\curl)

U kunt nu vanaf de opdrachtregel uitvoeren door het volgende te typen:

Krul www.google.com

Vanaf Windows 10 versie 1803 (en eerder, Insider build 17063) installeert u niet langer curl . Windows bevat zijn eigen curl.exe (en tar.exe) in C:\Windows\System32\, waartoe u rechtstreeks toegang hebt vanuit de reguliere CMD.

C:\Users\vonc>C:\Windows\System32\curl.exe --version curl 7.55.1 (Windows) libcurl/7.55.1 WinSSL Releasedatum: Protocollen: dict-bestand ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp Kenmerken: AsynchDNS IPv6 Largefile SSPI Kerberos SPNEGO NTLM SSL C:\Users\vonc>C:\Windows\System32\tar.exe --versie bsdtar 3.3.2 - libarchive 3.3.2 zlib/1.2.5.f- ipp

Het is waarschijnlijk de moeite waard om op te merken dat Powershell v3 en hoger de cmdlet Invoke-WebRequest bevat, die enkele curlingmogelijkheden heeft. Het is waarschijnlijk de moeite waard om ook de cmdlets New-WebServiceProxy en Invoke-RestMethod te vermelden.

Ik weet niet zeker of ze bij je passen of niet, maar ook al ben ik geen Windows, ik moet zeggen dat ik de objectbenadering die PS gebruikt veel gemakkelijker vind om met hulpprogramma's als curl, wget, enz. te werken. Misschien zijn ze het bekijken waard

Je kunt de nieuwste versie van curl, openssl, libssh2 en zlib in 3 eenvoudige stappen maken door deze tutorial te volgen.

Curl is statisch gebouwd, zodat u niet de benodigde dynamische runtime hoeft door te geven.

U kunt ook de vooraf gebouwde versie (x86 en x64) downloaden van

Ik was op zoek naar het downloadproces Krul en overal zeiden ze: kopieer het bestand curl.exe op System32, maar ze gaven geen directe link. zodat u hier kunt genieten krul.exe gemakkelijk om map bin Zojuist

pak het uit en ga vervolgens naar de bin-map waar u het exe-bestand krijgt

Ik dacht dat ik precies zou schrijven wat ik deed (Windows 10, 64-bit versie):

Selecteer het uitvoerbare krulbestand.

Selecteer Win64.

Kies universeel.

Kies er een.

curl-versie: 7.53.1 - SSL ingeschakeld SSH ingeschakeld. Krediet: Victor Shakats. Dit pakket is een uitvoerbaar type curl. Met deze link krijgt u een vooraf gecompileerd binair bestand met krullen (of in sommige gevallen kunt u de informatie gebruiken op de pagina waar de link u naartoe brengt). U kunt libcurl wel of niet installeren als een gedeelde bibliotheek/DLL. Het bestand is verpakt met 7zip. 7zip is een bestandsarchiveringsformaat.

Klik op downloaden.

Het bestand curl-7.53.1-win64-mingw.7z zou in uw downloadmap moeten staan.

Installeer 7-Zip als je dit niet hebt.

Klik met de rechtermuisknop, 7-Zip, hier uitpakken. Kopieer en plak het uitgepakte bestand ergens zoals Z:\Tools\

Als u in de bin-map kijkt, ziet u curl.exe. Als u erop dubbelklikt, knippert het venster snel en verdwijnt het. Om het uit te voeren, moet u de opdrachtregel gebruiken. Ga naar uw bin-map en voer curl in, gevolgd door uw opties om het verzoek in te dienen. Je moet dubbele aanhalingstekens gebruiken. Enkele aanhalingstekens werken niet met curl op Windows.

Nu moet u curl toevoegen aan de gebruikerspadvariabele, zodat u niet naar de juiste map hoeft te navigeren om het programma uit te voeren. Ga naar Deze pc, Computer, Systeemeigenschappen, Geavanceerde systeeminstellingen, log in als beheerder (je bent toch geen beheerder, toch?). Omgevingsvariabelen, Systeemvariabelen, bekijk de lijst en selecteer Pad, vervolgens Bewerken, vervolgens Nieuw en vervolgens b.v.

Z:\Tools\curl-7.53.1-win64-MinGW\Bin

Je kunt een backslash toevoegen als je wilt, ik denk niet dat het er toe doet. Druk op de knop Omhoog totdat deze bovenaan de lijst staat en u deze gemakkelijk kunt zien vanaf het vorige scherm. Klik op OK, OK, OK, open vervolgens de opdrachtprompt en u kunt curl uitvoeren door curl vanuit elke map als elke gebruiker te typen. Vergeet je dubbele aanhalingstekens niet.

Dit is het antwoord dat ik graag zou willen ontvangen.

Dit installatieprogramma maakte het gemakkelijk voor mij http://www.confusedbycode.com/curl/

"U kunt cURL voor Windows met slechts een paar klikken installeren. Download en voer eenvoudig het installatieprogramma uit de onderstaande tabel uit en klik op Installeren. De standaardinstallatie omvat.

In dit artikel wordt gesproken over zo'n krachtig hulpmiddel als cURL, evenals de bibliotheek voor PHP die toegang biedt tot dit hulpmiddel: libcurl. Waar is dit allemaal voor? Om met de server te communiceren via protocollen voor gegevensoverdracht, bijvoorbeeld http of ftp. De rest van de protocollen zijn voor ons niet bijzonder interessant; als iemand dieper op dit onderwerp wil ingaan, zal hij Engelstalige bronnen moeten opzoeken, en dit artikel zal de basisprincipes en gebruiksvoorbeelden bevatten.

Wat zijn cURL en libcurl precies? Algemene punten

De libcurl-bibliotheek biedt ons dus de mogelijkheid om gegevens naar de server te verzenden en daar antwoorden van te ontvangen. Wat levert dit ons op? De mogelijkheid om gebruikersgedrag te emuleren of ! U kunt de inhoud van pagina's ontvangen om deze vervolgens te parseren, u kunt serviceantwoordheaders ontvangen en programmatisch inloggen op sites, scripts maken voor het plaatsen van berichten (bijvoorbeeld op Twitter of op forums) of informatie. Alles wordt alleen beperkt door je verbeeldingskracht!

Curl installeren op Denwer (Denver). Hoe begin je met het gebruiken van libcurl?

Het eerste dat we moeten doen is de bibliotheek installeren. Op mijn lokale computer gebruik ik de Denwer-build, zoals de overgrote meerderheid van beginnende webmasters, voor wie het artikel bedoeld is. Ervaren gebruikers die zelfstandig de combinatie php+apache+mysql installeren, kunnen cURL installeren, het is niet aan mij om hen uit te leggen hoe dit moet;) En wij, beginners, gebruiken kant-en-klare oplossingen om het gemakkelijker te maken. Installeer libcurl daarom als volgt:

  • Download het kant-en-klare uitbreidingspakket “PHP5: extra modules”.
  • Dienovereenkomstig installeren we het. Niets ingewikkelds, mee eens :)
  • Open het bestand in Kladblok (ik raad altijd Notepad++ aan): X:/webservers/usr/local/php5/php.ini //waarbij X uw schijf is waarop de webserver is geïnstalleerd

    en verwijder de puntkomma aan het begin van de termen:

    ;extensie=php_curl.dll

  • We starten de Denver-server opnieuw op.

Klaar. Om de functionaliteit van de bibliotheek te controleren, kunt u de functie phpinfo() aanroepen en daar de regel vinden: cURL-ondersteuning ingeschakeld. Gefeliciteerd met je eerste overwinning.

Beschrijving van cURL en eerste stappen

Om met de tool te kunnen werken, moet deze worden geïnitialiseerd. Dit gebeurt als volgt:

$ch = curl_init();

We hebben de cURL-sessie-initialisatiefunctie gebruikt. In dit geval kunt u de URL meteen als volgt instellen:

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

En u kunt dit later doen, in de opties. De volgorde waarin de opties worden geïnstalleerd, doet er niet toe. Dit wordt gedaan door een andere functie:

Curl_setopt (bronch, tekenreeksoptie, gemengde waarde)

We hebben de eerste parameter van deze functie al gemaakt, dat wil zeggen resource ch, net erboven, maar er zijn veel optie- en waardeparameters. Ik denk dat je ze niet allemaal hier moet kopiëren en plakken, maar gewoon een link moet geven naar een gedetailleerde beschrijving van de functie, ik hoop dat niemand zich beledigd zal voelen: curl_setopt.

Ik geef een voorbeeld van instellingsopties met een URL als voorbeeld:

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

Nog een paar voorbeelden van instellingsopties: laten we de antwoordheader van de server bekijken, zonder de pagina zelf op te halen:

Curl_setopt($ch, CURLOPT_HEADER, 1); // lees de header curl_setopt($ch, CURLOPT_NOBODY, 1); // lees ALLEEN de header zonder de body

We hebben dus de sessie geïnitialiseerd, de parameters ingesteld die we nodig hebben, nu voeren we het resulterende verzoek uit, sluiten de sessie en geven het resultaat weer:

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

Als resultaat krijgen we ons eerste volledig werkende voorbeeld van het gebruik van de libcurl-bibliotheek:

$ch = curl_init(); $url = "https://site"; curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_HEADER, 1); // lees de header curl_setopt($ch, CURLOPT_NOBODY, 1); // lees ALLEEN de header zonder de body $result = curl_exec($ch); curl_close($ch); echo $resultaat;

Hoe het werkt, hoop ik, is duidelijk, omdat we elke stap afzonderlijk hebben bekeken :) Als resultaat ontvangen we een HTTP-antwoordheader van de server, die we hieronder zeker zullen analyseren om alle fasen van de interactie tussen de browser en de server:

HTTP/1.1 200 OK-server: nginx/1.2..php 1

Geweldig! We hebben de responsheader van de server ontvangen en de bibliotheek in actie getest. Hoe is dit nuttig voor ons? Omdat je je nu grofweg de volgorde van acties kunt voorstellen als je met cURL werkt:

  • Sessie initialiseren (curl_init)
  • Stel de opties in die we nodig hebben (curl_setopt)
  • Voer het ontvangen verzoek uit (curl_exec)
  • Sessie beëindigen (curl_close)

Headerstructuur van HTTP-verzoek

Ik ging bijvoorbeeld naar de ya.ru-pagina en keek naar het gegenereerde browserverzoek en het antwoord dat van de server werd ontvangen. Hier zijn ze:
Verzoek
GET / HTTP/1.1 - We proberen de pagina op / te krijgen, dat wil zeggen de hoofdpagina in de hoofdmap van de map. Wij gebruiken protocolversie 1.1.
User-agent: Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 versie/12.14— We stellen ons voor aan de server, wij zijn de Opera-browser.
Host: ya.ru — Domeinnaam van de aangevraagde bron.
Accepteren: tekst/html, applicatie/xml;q=0.9, applicatie/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1— Lijst met aanvaardbare bronformaten.
Accept-taal: ru-RU,ru;q=0.9,en;q=0.8— Lijst met ondersteunde talen.
Accept-codering: gzip, leeglopen— Ondersteunde coderingsmethoden.
Cookie: yandexuid=ХХХХХ - Cookies, indien nodig.
Verbinding: Keep-Alive - Verbreek de verbinding niet en blijf in contact.
Antwoord
HTTP/1.1 200 Ok - We ontvangen een antwoord met code 200, wat betekent dat alles in orde is.
Server: nginx - De server heeft zichzelf voorgesteld - dit is nginx.
Datum: zondag 10 maart 2013 14:10:50 GMT— Huidige datum en tijd op de server.
Inhoudstype: tekst/html; tekenset=UTF-8— Inhoudstype en codering.
Verbinding: close - De server wil geen permanente verbinding met ons onderhouden, dus sluit deze onmiddellijk. Voor het volgende verzoek wordt er een nieuwe verbinding tot stand gebracht.
Cache-Control: geen cache, geen winkel, max-leeftijd=0, moet opnieuw valideren- Cachingbeheer. In dit geval is het uitgeschakeld.
Verloopt: zo, 10 maart 2013 14:10:50 GMT— Datum van verwachte afloop van de sessie. In ons geval valt dit samen met de openingstijd, aangezien de server deze onmiddellijk na verwerking onmiddellijk sloot.
Laatst gewijzigd: zo, 10 maart 2013 14:10:50 GMT— Tijdstip van de laatste wijziging.
Inhoudscodering: gzip - Methode voor het coderen van informatie.
Een volledige lijst met alle parameters die in de HTTP-verzoekheader te vinden zijn, is te vinden op Wikipedia.
Nu heeft u een globaal idee van hoe uw browser en webserver met elkaar communiceren. Dit is erg handig om te weten en te begrijpen, omdat we zullen proberen browseracties te emuleren met behulp van de libcurl-bibliotheek. Laten we verder gaan.

Voorbeeld van werken met de bibliotheek

Ik geloof dat nadat enkele algemene punten al duidelijk zijn en alles duidelijk lijkt te zijn, het tijd is om verder te gaan met oefenen en je vaardigheden aan te scherpen aan de hand van voorbeelden. Persoonlijk jeuken mijn handen altijd om alles in de praktijk te proberen :)

Omdat cURL zo goed is voor parsers, gaan we eens kijken naar de functie van het ophalen van de paginacode op basis van het adres. In dit geval zal de uitvoer een array zijn met de titel, pagina-inhoud en zelfs foutcodes als er iets misgaat.

Functie get_web_page($url) ( $uagent = "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 versie/12.14"; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // retourneert de webpagina curl_setopt($ch, CURLOPT_HEADER, 0); // retourneert geen headers curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // gaat door omleidingen curl_setopt($ch, CURLOPT_ENCODING, ""); curl_setopt($ch, CURLOPT_USERAGENT, $uagent); // useragent curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120); // verbindingstime-out curl_setopt($ch, CURLOPT_TIMEOUT, 120); 10); // stop na de 10e omleiding $content = curl_exec($ch); $err = curl_errno($ch); fout; $header["errmsg"] = $errmsg; $header["inhoud"] = $inhoud;

Invoerparameters:
url — pagina- of siteadres.
Uitvoerparameterwaarden (array met drie elementen):
header['errno'] - als er iets mis is gegaan, wordt hier een foutcode weergegeven.
header[‘errmsg’] – de fouttekst zal hier verschijnen.
header['content'] - de daadwerkelijke pagina\bestand\afbeelding, etc.

We gebruiken de functie bijvoorbeeld als volgt:

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

Alles zou zonder fouten moeten verlopen en u ontvangt de paginacode in de variabele $page. Als we proberen de niet-bestaande pagina yaaaaaaaaaaaa.ru te krijgen, krijgen we de foutmelding:

Kan host: yaaaaaaaaaaaa.ru niet oplossen; Host niet gevonden

Alles wordt correct en mooi verwerkt :)
Vervolgens kunt u doen wat u wilt met de paginacode, bijvoorbeeld door deze te parseren met reguliere expressies. Maar dat komt allemaal in de volgende lessen aan de orde, maar laten we het hier voorlopig bij houden.

JavaScript is geblokkeerd in uw browser. Schakel JavaScript in om de site te laten functioneren!

Krul

PHP ondersteunt libcurl, een bibliotheek gemaakt door Daniel Stenberg die het mogelijk maakt om verbinding te maken met verschillende soorten servers en verschillende protocollen te gebruiken.
libcurl ondersteunt momenteel http-, https-, ftp-, gopher-, telnet-, dict-, file- en ldap-protocollen.
libcurl ondersteunt ook HTTPS-certificaten, HTTP POST, HTTP PUT, FTP-upload (dit kan ook worden gedaan met de ftp PHP-extensie), op HTTP-formulieren gebaseerde upload, proxy's, cookies en gebruikers- en wachtwoordauthenticatie.

Deze functies zijn geïntroduceerd in PHP 4.0.2.

curl_init

curl_init - initialiseert een CURL-sessie.

Beschrijving

bron curl_init()

Functie curl_init() initialiseert een nieuwe sessie en retourneert een CURL-handle voor gebruik in de functies , en. Als de optionele parameter URL is opgegeven, ontvangt de optie CURLOPT_URL de waarde van deze parameter. U kunt het handmatig installeren met behulp van de .

curl_setopt

curl_setopt - stelt opties in voor CURL-overdracht/overdracht.

Beschrijving

bool curl_setopt(bronch, tekenreeksoptie, gemengde waarde)

Functie curl_setopt() stelt opties in voor de CURL-sessie geïdentificeerd door de parameter ch. Parameter optie is de optie die u wilt instellen, en waarde dit is de optiewaarde optie .

Parameter waarde moet lang zijn voor de volgende opties (gespecificeerd door parameter optie):

  • CURLOPT_INFILESIZE: Als u een bestand uploadt naar een externe site, moet deze optie worden gebruikt om PHP te vertellen wat de verwachte bestandsgrootte zal zijn.
  • CURLOPT_VERBOSE: Stel deze optie in op een waarde die niet nul is als u wilt dat CURL alle acties rapporteert.
  • CURLOPT_HEADER: Stel deze optie in op een waarde die niet nul is als u wilt dat de header in de uitvoer wordt opgenomen.
  • CURLOPT_NOPROGRESS: Stel deze optie in op een waarde die niet nul is als u niet wilt dat PHP een CURL-overdrachtsvoortgangsindicator weergeeft. (PHP stelt deze optie automatisch in op een waarde die niet nul is; u hoeft deze alleen te wijzigen tijdens het debuggen.)
  • CURLOPT_NIEMAND: Stel deze optie in op een waarde die niet nul is als u niet wilt dat de hoofdtekst in de uitvoer wordt opgenomen.
  • CURLOPT_FAILONERROR: Stel deze optie in op een waarde die niet nul is als u wilt dat PHP stilletjes afsluit als de geretourneerde HTTP-code groter is dan 300. Standaard wordt de pagina normaal geretourneerd en wordt de code genegeerd.
  • CURLOPT_UPLOAD: Stel deze optie in op een waarde die niet nul is als u wilt dat PHP het bestand gereedmaakt voor upload.
  • CURLOPT_POST: Stel deze optie in op een waarde die niet nul is als u wilt dat PHP reguliere HTTP POST uitvoert. Dit POST heeft de normale vorm application/x-www-form-urlencoded , het meest gebruikt door HTML-formulieren.
  • CURLOPT_FTPLISTONLY: Stel deze optie in op een waarde die niet nul is, en PHP zal de namen van de FTP-directory's weergeven.
  • CURLOPT_FTPAPPEND: Stel deze optie in op een waarde die niet nul is, en PHP zal aan het externe bestand toevoegen in plaats van het te overschrijven.
  • CURLOPT_NETRC: Stel deze optie in op een waarde die niet nul is en PHP scant uw ~./netrc-bestand om uw gebruikersnaam en wachtwoord te vinden voor de externe site waarmee u verbinding maakt.
  • CURLOPT_FOLLOWLOCATION: Stel deze optie in op een waarde anders dan nul om elke "Location: " header te volgen die de server verzendt als onderdeel van een HTTP-header (merk op dat dit recursie is, PHP zal alle "Location: " -headers" volgen die worden verzonden. )
  • CURLOPT_PUT: Stel deze optie in op een waarde die niet nul is, zodat HTTP het bestand PUT. Het bestand voor PUT moet worden ingesteld met CURLOPT_INFILE en CURLOPT_INFILESIZE.
  • CURLOPT_MUTE: Stel deze optie in op een waarde die niet nul is, en PHP zal verborgen werken met betrekking tot CURL-functies.
  • CURLOPT_TIMEOUT: Geef een lengte door als een parameter die de maximale tijd in seconden bevat waarin u CURL-functies mag uitvoeren.
  • CURLOPT_CONNECTTIMEOUT: Geef een lengte door als een parameter die de maximale tijd in seconden bevat die u mag wachten bij een poging om verbinding te maken. Gebruik 0 om eeuwig te wachten.
  • CURLOPT_LOW_SPEED_LIMIT: Geef een lengte door als een parameter die de overdrachtsnelheid bevat, in bytes per seconde, waaronder de overdracht moet plaatsvinden tijdens uitvoering CURLOPT_LOW_SPEED_TIME, in seconden, voordat PHP deze als te traag beschouwt en afbreekt.
  • CURLOPT_LOW_SPEED_TIME: Geef een lengte door als een parameter die de tijd in seconden bevat waaronder de overdracht moet worden uitgevoerd terwijl CURLOPT_LOW_SPEED_LIMIT wordt uitgevoerd, zodat PHP het als te traag beschouwt en afbreekt.
  • CURLOPT_RESUME_FROM: Lang doorgeven als een parameter die de byte-offset bevat waarop de overdracht moet beginnen.
  • CURLOPT_SSLVERSIE: Geef een lengte door als een parameter die de SSL-versie bevat die moet worden gebruikt (2 of 3). Standaard probeert PHP dit zelf te bepalen, alhoewel je in sommige gevallen verplicht bent dit handmatig in te stellen.
  • CURLOPT_SSL_VERIFYHOST: Lang doorgeven als CURL de algemene naam van het peercertificaat in een SSL-handshake moet controleren. Een waarde van 1 geeft aan dat we moeten controleren op het bestaan ​​van een gemeenschappelijke/algemene naam, een waarde van 2 geeft aan dat we ervoor moeten zorgen dat deze overeenkomt met de opgegeven hostnaam.
  • CURLOPT_TIMECONDITION: Lang doorgeven als parameter die bepaalt hoe CURLOPT_TIMEVALUE wordt behandeld. U kunt deze parameter instellen op TIMECOND_IFMODSINCE of TIMECOND_ISUNMODSINCE. Dit werkt alleen voor HTTP.
  • CURLOPT_TIMEVALUE: Geef een lengte door als parameter, wat de tijd in seconden is sinds 1 januari 1970. Deze tijd wordt gebruikt zoals gespecificeerd door de optie CURLOPT_TIMEVALUE, anders wordt de standaard TIMECOND_IFMODSINCE gebruikt.
  • CURLOPT_RETURNTRANSFER: Geef een waarde anders dan nul door als u wilt dat CURL de ontvangen informatie rechtstreeks retourneert in plaats van deze rechtstreeks af te drukken.

Parameter waarde moet een tekenreeks zijn voor de volgende parameterwaarden optie :

De volgende opties verwachten een bestandsdescriptor, die wordt verkregen met behulp van de functie fopen() :

  • CURLOPT_FILE: Het bestand waarin de uitvoer van uw overdracht moet worden geplaatst, standaard is dit STDOUT.
  • CURLOPT_INFILE: Het bestand waaruit uw overdrachtinvoer afkomstig is.
  • CURLOPT_WRITEHEADER: Bestand voor het opnemen van het headergedeelte van de uitvoer.
  • CURLOPT_STDERR: Bestand om fouten vast te leggen, in plaats van stderr.

Parameter waarde long write_callback (bronch, stringgegevens)( ... return strlen($data);) optie :

  • CURLOPT_WRITEFUNCTION: .
  • CURLOPT_HEADERFUNCTION: .

Parameter waarde moet een functie van de volgende vorm zijn string read_callback (bron ch, bron fd, lange lengte)() voor de volgende parameterwaarden optie :

  • CURLOPT_READFUNCTION: .

curl_exec

curl_exec - voert een CURL-sessie uit.

Beschrijving

bool curl_exec(bron ch)

Deze functie moet worden aangeroepen nadat u een CURL-sessie heeft geïnitialiseerd en alle opties voor die sessie al zijn ingesteld. Het doel ervan is eenvoudigweg het uitvoeren van een vooraf gedefinieerde CURL-sessie (gespecificeerd in de parameter ch).

krul_close

curl_close - sluit de CURL-sessie.

Beschrijving

leegte krul_close(bron ch)

Deze functie sluit de CURL-sessie en geeft alle bronnen vrij. CURL-handvat ch wordt ook verwijderd.

curl_errno

curl_errno - retourneert een geheel getal dat het laatste foutnummer bevat.

Beschrijving

Voorbeeld 1: Een nieuwe CURL-sessie initialiseren en een webpagina ophalen.
Voorbeeld 2: PHP's CURL-module gebruiken om example.com te krijgen
Voorbeeld 3: URL-toegankelijkheid controleren met behulp van PHP's CURL
Voorbeeld 4: Het scheiden van de header van de body verkregen met behulp van PHP's CURL
Voorbeeld 5: Een verwijzings-URL bepalen met behulp van PHP's CURL
het probleem: curl_setopt($ch,FOLLOW_LOCATION,1); de fout: problemen met open_basedir en safe_mode de oplossing: een functie die al door iemand is ontwikkeld de oplossing n 2: dezelfde functie, aangepast, werkt prima voor mij..= $curl_max_loops) ( $curl_loops = 0; retourneert FALSE; ) curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, waar);
$data = curl_exec($ch);
Soms kun je CURLOPT_COOKIEJAR en CURLOPT_COOKIEFILE niet gebruiken vanwege de php-instellingen van de server (ze zeggen dat je met deze opties alle bestanden van de server kunt ophalen). Hier is de oplossing 1) Gebruik CURLOPT_FOLLOWLOCATION niet 2) Gebruik curl_setopt($ch, CURLOPT_HEADER, 1) 3) Haal cookies als volgt uit de header: preg_match_all("|Set-Cookie: (.*);|U", $content, $results); $cookies = implode(";", $results); 4)Stel ze in met curl_setopt($ch, CURLOPT_COOKIE, $cookies);
Voorbeeld 7: Een cookie uit de header parseren met CURL PHP
Zoals Yevgen eerder zei, kunnen we CURLOPT_COOKIEJAR en CURLOPT_COOKIEFILE soms niet gebruiken. Hieronder staat een header callback-functie die ik in januari schreef en waarmee je cookies tussen cURL-verzoeken kunt bewaren. Cookies worden toegevoegd aan $ch tijdens alle verzoeken, zelfs tijdens het omleiden, dus je kunt gebruik het samen met CURLOPT_FOLLOWLOCATION Hier is de code: function read_header($ch, $string) ( global $location; #keep track of location/redirects global $cookiearr; #store cookies here global $ch; # ^overschrijft de functieparameter. $ch # dit is oké omdat we de globale $ch # moeten bijwerken met # nieuwe cookies $length = strlen($string); if(!strncmp($string, "Location:", 9)) ( #keep track of laatste omleiding $location = trim(substr($string, 9, -1)); string, 11, -1)); $cookie = explode(";", $cookiestr); $cookie = explode("=", $cookiename = trim(array_shift($cookie)); [$cookiename] = trim( implode("=", $cookie));
) $cookie = "";
Met behulp van cURL moest ik een script van derden aanroepen dat binaire gegevens als bijlage retourneerde om de opgehaalde gegevens opnieuw als bijlage door te geven. Het probleem was dat het script van derden af ​​en toe HTTP-fouten retourneerde en ik wilde in dergelijke gevallen voorkomen dat bijlagen met een lengte van nul worden doorgegeven. De combinatie van het gebruik van CURLOPT_FAILONERROR en CURLOPT_HEADERFUNCTION callback hielp om de HTTP-fouten van scripts van derden netjes te verwerken: function curlHeaderCallback($resURL, $strHeader) ( if (preg_match("/^HTTP/i", $strHeader)) ( header($strHeader) ); header("Content-Disposition: bijlage; bestandsnaam = "bestandsnaam.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 "Fout met code: " . $intReturnCode; )
Voorbeeld 9. Een pagina opslaan in een bestand en de overdrachtssnelheid berekenen met 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);
"; echo "Gemiddelde downloadsnelheid == " . $sAverageSpeedDownload . " 
"; echo "Gemiddelde uploadsnelheid == " . $sAverageSpeedUpload ."
"; echo"
"; $aCURLinfo = curl_getInfo($sh); print_r($aCURLinfo); echo "
"; curl_close($sh); FSluit ($hFile); echo "( Zie het bestand "".$sTxtfile."" in hetzelfde pad van de hosting." " waar dit script PHP).
"; }
Voorbeeld 9. Een pagina ontvangen via een SSL-verbinding (https)
$ch=curl_init("https://site"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Schakel de foutmelding "SSL-certificaatprobleem, controleer of het CA-certificaat in orde is" uit curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // Schakel de fout "SSL: certificaatonderwerpnaam "hostname.ru" uit en komt niet overeen met de doelhostnaam "123.123"" curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); $out=curl_exec($ch);
Voorbeeld 10: Sessies en cookies gebruiken 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);//bewaar ontvangen COOKIE's in een bestand curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_filename); //stuur de COOKIE's die ervan zijn ontvangen tijdens autorisatie naar de server $out=curl_exec($curl);
Voorbeeld 11: Bestandsupload en multidimensionale array in Curl. CURLOPT_POSTFIELDS + CurlFile

Als u een multidimensionale array en een bestand in een POST-verzoek moet verzenden, zult u een onoplosbaar probleem tegenkomen.

Als u een multidimensionale array doorgeeft aan CURLOPT_POSTFIELDS, wordt het tweede niveau doorgegeven als de string "Array".

Als u converteert met http_build_query, kunt u het bestand niet overbrengen.

cURL is een tool waarmee u kunt communiceren met verschillende servers en die vele protocollen ondersteunt: HTTP, FTP, TELNET, enz. cURL is oorspronkelijk een opdrachtregelhulpprogramma. Maar gelukkig voor ons ondersteunt PHP het werken met de cURL-bibliotheek. In dit artikel zullen we kijken naar niet-triviale voorbeelden van het werken met cURL.

Waarom krul?

Sterker nog, er zijn nog veel meer manieren om een ​​verzoek naar een andere server te sturen om bijvoorbeeld de inhoud van een pagina op te halen. Veel mensen gebruiken, meestal uit luiheid, eenvoudige PHP-functies in plaats van cURL:

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

Ze maken echter geen efficiënte foutafhandeling mogelijk. Er zijn ook een aantal taken die ze helemaal niet kunnen uitvoeren, bijvoorbeeld werken met cookies, autoriseren, postverzoeken, bestanden downloaden.

cUrl is een krachtige tool die meerdere protocollen ondersteunt en volledige aanvraaginformatie biedt.

krul-basisprincipes

Voordat we verder gaan met complexe voorbeelden, kijken we eerst naar de basisstructuur van een cURL-verzoek in PHP. Om een ​​cURL-verzoek in PHP uit te voeren, moet je 4 hoofdstappen volgen:

  1. Initialisatie.
  2. Opties instellen.
  3. Het uitvoeren van het verzoek.
  4. Reinigingsmiddelen.
// 1. initialisatie $ch = curl_init(); // 2. opties instellen, waaronder URL curl_setopt($ch, CURLOPT_URL, "http://www.google.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); // 3. het verzoek uitvoeren en het antwoord ontvangen $output = curl_exec($ch); // 4. bronnen opschonen curl_close($ch);

We zullen vooral naar stap #2 in dit artikel kijken, omdat daar de magie gebeurt. De lijst met cURL-opties is erg groot, dus we zullen vandaag niet alle opties overwegen, maar die gebruiken die nuttig zijn voor het oplossen van specifieke problemen.

Bug-tracking

Indien nodig kunt u de volgende regels toevoegen om fouten op te sporen:

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

Houd er rekening mee dat we “===” gebruiken in plaats van “==” omdat Er moet onderscheid worden gemaakt tussen een leeg serverantwoord en de Booleaanse waarde FALSE, die wordt geretourneerd in geval van een fout.

Informatie verkrijgen over een verzoek

Een andere optionele stap is het verkrijgen van informatie over het cURL-verzoek nadat het is uitgevoerd.

// ... curl_exec($ch); $info = curl_getinfo($ch); echo 'Neem'. $info["totale_tijd"] . "seconden voor URL". $info["url"]; // ...

Als resultaat ontvangt u een array met de volgende informatie:

  • "url"
  • "inhoud_type"
  • "http_code"
  • "header_grootte"
  • "request_size"
  • "bestandstijd"
  • "ssl_verify_result"
  • "redirect_count"
  • "totale_tijd"
  • "naamzoektijd"
  • "connect_time"
  • "pretransfer_time"
  • "grootte_upload"
  • "grootte_download"
  • "snelheid_download"
  • "snelheid_upload"
  • "download_content_lengte"
  • "upload_inhoud_lengte"
  • "startoverdracht_tijd"
  • "omleidingstijd"

Omleiding volgen, afhankelijk van de browser

In dit voorbeeld schrijven we een script dat omleidingen detecteert op basis van verschillende browserinstellingen. Sommige sites leiden bezoekers van mobiele apparaten bijvoorbeeld door naar bezoekers uit andere landen.

We gebruiken de CURLOPT_HTTPHEADER-optie om onze eigen headers in te stellen, inclusief User-Agent en Taal, en om te zien waar sites ons omleiden.

// URL's $urls = array("http://www.cnn.com", "http://www.mozilla.com", "http://www.facebook.com"); // browsers $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)", "taal" => "en-us,en;q=0.5"), "iphone" => array ("user_agent" => "Mozilla/5.0 (iPhone; U; CPU zoals Mac OS X; en) AppleWebKit/420+ (KHTML, zoals Gecko) Versie/3.0 Mobile/1A537a Safari/419.3", "taal" => "en"), "french" => array ("user_agent" = > "Mozilla/4.0 (compatibel; MSIE 7.0; Windows NT 5.1; GTB6; .NET CLR 2.0.50727)", "taal" => "fr,fr-FR;q=0.5")); foreach ($urls als $url) ( echo "URL: $url\n"; foreach ($browsers als $test_name => $browser) ( $ch = curl_init(); // stel het adres in curl_setopt($ch, CURLOPT_URL , $url); // specificeer de gebruikte browser en taal curl_setopt($ch, CURLOPT_HTTPHEADER, array("User-Agent: ($browser["user_agent"])", "Accept-Language: ($browser["taal" ]) ")); // we hebben de inhoud van de pagina niet nodig curl_setopt($ch, CURLOPT_NOBODY, 1); // we hebben alleen headers nodig curl_setopt($ch, CURLOPT_HEADER, 1); // retourneer in plaats daarvan het resultaat van de uitvoer curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1); $output = curl_exec($ch); // definieer omleidingen in HTTP-headers? , $output, $matches) ( echo "$test_name: verwijst door naar $matches\n"; ) else ( echo "$test_name: geen omleiding\n"; ) ) echo "\n\n";

In een lus controleren we browsers voor elke URL. Eerst stellen we de opties voor ons verzoek in: URL en browser en te testen taal.

Omdat We hebben een speciale optie ingesteld; het resultaat van het verzoek bevat alleen HTTP-headers. Met behulp van een eenvoudige reguliere expressie kunnen we controleren of het antwoord de string "Locatie:" bevat.

Resultaat van scriptuitvoering:

URL: http://www.cnn.com standaard: verwijst door naar http://edition.cnn.com/ iphone: verwijst door naar http://edition.cnn.com/ Frans: verwijst door naar http://edition.cnn .com/ URL: http://www.mozilla.com standaard: verwijst door naar https://www.mozilla.org/firefox/ iphone: verwijst door naar https://www.mozilla.org/firefox/ frans: verwijst door naar https://www.mozilla.org/firefox/ URL: http://www.facebook.com standaard: verwijst door naar https://www.facebook.com/ iphone: verwijst door naar http://m.facebook.com /?refsrc=http%3A%2F%2Fwww.facebook.com%2F&_rdr Frans: geen omleiding

POST-verzoeken verzenden

Bij het uitvoeren van GET-verzoeken kunnen gegevens worden doorgegeven in de queryreeks. Wanneer u bijvoorbeeld op Google zoekt, wordt uw zoekopdracht vertaald in een URL:

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

Om het resultaat van deze zoekopdracht te krijgen, heb je niet eens cURL nodig, je kunt lui zijn en "file_get_contents()" gebruiken.

Maar sommige HTML-formulieren gebruiken de POST-methode. In dit geval worden de gegevens verzonden in de hoofdtekst van het verzoekbericht in plaats van in de URL zelf.

Laten we een script schrijven dat POST-verzoeken verzendt. Laten we eerst een eenvoudig PHP-bestand maken dat deze verzoeken accepteert en de verzonden gegevens terugstuurt. Laten we het post_output.php noemen:

$url = "http://localhost/post_output.php"; $post_data = array ("foo" => "bar", "query" => "FooBar", "action" => "Verzenden"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // maak een POST-verzoek curl_setopt($ch, CURLOPT_POST, 1); // gegevens toevoegen curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $output = curl_exec($ch); curl_close($ch); echo $uitvoer;

Dit script levert het volgende op:

Array ( => bar => FooBar => Verzenden)

Dit script stuurde een POST-verzoek naar het post_output.php-bestand. die de inhoud van de $_POST-array uitvoerde en we ontvingen dit antwoord met behulp van cURL.

Bestanden uploaden

Laten we, net als in het vorige voorbeeld, een bestand maken dat verzoeken accepteert, upload_output.php :

Print_r($_FILES);

En het script zelf dat de bestanden downloadt:

$url = "http://localhost/upload_output.php"; $post_data = array ("foo" => "bar", // bestand om te uploaden "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 $uitvoer;

Als u een bestand wilt uploaden, hoeft u alleen maar het pad ernaartoe door te geven, net als bij een normale POST-verzoekparameter, voorafgegaan door "@". Het resultaat van het script:

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

Multi krul

Een van de geavanceerde kenmerken van cURL in PHP is de mogelijkheid om meerdere verzoeken tegelijkertijd en asynchroon uit te voeren.

Onder normale omstandigheden stopt het script en wacht tot het verzoek is voltooid. En als u veel query's moet uitvoeren, kan dit veel tijd kosten, omdat... je voert opeenvolgend uit. Deze beperking kan worden omzeild:

// maak handlers $ch1 = curl_init(); $ch2 = curl_init(); // stel opties in 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); //maak de meerdere cURL-handle $mh = curl_multi_init(); // handlers toevoegen curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $lopend = nul; // verzoeken uitvoeren doen ( curl_multi_exec($mh, $running); ) while ($running > 0); // maak bronnen vrij curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh);

Het idee is dat u meerdere cURL-handles kunt maken, deze onder één multi-handle kunt combineren en deze asynchroon kunt uitvoeren.

Ten eerste is alles hetzelfde als bij een regulier cURL-verzoek: er wordt een descriptor gemaakt ( curl_init() ), parameters zijn ingesteld ( curl_setopt() ). Vervolgens wordt een multi-descriptor gemaakt ( curl_multi_init() ) en de eerder gemaakte reguliere descriptors worden toegevoegd ( curl_multi_add_handle() ). In plaats van curl_exec() normaal aan te roepen, zullen we bellen curl_multi_exec() deze functie informeert ons over het aantal actieve verbindingen met behulp van de tweede parameter - $running. Daarom loopt de lus totdat $running gelijk wordt aan 0. En natuurlijk is het na het voltooien van het werk noodzakelijk om bronnen vrij te geven.

In dit voorbeeld voeren we eenvoudigweg het resultaat van de zoekopdrachten uit naar STDOUT. Laten we eens kijken naar een niet-triviaal geval van het gebruik van multi-cURL.

Externe links controleren in WordPress

Stel je een blog voor met veel berichten met links naar externe sites. Sommige van deze links werken mogelijk niet.

Laten we een script schrijven dat alle verbroken links zal vinden en deze aan ons zal laten zien.

Eerst moeten we alle externe links uit de database halen:

// CONFIG $db_host = "localhost"; $db_user = "root"; $db_pass = ""; $db_name = "wordpress"; $excluded_domains = array("localhost", "site"); $max_verbindingen = 10; $url_lijst = array(); $working_urls = array(); $dead_urls = array(); $not_found_urls = array(); $actief = nul; // maak verbinding met MySQL if (!mysql_connect($db_host, $db_user, $db_pass)) ( die("Kon geen verbinding maken: " . mysql_error()); ) if (!mysql_select_db($db_name)) ( die("Kan not select db: " . mysql_error()); ) // neem alle berichten met links in de tekst $q = "SELECT post_content FROM wp_posts WAAR post_content LIKE "%href=%" AND post_status = "publish" AND post_type = "post " "; $r = mysql_query($q) of die(mysql_error()); while ($d = mysql_fetch_assoc($r)) ( // verzamel alle links met behulp van reguliere expressie if (preg_match_all("/href=\"(.*?)\"/", $d["post_content"], $matches )) ( foreach ($komt overeen met $url) ( // filter onnodige domeinen eruit $tmp = parse_url($url); if (isset($tmp["host"]) && in_array($tmp["host"], $ uitgesloten_domeinen)) ( ga verder; ) // stel $url_list = $url samen ) ) ) // verwijder herhalingen $url_list = array_values(array_unique($url_list)); if (!$url_list) ( die("Geen URL om te controleren"); )

In dit deel van het script halen we eenvoudigweg alle externe links uit de database. Laten we ze controleren:

$mh = curl_multi_init(); // 1. voeg links toe voor ($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 "==Dode URL's==\n"; echo implode("\n", $dead_urls) . "\n\n"; echo "==404 URL's==\n"; echo implode("\n", $not_found_urls) . "\n\n"; echo "==Werkende URL's==\n"; echo implode("\n", $working_urls); echo "\n\n"; // 9. voegt een handle toe met de gegeven URL-functie add_url_to_multi_handle($mh, $url_list) ( static $index = 0; // if er nog links zijn if (isset($url_list[$index])) ( // alles is zoals gebruikelijk $ ch = curl_init(); // stel opties in curl_setopt($ch, CURLOPT_URL, $url_list[$index] // return in plaats van het resultaat weergeven curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); redirects curl_setopt($) ch, CURLOPT_FOLLOWLOCATION, 1); // haal alleen de headers op om tijd te besparen curl_setopt($ch, CURLOPT_NOBODY, 1); // voeg toe aan de multi-handle curl_multi_add_handle($mh, $ch);

Laten we de code in meer detail bekijken (de nummering komt overeen met de opmerkingen in de code):

  1. We voegen een initieel aantal descriptors toe om het systeem niet te overbelasten met threads. Het aantal wordt bepaald door de variabele $max_connections.
  2. De variabele $curRunning slaat het aantal lopende threads op, $running slaat de vorige waarde op, waarna een van de threads zijn werk heeft voltooid.
  3. Wij ontvangen informatie over de voltooide aanvraag.
  4. Als er geen reactie van de server komt, werkt de link niet.
  5. Het serverantwoord is 404.
  6. Anders werkt de link.
  7. Het verzoek is voltooid, we geven middelen vrij.
  8. Laten we een nieuwe URL toevoegen aan de multi-descriptor.
  9. Functie add_url_to_multi_handle() voegt een nieuwe handle met de opgegeven URL toe aan de multi-descriptor.

Laten we het script uitvoeren:

Dode URL's== xample1234.com/ ==404 URL's== www.google.com/dsfasdfafd ==Werkende URL's== 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

De controle duurde ongeveer 2 seconden. Door 10 threads tegelijkertijd uit te voeren, worden de prestaties 10 keer hoger dan bij reguliere cURL-verzoeken. Gebruik de functie om de inhoud van het serverantwoord op te halen curl_multi_getcontent($ch) , waarbij $ch een descriptor is die is verkregen curl_multi_info_read() .

Andere cURL-functies in PHP

HTTP-authenticatie

Als het HTTP-verzoek authenticatie vereist, gebruik dan de volgende code:

$url = "http://www.somesite.com/members/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // stuur gebruikersnaam en wachtwoord curl_setopt($ch, CURLOPT_USERPWD, "mijngebruikersnaam:mijnwachtwoord"); // of omleidingen zijn toegestaan ​​curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // cURL zal het wachtwoord verzenden na omleidingen curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); $output = curl_exec($ch); curl_close($ch);

Uploaden via FTP

PHP heeft een eigen bibliotheek om met FTP te werken, maar je kunt ook cURL gebruiken:

// lees het bestand $file = fopen("/pad/naar/bestand", "r"); // url bevat al de benodigde gegevens $url = "ftp://gebruikersnaam: [e-mailadres beveiligd]:21/pad/naar/nieuw/bestand"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // opties curl_setopt($ch, CURLOPT_UPLOAD, 1); curl_setopt($ch, CURLOPT_INFILE, $fp); curl_setopt($ch, CURLOPT_INFILESIZE, bestandsgrootte("/pad/naar/bestand")); ch);

Een proxy gebruiken

Verzoeken kunnen worden gedaan via een specifieke proxy:

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://www.example.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // proxy-adres curl_setopt($ch, CURLOPT_PROXY, "11.11.11.11:8080"); // als autorisatie vereist is curl_setopt($ch, CURLOPT_PROXYUSERPWD,"user:pass"); $output = curl_exec($ch); curl_close($ch);

Terugbelfuncties

Het is mogelijk om callbacks te gebruiken terwijl het verzoek loopt, zonder te wachten tot het verzoek is voltooid. Terwijl het serverantwoord wordt gedownload, kunnen we bijvoorbeeld de reeds ontvangen gegevens gebruiken zonder te wachten op de volledige download.

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

De callback-functie moet de lengte van de string retourneren om het verzoek correct te laten werken.

Elke keer dat het volgende deel van het serverantwoord wordt ontvangen, wordt er teruggebeld.

Conclusie

In dit artikel hebben we gekeken naar de geavanceerde functies van cURL in PHP. De volgende keer dat u URL-verzoeken moet doen, gebruikt u cURL.

Waar is cURL voor?

  • cURL is geweldig voor het simuleren van gebruikersacties in een browser.

Echt praktisch voorbeeld: u moet uw router (modem) opnieuw opstarten om het IP-adres te wijzigen. Om dit te doen, moet u: inloggen op de router, naar de onderhoudspagina gaan en op de knop "Opnieuw opstarten" klikken. Als deze actie meerdere keren moet worden uitgevoerd, moet de procedure worden herhaald. Mee eens, je wilt deze routine niet elke keer handmatig doen. Met cURL kunt u dit allemaal automatiseren. Met slechts een paar cURL-opdrachten kunt u autorisatie verkrijgen en de taak op de router voltooien.

  • cURL is handig voor het ophalen van gegevens van websites via de opdrachtregel.

Nog een praktisch voorbeeld: we willen voor meerdere sites de weergave van algemene statistieken implementeren. Als we cURL gebruiken, wordt dit een volkomen triviale taak: met behulp van cURL authenticeren we ons op de dienst voor het verzamelen van statistieken (indien nodig), en vervolgens (opnieuw met behulp van cURL-opdrachten) verkrijgen we de benodigde pagina's en parseren we de gegevens die we nodig hebben; de procedure wordt herhaald voor al onze sites, daarna voegen we het eindresultaat toe en geven het weer.

Die. gevallen van het gebruik van cURL zijn vrij reëel, hoewel cURL in de meerderheid nodig is voor programmeurs die het voor hun programma's gebruiken.

cURL ondersteunt vele protocollen en autorisatiemethoden, kan bestanden overbrengen, werkt correct met cookies, ondersteunt SSL-certificaten, proxy's en nog veel meer.

cURL in PHP en opdrachtregel

We kunnen cURL op twee manieren gebruiken: in PHP-scripts en op de opdrachtregel.

Om cURL in PHP op de server in te schakelen, moet u de commentaarregel in het php.ini-bestand verwijderen

Extensie=php_curl.dll

En start vervolgens de server opnieuw op.

Op Linux moet je het curl-pakket installeren.

Op Debian, Ubuntu of Linux Mint:

$ sudo apt-get install curl

Op Fedora, CentOS of RHEL:

$ sudo yum installeer krul

Om het verschil in gebruik in PHP en op de opdrachtregel duidelijk te zien, zullen we dezelfde taken tweemaal uitvoeren: eerst in het PHP-script en daarna op de opdrachtregel. Laten we proberen niet in verwarring te raken.

Gegevens ophalen met cURL

Gegevens ophalen met behulp van cURL in PHP

Voorbeeld in PHP:

Het is heel eenvoudig:

$target_url— het adres van de site die ons interesseert. Na het siteadres kunt u een dubbele punt plaatsen en het poortadres toevoegen (als de poort afwijkt van de standaardpoort).

curl_init— initialiseert een nieuwe sessie en retourneert een descriptor, die in ons voorbeeld aan een variabele is toegewezen $ch.

Vervolgens voeren we het verzoek uit met de cURL-functie curl_exec, waaraan een descriptor als parameter wordt doorgegeven.

Alles is heel logisch, maar wanneer dit script wordt uitgevoerd, wordt de inhoud van de site op onze pagina weergegeven. Maar wat als we de inhoud niet willen weergeven, maar naar een variabele willen schrijven (voor daaropvolgende verwerking of parsering).

Laten we een beetje toevoegen aan ons script:

0) ( echo "Curl-fout: " . curl_error($ch); ) curl_close($ch); ?>

We hebben een lijn curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);.

curl_setopt- stelt opties in. Een volledige lijst met opties is te vinden op deze pagina: http://php.net/manual/en/function.curl-setopt.php

$response_data = curl_exec($ch);

Nu wordt de scriptwaarde toegewezen aan de variabele $response_data, waarmee verdere bewerkingen kunnen worden uitgevoerd. U kunt bijvoorbeeld de inhoud ervan weergeven.

If (curl_errno($ch) > 0) ( echo "Curl-fout: " . curl_error($ch); )

dienen voor het debuggen in het geval er fouten optreden.

Gegevens ophalen met cURL op de opdrachtregel

Typ gewoon op de opdrachtregel

Krul mi-al.ru

waar in plaats van mi-al.ru- uw websiteadres.

Als u gegevens naar een variabele wilt kopiëren in plaats van het resultaat op het scherm weer te geven, doet u het volgende:

Temp=`curl mi-al.ru`

Sommige gegevens worden echter nog steeds weergegeven:

Om te voorkomen dat ze worden weergegeven, voegt u de sleutel toe -S:

Temp=`curl -s mi-al.ru`

U kunt zien wat er is opgenomen:

Echo $temp | minder

Basis- en HTTP-authenticatie

Authenticatie is, simpel gezegd, het invoeren van een gebruikersnaam en wachtwoord.

Basisauthenticatie is servergebaseerde authenticatie. Hiervoor worden twee bestanden aangemaakt: .htaccess En .htpasswd

De inhoud van het .htaccess-bestand ziet er ongeveer zo uit

AuthName "Alleen voor geregistreerde gebruikers!" AuthType Basic vereist een geldige gebruiker AuthUserFile /home/freeforum.biz/htdocs/.htpassw

De inhoud van het .htpasswd-bestand ziet er ongeveer zo uit:

Mial:CRdiI.ZrZQRRc

Die. login en wachtwoord-hash.

Wanneer u probeert toegang te krijgen tot een met een wachtwoord beveiligde map, zal de browser zoiets als dit weergeven:

HTTP-authenticatie is het geval wanneer we een login en wachtwoord invoeren in een formulier op de site. Het is deze authenticatie die wordt gebruikt bij het inloggen op e-mail, forums, enz.

Basis cURL-authenticatie (PHP)

Er is een site http://62.113.208.29/Update_FED_DAYS/ waarvoor we moeten inloggen:

Laten we ons eerste script proberen:

0) ( echo "Curl-fout: " . curl_error($ch); ) else ( echo $response_data; ) curl_close($ch); ?>

Hoewel het script gelooft dat er geen fout is, vinden we de uitvoer helemaal niet leuk:

Voeg twee regels toe:

Curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_USERPWD, "ru-board:ru-board");

Op de eerste regel stellen we het authenticatietype in - basic. De tweede regel bevat de naam en het wachtwoord gescheiden door een dubbele punt (in ons geval zijn de naam en het wachtwoord hetzelfde - ru-board). Het bleek zo:

0) ( echo "Curl-fout: " . curl_error($ch); ) else ( echo $response_data; ) curl_close($ch); ?>

Basis cURL-authenticatie (op de opdrachtregel)

Hetzelfde kan worden bereikt op de opdrachtregel met één regel:

Curl -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/

Ik ben niet vergeten het authenticatietype op te geven, alleen is in cURL het basisauthenticatietype de standaard.

Alles verliep zo snel op de opdrachtregel dat ik uit frustratie het volgende programma schreef. Ze maakt verbinding met de site en downloadt de nieuwste update:

Temp=`curl -s -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/ | grep -E -o "Update_FED_201(1).(2).(2).7z" | uniek | staart -n 1`; curl -o $temp -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/$temp

Met slechts een paar extra opdrachten kunt u het volgende toevoegen:

  • het archief uitpakken in de opgegeven map;
  • het lanceren van ConsultantPlus-updates (dit zijn updates daarvoor);
  • u kunt controleren of de nieuwste beschikbare update al is gedownload of dat er een nieuwe is verschenen;
  • voeg het allemaal toe aan Cron voor dagelijkse updates.

HTTP-authenticatie cURL

HTTP cURL-authenticatie in PHP

We moeten weten:

  • adres waar authenticatiegegevens naartoe moeten worden gestuurd
  • verzendmethode GET of POST
  • login
  • wachtwoord

Soms zijn deze gegevens niet voldoende. Laten we het uitzoeken.

Het adres waar u de gegevens naartoe moet sturen kunt u vinden op het authenticatieformulier. Bijvoorbeeld:

We bekijken het pand actie. Die. de laatste pagina is inloggen.php. We hebben het volledige adres nodig, bijvoorbeeld dit http://188.35.8.64:8080/login.php

Hier vinden we ook de verzendmethode: methode = "post"

Ik ken ook de login en het wachtwoord: admin en qwerasdfzxcv

Voor het geval dat dit niet mijn router is (en ik weet niet van wie), dus als je mij wilt irriteren, hoef je niets vies te doen op deze router.

Die. Er wordt vanuit het formulier een string naar de server verzonden met behulp van de POST-methode. Theoretisch zou ons vorige script, waaraan we een nieuwe regel hebben toegevoegd, moeten werken. Die. authenticatie moet plaatsvinden.

0) ( echo "Curl-fout: " . curl_error($ch); ) else ( ) curl_close($ch); ?>

Nieuwe regel in script

curl_setopt($ch, CURLOPT_POSTFIELDS, "LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv");

Hier curl_setopt— een functie die ons al bekend is voor het instellen van opties voor cURL, CURLOPT_POSTFIELDS- dit is de naam van de optie die we instellen. CURLOPT_POSTFIELDS bevat alle gegevens die worden overgedragen met behulp van de POST-methode. Nou ja, de lijn zelf LOGIN_USER=beheerder&LOGIN_PASSWD=qwerasdfzxcv- dit zijn precies de gegevens die we verzenden.

Als u het formulier zorgvuldig bekijkt, ziet u dat er ook verborgen velden in staan. En de gegevens kunnen worden verwerkt of aangevuld met JavaScript. Je kunt dit allemaal bestuderen, maar ik geef de voorkeur aan een eenvoudigere methode.

Ik gebruik Wireshark. Dit programma is ontworpen om verkeer te onderscheppen (onderscheppen). En daarin is het erg handig om te zien wat er precies naar de site wordt verzonden.

Bekijk dit kleine filmpje:

Die. met het adres waar de gegevens naartoe worden verzonden, had ik gelijk. Maar de verzonden string bleek veel ingewikkelder te zijn.

Ik heb de juiste parameter ingevoerd, en ook het script enigszins aangepast zodat deze niet alleen inlogt, maar ook iets ontvangt van de router:

0) ( echo "Curl-fout: " . curl_error($ch); ) else ( $target_url2 = "http://188.35.8.64:8080/bsc_wlan.php"; $ch2 = curl_init($target_url2); curl_setopt($ ch2, CURLOPT_RETURNTRANSFER, 1); $response_data2 = curl_exec($ch2); preg_match("|f.ssid.value = "(.*)";|", $response_data2, $results2); , "", $results2); $results2 = str_replace("";", "", $results2); echo "Wifi-netwerknaam: $resultaten2
"; preg_match("|f_wpa.wpapsk1.value(.*)";|", $response_data2, $results3); $results3 = str_replace("f_wpa.wpapsk1.value", "", $results3);$results3 = str_replace("="", "", $results3); $results3 = str_replace("";", "", $results3);

echo "Wifi-netwerkwachtwoord:

$resultaten3

"; ) curl_close($ch); ?>

Trouwens, als de eigenaar het wachtwoord bijwerkt (maar de firmware niet bijwerkt), dan kan het nieuwe wachtwoord altijd worden bekeken op http://188.35.8.64:8080/model/__show_info.php?REQUIRE_FILE=/var/etc /httppasswd

(Dit is een bekende kwetsbaarheid in de D-Link DIR-300, D-Link DIR-320 en D-Link DAP-1353 routers).

HTTP cURL-authenticatie op de opdrachtregel

We kennen het volledige adres al, evenals de te verzenden string. Het is dus eenvoudig:

Curl -s --data "ACTION_POST=LOGIN&FILECODE=&VERIFICATION_CODE=&LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv&login=Log+In+&VER_CODE=" http://188.35.8.64:8080/login.php > /dev/null && echo -e "nn " && echo "Wifi-netwerknaam" && curl -s http://188.35.8.64:8080/bsc_wlan.php | grep -E "f.ssid.value = "(.)*";" | sed "s/f.ssid.value = "//" | sed "s/";//" && echo "Wifi-netwerkwachtwoord" && curl -s http://188.35.8.64:8080/bsc_wlan.php | grep -E "f_wpa.wpapsk1.(.)*";" | sed "s/f_wpa.wpapsk1.value//" | sed "s/";//" | sed "s/="//"

Complexe autorisatiegevallen: AJAX, JQuery, JavaScript, enz.

Het zou juister zijn om deze kop als volgt te schrijven: “Complexe” vergunningsgevallen. Die. Zet het woord ‘ingewikkeld’ tussen aanhalingstekens. Ze lijken alleen op het eerste gezicht ingewikkeld, als het niet duidelijk is: waar de verzending plaatsvindt, wat de veldnamen zijn, wat er precies wordt verzonden, enz.

Maar in feite komen ze allemaal neer op de POST- of GET-methoden. Om te begrijpen wat er precies wordt verzonden, kunt u de pagina met het formulier op uw schijf opslaan en een functie toevoegen om de gegenereerde gegevens weer te geven voor verzending naar de verzendknop. Of nog eenvoudiger - zoals ik, Wireshark.

Als de gegevens correct zijn, maar er geen authenticatie plaatsvindt, moet u in de volgende richtingen graven:

  • stel de juiste verwijzende string in
  • stel de "juiste" user-agentreeks in.

Dit alles kan worden gedaan met behulp van eenvoudige cURL-methoden, maar daar zal ik niet op ingaan. De les duurde al lang genoeg, maar ik wilde ook een paar trucjes met cURL laten zien.

Tips en trucs krUL

cURL en het ontvangen van cookies naast CURLOPT_COOKIEJAR

Ik denk dat het al duidelijk is dat cURL op de juiste manier met cookies omgaat: ze opslaat, gebruikt wanneer de server erom vraagt, enz. Maar soms moeten cookies worden opgeslagen. Er is hiervoor een optie genaamd CURLOPT_COOKIEJAR, maar het is niet altijd mogelijk om deze te gebruiken. Dit is waar onze eerste truc aan is gewijd.

Soms, vanwege de manier waarop PHP op de server is geconfigureerd, zijn opties zoals CURLOPT_COOKIEJAR (hiermee kunt u ontvangen cookies in een bestand opslaan) en CURLOPT_COOKIEFILE (waarmee u cookies uit een bestand kunt gebruiken) niet beschikbaar voor ons. Omdat ze zeggen dat we met deze opties elk bestand van hun server kunnen stelen. Hier is de oplossing voor dit probleem:

1) We gebruiken CURLOPT_FOLLOWLOCATION niet

2) Gebruik curl_setopt($ch, CURLOPT_HEADER, 1)

3) Verzamel cookies uit de header als volgt:

Preg_match_all("|Set-Cookie: (.*);|U", $content, $results); $cookies = implode(";", $results);

4) Stel ze in met curl_setopt($ch, CURLOPT_COOKIE, $cookies);

Tweede tip. We kunnen van aanvallers slachtoffers maken. Om te voorkomen dat we slachtoffer worden van een man-in-the-middle-aanval, doen we dit.

Alsjeblieft, allemaal, stop met het instellen van de CURLOPT_SSL_VERIFYPEER-instelling op false of 0. Als je PHP-installatie niet over een up-to-date set root-CA-certificaten beschikt, download er dan een van de curl-website en sla deze op je server op:

Stel vervolgens het pad in uw php.ini-bestand in, bijvoorbeeld op Windows:

Curl.cainfo=c:phpcacert.pem

Het uitschakelen van CURLOPT_SSL_VERIFYPEER maakt een man-in-the-middle (MITM) aanval mogelijk, wat we niet willen!

Nou, de laatste tip voor vandaag. Wist u dat er een groot aantal asynchrone curl-verzoeken mogelijk zijn?

Hiervoor kunt u gebruiken curl_multi_init. Details en voorbeeldcode in de officiële documentatie http://php.net/manual/ru/function.curl-multi-init.php

Over cURL op de opdrachtregel

Man krul

Het tweede deel van de les is ook voorbereid op lezen in het Russisch krul: " ".