PHP CURL - funksjoner og eksempler på bruk. Avansert bruk av cURL i PHP Curl kommandolinjealternativer
(PHP 4 >= 4.0.2, PHP 5, PHP 7)
curl_setopt — Angir en parameter for CURL-sesjonen
Liste over parametere
cURL-håndtak hentet fra curl_init().
Parameter som skal stilles inn CURLOPT_XXX.
Verdien av opsjonsparameteren.
bool:
Parameter | Notater | |
---|---|---|
CURLOPT_AUTOREFERER | EKTE for automatisk feltinnstilling Henviser: i forespørsler omdirigert etter overskrift Plassering:. | |
CURLOPT_BINARYTRANSFER | EKTE for å returnere råresponsen når du bruker en konstant CURLOPT_RETURNTRANSFER. | Fra og med PHP 5.1.3 er dette alternativet ikke lenger nødvendig: rå utgang returneres alltid når du bruker alternativet CURLOPT_RETURNTRANSFER. |
CURLOPT_COOKIESESSION | EKTE for å instruere gjeldende økt om å starte en ny "økt" med informasjonskapsler. Dette vil føre til at libcurl ignorerer alle "session"-informasjonskapsler den skulle ha lastet fra forrige økt. Som standard lagrer og laster libcurl alltid alle informasjonskapsler, uavhengig av om de er "session" eller ikke. «Session»-informasjonskapsler er informasjonskapsler som ikke utløper og kun må eksistere for den nåværende «økten». | |
CURLOPT_CERTINFO | EKTE for å sende ut SSL-sertifikatinformasjon for å streame STDERR med sikre tilkoblinger. | Lagt til i cURL 7.19.1. Tilgjengelig fra og med PHP 5.3.2. Krever at dette alternativet er aktivert for korrekt drift CURLOPT_VERBOSE. |
CURLOPT_CONNECT_ONLY | EKTE ber biblioteket utføre nødvendig proxy-autentisering og tilkoblingsoppsett, men overfører ikke data. Dette alternativet er implementert for HTTP, SMTP og POP3. | Lagt til i 7.15.2. Tilgjengelig fra PHP 5.5.0. |
CURLOPT_CRLF | EKTE for å konvertere Unix-linjeavslutninger til CRLF. | |
CURLOPT_DNS_USE_GLOBAL_CACHE | EKTE for å bruke den globale DNS-bufferen. Dette alternativet er ikke trådsikkert og er aktivert som standard. | |
CURLOPT_FAILONERROR | EKTE for en detaljert rapport om feil hvis den mottatte HTTP-koden er større enn eller lik 400. Standardoppførselen returnerer siden som normalt, og ignorerer koden. | |
CURLOPT_FILETIME | EKTE for å prøve å finne endringsdatoen for et eksternt dokument. Denne verdien kan oppnås ved å bruke parameteren CURLINFO_FILETIME fra funksjonen curl_getinfo(). | |
CURLOPT_FOLLOWLOCATION | EKTEå følge en hvilken som helst overskrift "Plassering: " sendt av serveren i sitt svar (merk at dette skjer rekursivt, PHP vil følge alle overskrifter som sendes "Plassering: ", bortsett fra når en konstant er satt CURLOPT_MAXREDIRS). | |
CURLOPT_FORBID_REUSE | EKTEå tvinge en tilkobling til å bli stengt etter at behandlingen er fullført, slik at den ikke kan gjenbrukes. | |
CURLOPT_FRESH_CONNECT | EKTEå tvinge frem bruken av en ny tilkobling i stedet for en bufret. | |
CURLOPT_FTP_USE_EPRT | EKTEå bruke EPRT (og LPRT) for aktive FTP-opplastinger. Bruk FALSK for å deaktivere EPRT og LPRT og kun bruke PORT. | |
CURLOPT_FTP_USE_EPSV | EKTE for innledende testing av EPSV-kommandoen under FTP-overføringer. Hvis kommandoen mislykkes, vil den falle tilbake til PASV. Installer i FALSK for å deaktivere EPSV. | |
CURLOPT_FTP_CREATE_MISSING_DIRS | EKTEå opprette manglende kataloger hvis en FTP-operasjon støter på en ikke-eksisterende bane. | |
CURLOPT_FTPAPPEND | EKTEå skrive en ekstern fil til slutten, i stedet for å overskrive den over en eksisterende fil. | |
CURLOPT_TCP_NODELAY | Spesifiserer permanent om TCP_NODELAY-alternativet skal settes eller slettes (1 = satt, 0 = slettet). Som standard er alternativet fjernet. | Tilgjengelig fra PHP 5.2.1 for versjoner bygget med libcurl 7.11.2 eller nyere. |
CURLOPT_FTPASCII | Kallenavn CURLOPT_TRANSFERTEXT. Bruk denne i stedet. | |
KUN CURLOPT_FTPLIST | EKTE for å returnere bare en liste over navn fra FTP-katalogen. | |
CURLOPT_HEADER | EKTEå inkludere overskrifter i utdataene. | |
CURLINFO_HEADER_OUT | EKTE for å spore håndtaksspørringsstrengen. | Tilgjengelig fra PHP 5.1.3. Prefiks CURLINFO_ brukt spesifikt. |
CURLOPT_HTTPGET | EKTE for å tilbakestille HTTP-forespørselsmetoden til GET-metoden. Siden GET er standard, er denne parameteren bare nødvendig hvis forespørselsmetoden tidligere har blitt endret. | |
CURLOPT_HTTPPROXYTUNNEL | EKTEå tunnelere gjennom den angitte HTTP-proxyen. | |
CURLOPT_MUTE | EKTE for å deaktivere cURL-funksjonsmeldinger fullstendig. | Fjernet i cURL 7.15.5 (alternativet CURLOPT_RETURNTRANSFER kan brukes) |
CURLOPT_NETRC | EKTE for å lese ~/.netrc-filen for pålogging og passord for det eksterne nettstedet som forbindelsen opprettes med. | |
CURLOPT_NOBODY | EKTE for å ekskludere svarlegemet fra utdata. Forespørselsmetoden er satt til HEAD. Endre denne innstillingen til FALSK endrer den ikke tilbake til GET. | |
CURLOPT_NOPROGRESS | EKTE for å deaktivere fremdriftsindikatoren på cURL-overføringer.
|
|
CURLOPT_NOSIGNAL | EKTEå ignorere enhver cURL-funksjon som sender signaler til PHP-prosessen. Dette alternativet er aktivert som standard i flertrådede SAPI-er for å la timeout-parametere fungere riktig. | |
CURLOPT_POST | EKTEå bruke vanlig HTTP POST. Denne POST-metoden bruker normalen , ofte brukt i HTML-skjemaer. | |
CURLOPT_PUT | EKTE for å laste ned en fil ved hjelp av HTTP PUT-metoden. Filen som brukes må angis ved hjelp av alternativene CURLOPT_INFILE Og CURLOPT_INFILESIZE. | |
CURLOPT_RETURNTRANSFER | EKTE for å returnere resultatet av overføringen som en streng fra curl_exec() i stedet for direkte utgang til nettleseren. | |
CURLOPT_SAFE_UPLOAD | EKTE for å deaktivere prefiksstøtte @ for nedlastede filer i CURLOPT_POSTFIELDS, som betyr at verdiene gikk med @ kan overføres sikkert som felt. I stedet for et prefiks kan du bruke alternativet CURLFile d. | Lagt til i PHP 5.5.0 med standardverdi FALSK. I PHP 5.6.0 ble det lik som standard EKTE. |
CURLOPT_SSL_VERIFYPEER | FALSK for å stoppe cURL fra å sjekke vertssertifikatet. Alternative sertifikater som skal verifiseres kan spesifiseres ved hjelp av parameteren CURLOPT_CAINFO eller katalogen med sertifikater spesifisert av parameteren CURLOPT_CAPATH. | Standard er EKTE siden cURL versjon 7.10. Standarddistribusjonen er installert fra og med cURL versjon 7.10. |
CURLOPT_TRANSFERTEXT | EKTE for å bruke ASCII-modus for FTP-overføringer. Når du bruker LDAP, returneres dataene i ren tekst i stedet for HTML. På Windows-systemer tråden STDOUT settes ikke til binær modus. | |
CURLOPT_UNRESTRICTED_AUTH | EKTE for å fortsette å sende innlogging og passord under omdirigeringer (når du bruker CURLOPT_FOLLOWLOCATION), selv om vertsnavnet endres. | |
CURLOPT_UPLOAD | EKTE for å forberede opplasting av filen til serveren. | |
CURLOPT_VERBOSE | EKTE for å vise tilleggsinformasjon. Skriver utdata til en strøm STDERR, eller filen spesifisert av parameteren CURLOPT_STDERR. |
For følgende alternativparameterverdier må verdiparameteren være av typen heltall:
Parameter | Sett verdiverdi | Notater |
---|---|---|
CURLOPT_BUFFERSIZE | Størrelsen på bufferen som brukes for hver lesning. Det er imidlertid ingen garanti for at denne forespørselen vil bli fullført. | Lagt til i cURL 7.10. |
CURLOPT_CLOSEPOLICY | En av konstantene CURLCLOSEPOLICY_*.
|
Fjernet i PHP 5.6.0. |
CURLOPT_CONNECTTIMEOUT | Antall sekunder å vente når du prøver å koble til. Bruk 0 for å vente på ubestemt tid. | |
CURLOPT_CONNECTTIMEOUT_MS | Antall millisekunder å vente når du forsøker å koble til. Bruk 0 for å vente på ubestemt tid. Hvis libcurl er kompilert ved hjelp av systemets standard navneløser, vil tilkoblingen fortsatt bruke et helt sekunds venting som en timeout, med et minimum tillatt tidsavbrudd på 1 sekund. | Lagt til i cURL versjon 7.16.2. Tilgjengelig fra og med PHP 5.2.3. |
CURLOPT_DNS_CACHE_TIMEOUT | Antall sekunder som DNS-registreringer er lagret i minnet. Som standard er denne parameteren 120 (2 minutter). | |
CURLOPT_FTPSSLAUTH | FTP-autentiseringsmetode (i aktiv modus): CURLFTPAUTH_SSL(SSL sjekkes først), CURLFTPAUTH_TLS(TLS sjekket først) eller CURLFTPAUTH_DEFAULT(cURL bestemmer selv). | Lagt til i cURL versjon 7.12.2. |
CURLOPT_HTTP_VERSION | CURL_HTTP_VERSION_NONE (som standard velger CURL hvilken versjon som skal brukes), CURL_HTTP_VERSION_1_0 (force HTTP/1.0) eller CURL_HTTP_VERSION_1_1 (force HTTP/1.1). | |
CURLOPT_HTTPAUTH |
Du kan bruke den bitvise operatoren | (eller) å kombinere flere metoder sammen. I dette tilfellet vil cURL spørre serveren for støttede autorisasjonsmetoder og velge den beste. CURLAUTH_ANY er et alias CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM. CURLAUTH_ANYSAFE er et alias CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM. |
|
CURLOPT_INFILESIZE | Den forventede filstørrelsen, i byte, når du laster opp en fil til en ekstern server. Vær oppmerksom på at bruk av dette alternativet vil ikke stoppe at ytterligere data sendes utover denne verdien, da dataene som sendes avhenger av resultatet CURLOPT_READFUNCTION. | |
CURLOPT_LOW_SPEED_LIMIT | Øvre terskel for dataoverføringshastighet, i byte per sekund. Verifikasjonen skjer innen CURLOPT_LOW_SPEED_TIME sekunder, hvoretter PHP anser overføringen for treg og avbryter den. | |
CURLOPT_LOW_SPEED_TIME | Maksimalt antall sekunder som overføringshastigheten ikke må overstige CURLOPT_LOW_SPEED_LIMIT, ellers vil PHP markere overføringen som for treg og stoppe den. | |
CURLOPT_MAXCONNECTS | Maksimalt antall vedvarende tilkoblinger. Når grensen er nådd, brukes parameteren til å bestemme hvilken forbindelse som skal lukkes. CURLOPT_CLOSEPOLICY. | |
CURLOPT_MAXREDIRS | Maksimalt antall aksepterte viderekoblinger. Bruk dette alternativet sammen med alternativet CURLOPT_FOLLOWLOCATION. | |
CURLOPT_PORT | Alternativ tilkoblingsport. | |
CURLOPT_POSTREDIR | En bitmaske som inneholder 1 (301 flyttet permanent), 2 (302 funnet) og 4 (303 Se annet) for å spesifisere om HTTP POST-metoden skal behandles når alternativet er aktivert CURLOPT_FOLLOWLOCATION hvis den angitte typen omdirigering skjedde. | Lagt til i cURL 7.19.1. Tilgjengelig siden PHP 5.3.2. |
CURLOPT_PROTOCOLS |
Bitmaske av verdier CURLPROTO_*. Denne masken begrenser protokollene som brukes av libcurl. Dette lar deg få libcurl til å fungere med et stort antall protokoller, og begrense driften av visse overføringer til bare en undergruppe av dem. Som standard bruker libcurl alle støttede protokoller. Se også parameter CURLOPT_REDIR_PROTOCOLS. Korrekte protokollverdier: CURLPROTO_HTTP , CURLPROTO_HTTPS , CURLPROTO_FTP , CURLPROTO_FTPS , CURLPROTO_SCP , CURLPROTO_SFTP , CURLPROTO_TELNET , CURLPROTO_LDAP , CURLPROTO_LDAP , CURLTORLPS_PROTO_CULPPRO , CURLPROTO_CULPUR ROTO_TFTP, CURLPROTO_ALL |
|
CURLOPT_PROXYAUTH | HTTP-godkjenningsmetoder som brukes når du kobler til en proxy-server. Bruk de samme bitmaskene som ble beskrevet for parameteren CURLOPT_HTTPAUTH. For øyeblikket er det bare CURLAUTH_BASIC og CURLAUTH_NTLM som støttes for proxy-autorisasjon. | Lagt til i cURL versjon 7.10.7. |
CURLOPT_PROXYPORT | Portnummeret til proxy-serveren som tilkoblingen er gjort til. Dette tallet kan også stilles inn ved hjelp av parameteren CURLOPT_PROXY. | |
CURLOPT_PROXYTYPE | Enten CURLPROXY_HTTP (standard) eller CURLPROXY_SOCKS5 . | Lagt til i cURL 7.10. |
CURLOPT_REDIR_PROTOCOLS | Bitmaske av verdier CURLPROTO_*. Denne bitmasken begrenser protokollene som brukes av libcurl ved omdirigering (med parameteren aktivert CURLOPT_FOLLOWLOCATION). Dette lar deg begrense settet med protokoller som brukes ved omdirigering for enkelte overføringer. Som standard støtter libcurl alle protokoller unntatt FILE og SCP. I versjoner før 7.19.4 ble omdirigering brukt for alle protokoller uten unntak. Se også parameterbeskrivelse CURLOPT_PROTOCOLS for en liste over konstanter med protokollverdier. | Lagt til i cURL versjon 7.19.4. |
CURLOPT_RESUME_FROM | Sendingsstartforskyvning, i byte. | |
CURLOPT_SSL_VERIFYHOST | Bruk 1 for å sjekke om det finnes et vanlig navn i SSL-sertifikatet. Bruk 2 for å sjekke at det vanlige navnet eksisterer og også samsvarer med den angitte verten. I et kampmiljø bør verdien av denne parameteren være 2 (angitt som standard). | Støtte for verdi 1 er fjernet i cURL 7.28.1 |
CURLOPT_SSLVERSION | En av konstantene 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) eller CURL_SSLVERSION_TLSv1_2 (6). | |
CURLOPT_TIMECONDITION | Metode for tolkning av parametere CURLOPT_TIMEVALUE. Bruk CURL_TIMECOND_IFMODSINCE for å returnere siden bare hvis den har endret seg siden tiden angitt i parameteren CURLOPT_TIMEVALUE. Hvis siden ikke er endret, vil tittelen bli returnert "304 ikke endret", som antyder at parameteren CURLOPT_HEADER installert i EKTE. Bruk CURL_TIMECOND_IFUNMODSINCE for den motsatte effekten. Standard er CURL_TIMECOND_IFMODSINCE. | |
CURLOPT_TIMEOUT | Maksimalt antall sekunder tillatt for å utføre cURL-funksjoner. | |
CURLOPT_TIMEOUT_MS | Maksimalt antall millisekunder tillatt for å utføre cURL-funksjoner. Hvis libcurl er bygget ved hjelp av den vanlige systemnavn-resolveren, vil dette tilkoblingsspennet fortsatt bruke andre avrundingstidsavbrudd, med en minimumstidsavbrudd tillatt på ett sekund. | Lagt til i cURL versjon 7.16.2. Tilgjengelig fra og med PHP 5.2.3. |
CURLOPT_TIMEVALUE | Antall sekunder siden 1. januar 1970. Denne tiden vil bli brukt av parameteren CURLOPT_TIMECONDITION. Som standard brukes parameteren CURL_TIMECOND_IFMODSINCE. | |
CURLOPT_MAX_RECV_SPEED_LARGE | Hvis nedlastingshastigheten overskrider denne verdien (angitt i byte per sekund) i gjennomsnitt over hele overføringen, vil nedlastingen settes på pause for å opprettholde gjennomsnittshastigheten mindre enn eller lik denne parameteren. Som standard er hastigheten ikke begrenset. | |
CURLOPT_MAX_SEND_SPEED_LARGE | Hvis opplastingen til serveren overskrider denne verdien (angitt i byte per sekund) i gjennomsnitt gjennom hele overføringen, vil opplastingen settes på pause for å opprettholde en gjennomsnittshastighet som er mindre enn eller lik denne parameteren. Som standard er hastigheten ikke begrenset. | Lagt til i cURL 7.15.5. Tilgjengelig fra PHP 5.4.0. |
CURLOPT_SSH_AUTH_TYPES | En bitmaske som består av en eller flere konstanter: CURLSSH_AUTH_PUBLICKEY, CURLSSH_AUTH_PASSWORD, CURLSSH_AUTH_HOST, CURLSSH_AUTH_KEYBOARD. Installere CURLSSH_AUTH_ANY for at libcurl skal velge en av dem uavhengig. | Lagt til i cURL 7.16.1. |
CURLOPT_IPRESOLVE | Lar en app velge typen IP-adresse som vertsnavnet bestemmes med. Dette er nødvendig hvis du bruker et vertsnavn som er avledet fra mer enn én versjon av IP-adressen. Mulige verdier kan være CURL_IPRESOLVE_WHATEVER, CURL_IPRESOLVE_V4, CURL_IPRESOLVE_V6, og som standard CURL_IPRESOLVE_WHATEVER. | Lagt til i cURL 7.10.8. |
For følgende alternativparameterverdier må verdiparameteren være av typen streng:
Parameter | Sett verdiverdi | Notater |
---|---|---|
CURLOPT_CAINFO | Navnet på en fil som inneholder ett eller flere sertifikater som noder vil bli kontrollert mot. Denne parameteren gir bare mening når den brukes sammen med CURLOPT_SSL_VERIFYPEER. | Krever en absolutt vei. |
CURLOPT_CAPATH | En katalog som inneholder flere CA-sertifikater. Bruk dette alternativet sammen med CURLOPT_SSL_VERIFYPEER. | |
CURLOPT_COOKIE | Overskriftsinnhold "Kjeks:", brukt i HTTP-forespørselen. Vær oppmerksom på at flere informasjonskapsler er atskilt med et semikolon etterfulgt av et mellomrom (for eksempel " frukt=eple; farge=rød") | |
CURLOPT_COOKIEFILE | Navnet på filen som inneholder informasjonskapslene. Denne filen må være i Netscape-format eller bare HTTP-hoder skrevet til filen. Hvis en tom streng sendes som filnavn, lagres ikke informasjonskapsler, men behandlingen vil fortsatt være aktivert. | |
CURLOPT_COOKIEJAR | Navnet på filen der alle interne informasjonskapsler for gjeldende overføring vil bli lagret etter at håndtaket er lukket, for eksempel etter å ha kalt curl_close. | |
CURLOPT_CUSTOMREQUEST | Egendefinert forespørselsmetode brukes i stedet "FÅ" eller "HODE" når du gjør en HTTP-forespørsel. Dette er nyttig for spørsmål "SLETT" eller andre, mer sjeldne HTTP-forespørsler. Korrekte betydninger vil være ord som "FÅ", "POST", "KOBLE" og så videre; de. Ikke skriv inn hele HTTP-forespørselslinjen her. For eksempel en indikasjon "GET /index.html HTTP/1.0\r\n\r\n" vil være feil.
|
|
CURLOPT_EGDSOCKET | Som CURLOPT_RANDOM_FILE, bortsett fra at filnavnet er satt til Entropy Gathering Daemon-kontakten. | |
CURLOPT_ENCODING | Overskriftsinnhold "Godta-koding: ". Dette gjør at forespørselen kan dekodes. Støttede kodinger er "identitet", "tømme luft" Og "gzip". Hvis en tom streng passeres, "" , sendes en overskrift som inneholder alle støttede kodingstyper. | Lagt til i cURL 7.10. |
CURLOPT_FTPPORT | Verdien som skal brukes til å bestemme IP-adressen for FTP "PORT"-kommandoen. "PORT"-kommandoen forteller serveren hvilken IP-adresse den skal koble til. Dette kan være en IP-adresse, vertsnavn, nettverksgrensesnittnavn (under Unix), eller ganske enkelt "-" for å bruke standard systemets IP-adresse. | |
CURLOPT_INTERFACE | Navnet på nettverksgrensesnittet som skal brukes. Kan være et grensesnittnavn, en IP-adresse eller et vertsnavn. | |
CURLOPT_KEYPASSWD | Passord kreves for å bruke den private nøkkelen CURLOPT_SSLKEY eller CURLOPT_SSH_PRIVATE_KEYFILE. | Lagt til i cURL 7.16.1. |
CURLOPT_KRB4LEVEL | Sikkerhetsnivå KRB4 (Kerberos 4). Enhver av følgende verdier (i rekkefølge fra svakeste til sterkeste) er korrekte: "klar", "sikker", "konfidensiell", "privat".. Hvis den angitte strengen er forskjellig fra de gitte verdiene, vil verdien bli brukt "privat". Setter dette alternativet til NULL vil deaktivere KRB4-sikkerhet fullstendig. For øyeblikket fungerer KRB4-sikkerhet kun med FTP-transaksjoner. | |
CURLOPT_POSTFIELDS | Alle data overføres i en HTTP POST-forespørsel. For å overføre en fil, spesifiser før filnavnet @ , og bruk også hele banen til filen. Filtypen kan også spesifiseres ved å bruke formatet " ;type=mimetype" etter filnavnet. Denne parameteren kan sendes som en url-kodet streng, som " para1=val1¶2=val2&...", og i form av en matrise, hvis nøkler vil være navnene på feltene, og verdiene vil være deres innhold. Hvis verdien er en matrise, vil overskriften Innholdstype vil bli satt til multipart/form-data. Fra PHP 5.2.0, når du overfører filer med prefikset @ , må verdien være en matrise. Siden PHP 5.5.0, prefiks @ er utdatert og filer kan sendes vha CURLFile. Prefiks @ kan deaktiveres for å tillate verdier som starter med @ ved å angi alternativet CURLOPT_SAFE_UPLOAD i betydning EKTE. | |
CURLOPT_PROXY | HTTP-proxy som forespørsler vil bli rutet gjennom. | |
CURLOPT_PROXYUSERPWD | Logg inn og passord skrevet i skjemaet ":" , brukes når du kobler til via en proxy. | |
CURLOPT_RANDOM_FILE | Navnet på filen som brukes til å initialisere tilfeldig tallgenerator for SSL. | |
CURLOPT_RANGE | Dataområde som skal lastes ned, i format "X-Y", og enten X eller Y kan utelates. HTTP-protokollen støtter også overføring av flere områder atskilt med kommaer, de er spesifisert i formatet "X-Y,N-M". | |
CURLOPT_REFERER | Overskriftsinnhold "Henviser:", som vil bli brukt i HTTP-forespørselen. | |
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 | En streng som inneholder 32 heksadesimale sifre. Strengen må være en MD5-sjekksum av den eksterne datamaskinens offentlige nøkkel, og libcurl vil tilbakestille tilkoblingen til den eksterne verten til kontrollsummen samsvarer med den offentlige nøkkelen. Dette alternativet er kun for overføring av data ved hjelp av SCP og SFTP. | Lagt til i cURL 7.17.1. |
CURLOPT_SSH_PUBLIC_KEYFILE | Filnavnet for din offentlige nøkkel. Hvis ikke spesifisert, bruker libcurl som standard filen $HOME/.ssh/id_dsa.pub hvis HOME-miljøvariabelen er satt og filen "id_dsa.pub" i gjeldende katalog hvis HOME-miljøvariabelen ikke er angitt. | Lagt til i cURL 7.16.1. |
CURLOPT_SSH_PRIVATE_KEYFILE | Filnavnet for din private nøkkel. Hvis ikke spesifisert, vil libcurl som standard bruke $HOME/.ssh/id_dsa-filen hvis HOME-miljøvariabelen er satt og "id_dsa"-filen i gjeldende katalog hvis HOME-miljøvariabelen ikke er angitt. Hvis filen er passordbeskyttet, angi passordet med CURLOPT_KEYPASSWD. | Lagt til i cURL 7.16.1. |
CURLOPT_SSL_CIPHER_LIST | Liste over chiffer brukt i SSL-overføringer. For eksempel, RC4-SHA Og TLSv1 er gyldige chifferlister. | |
CURLOPT_SSLCERT | Navnet på en fil med et riktig formatert PEM-sertifikat. | |
CURLOPT_SSLCERTPASSWD | Passord kreves for å bruke sertifikatet CURLOPT_SSLCERT. | |
CURLOPT_SSLCERTTYPE | Sertifikatformat. Formater støttes "PEM"(misligholde), "DER" Og "ENG". | Lagt til i cURL versjon 7.9.3. |
CURLOPT_SSLENGINE | Krypteringsmotor-ID-en for den private SSL-nøkkelen som er angitt i parameteren CURLOPT_SSLKEY. | |
CURLOPT_SSLENGINE_DEFAULT | Identifikatoren til krypteringsmekanismen som brukes for asymmetriske krypteringsoperasjoner. | |
CURLOPT_SSLKEY | Navnet på SSL-privatnøkkelfilen. | |
CURLOPT_SSLKEYPASSWD | Det hemmelige passordet som kreves for å bruke den private SSL-nøkkelen spesifisert av parameteren CURLOPT_SSLKEY.
|
|
CURLOPT_SSLKEYTYPE | Typen privat SSL-nøkkel som er angitt i parameteren CURLOPT_SSLKEY. Følgende nøkkeltyper støttes: "PEM"(misligholde), "DER" Og "ENG". | |
CURLOPT_URL | Nedlastbar URL. Denne parameteren kan også stilles inn når du initialiserer en økt med curl_init(). | |
CURLOPT_USERAGENT | Overskriftsinnhold "Bruker agent: ", sendt i en HTTP-forespørsel. | |
CURLOPT_USERPWD | Pålogging og passord brukt under tilkobling, spesifisert i formatet ":" . |
For følgende alternativparameterverdier må verdiparameteren være en matrise:
Parameter | Sett verdiverdi | Notater |
---|---|---|
CURLOPT_HTTP200ALIASES | En rekke HTTP 200-svar som vil bli behandlet som korrekte svar i stedet for feilaktige. | Lagt til i cURL versjon 7.10.3. |
CURLOPT_HTTPHEADER | En rekke angitte HTTP-overskrifter, i formatmatrisen ("Innholdstype: tekst/vanlig", "Innholdslengde: 100") | |
CURLOPT_POSTQUOTE | En rekke FTP-kommandoer som utføres på serveren etter at en FTP-forespørsel er fullført. | |
CURLOPT_QUOTE | En rekke FTP-kommandoer utført på serveren før en FTP-forespørsel. |
For følgende alternativparameterverdier må verdiparameteren være et strømhåndtak (returnert for eksempel av funksjonen fopen()):
Parameter | Sett verdiverdi |
---|---|
CURLOPT_FILE | Filen der overføringsresultatet vil bli skrevet. Standard utdatastrøm STDOUT(nettleservindu). |
CURLOPT_INFILE | Filen som data skal leses fra når den lastes opp til serveren. |
CURLOPT_STDERR | Alternativ feilutdatafil brukt i stedet for feilstrømmen STDERR. |
CURLOPT_WRITEHEADER | Filen der overskriftene til gjeldende operasjon vil bli skrevet. |
For følgende alternativparameterverdier må verdiparameteren være et gyldig funksjonsnavn eller lukking:
Parameter | Sett verdiverdi |
---|---|
CURLOPT_HEADERFUNCTION | Tilbakeringingsfunksjonen tar to parametere. Den første parameteren er cURL-håndtaket, den andre parameteren er en streng som inneholder overskriftene som skal skrives. Overskrifter må skrives med denne tilbakeringingsfunksjonen. Skal returnere antall byte skrevet. |
CURLOPT_PASSWDFUNCTION | Tilbakeringingsfunksjonen tar tre parametere. Den første parameteren er cURL-håndtaket, den andre parameteren er passordpromptstrengen, og den tredje parameteren er maksimal passordlengde. Skal returnere en streng som inneholder passordet. |
CURLOPT_PROGRESSFUNCTION |
Tilbakeringingsfunksjonen tar fem parametere. Den første er cURL-beskrivelsen, den andre er det totale antallet byte som forventes å bli lastet ned fra serveren, den tredje er antall byte som allerede er lastet ned, den fjerde er det totale antallet byte som forventes å bli sendt til serveren, og den femte er antall byte som allerede er sendt.
Du kan returnere en verdi som ikke er null for å avbryte overføringen. I dette tilfellet vil en feil vises CURLE_ABORTED_BY_CALLBACK. |
CURLOPT_READFUNCTION | Tilbakeringingsfunksjonen tar tre parametere. Den første parameteren er cURL-håndtaket, den andre parameteren er strømressursen som sendes til cURL via alternativet CURLOPT_INFILE, og den tredje parameteren er den maksimalt tillatte mengden data som skal leses. Tilbakeringingsfunksjonen må returnere en streng med lengde som ikke er større enn den forespurte datamengden, vanligvis ved å lese fra den beståtte streamingressursen. Skal returnere en tom streng for å signalisere slutten av filen EOF. |
CURLOPT_WRITEFUNCTION | Tilbakeringingsfunksjonen tar to parametere. Den første parameteren er cURL-håndtaket, og den andre parameteren er strengen som inneholder dataene som skal skrives. Data må lagres med denne funksjonen. Den må returnere det nøyaktige antallet byte skrevet, ellers vil nedlastingen bli avbrutt med en feil. |
Andre betydninger:
Returverdier
Returnerer EKTE ved vellykket gjennomføring eller FALSK i tilfelle feil.
Liste over endringer
Versjon | Beskrivelse |
---|---|
5.6.0 | Alternativ CURL_SAFE_UPLOAD har nå en standardverdi på EKTE. |
5.6.0 | Fjernet alternativ CURLOPT_CLOSEPOLICY og tilhørende betydninger. |
5.5.0 | cURL-ressursen legges til som det første argumentet til tilbakeringingsfunksjonen CURLOPT_PROGRESSFUNCTION. |
5.5.0 | Lagt til alternativ CURLOPT_DEL. |
5.3.0 | Lagt til alternativ CURLOPT_PROGRESSFUNCTION. |
5.2.10 | Lagt til alternativer CURLOPT_PROTOCOLS Og CURLOPT_REDIR_PROTOCOLS. |
5.1.0 | Lagt til alternativer CURLOPT_AUTOREFERER, CURLOPT_BINARYTRANSFER, CURLOPT_FTPSSLAUTH, CURLOPT_PROXYAUTH Og CURLOPT_TIMECONDITION. |
5.0.0 | Lagt til alternativer CURLOPT_FTP_USE_EPRT, CURLOPT_NOSIGNAL, CURLOPT_UNRESTRICTED_AUTH, CURLOPT_BUFFERSIZE, CURLOPT_HTTPAUTH, CURLOPT_PROXYPORT, CURLOPT_PROXYTYPE, CURLOPT_SSLCERTTYPE Og CURLOPT_HTTP200ALIASES. |
Eksempler
Eksempel #1 Initialisering av en CURL-økt og lasting av en nettside
// opprett en ny cURL-ressurs /* http://localhost/upload.php: $ch = curl_init(); $data = array("name" => "Foo" , "file" => "@/home/user/test.png" ); Curl_setopt($ch, CURLOPT_URL, "http://localhost/upload.php"); Curl_exec($ch); Resultatet av å kjøre dette eksemplet: Array ( => Foo) Array ( => Array ( => test.png => image/png => /tmp/phpcpjNeQ => 0 => 279)) Kommentar: Sender en matrise til CURLOPT_POSTFIELDS koder dataene som multipart/form-data, mens å sende en URL-kodet streng vil kode dataene som application/x-www-form-urlencoded. cURL er et verktøy som lar deg samhandle med ulike servere og støtter mange protokoller: HTTP, FTP, TELNET, etc. cURL er opprinnelig et kommandolinjeverktøy. Men heldigvis for oss støtter PHP arbeid med cURL-biblioteket. I denne artikkelen skal vi se på ikke-trivielle eksempler på arbeid med cURL. Faktisk er det mange andre måter å sende en forespørsel til en annen server for for eksempel å hente innholdet på en side. Mange mennesker, for det meste av latskap, bruker enkle PHP-funksjoner i stedet for cURL: $content = file_get_contents("http://www.example.com"); // eller $lines = file("http://www.example.com"); // eller readfile("http://www.example.com"); De tillater imidlertid ikke effektiv feilhåndtering. Det er også en rekke oppgaver som de ikke kan gjøre i det hele tatt – for eksempel arbeid med informasjonskapsler, autorisasjon, postforespørsler, nedlasting av filer. cUrl er et kraftig verktøy som støtter flere protokoller og gir fullstendig forespørselsinformasjon. Før vi går videre til komplekse eksempler, la oss se på den grunnleggende strukturen til en cURL-forespørsel i PHP. For å utføre en cURL-forespørsel i PHP, må du ta 4 hovedtrinn: Vi vil for det meste se på trinn #2 i denne artikkelen siden det er der magien skjer. Listen over cURL-alternativer er veldig stor, så vi vil ikke vurdere alle alternativene i dag, men vil bruke de som er nyttige for å løse spesifikke problemer. Om nødvendig kan du legge til følgende linjer for å spore feil: // ... $output = curl_exec($ch); if ($output === FALSE) ( echo "cURL Error: " . curl_error($ch); ) // ... Vær oppmerksom på at vi bruker "===" i stedet for "==" fordi Det er nødvendig å skille mellom et tomt serversvar og den boolske verdien FALSE, som returneres i tilfelle feil. Et annet valgfritt trinn er å få informasjon om cURL-forespørselen etter at den er utført. // ... curl_exec($ch); $info = curl_getinfo($ch); ekko "Tok". $info["total_time"] . "sekunder for url". $info["url"]; // ... Som et resultat vil du motta en matrise med følgende informasjon: I dette eksemplet vil vi skrive et skript som vil oppdage omdirigeringer basert på forskjellige nettleserinnstillinger. Noen nettsteder omdirigerer for eksempel besøkende fra mobile enheter til besøkende fra andre land. Vi bruker alternativet CURLOPT_HTTPHEADER for å angi våre egne overskrifter, inkludert brukeragent og språk, og se hvor nettsteder omdirigerer oss. // URLer $urls = array("http://www.cnn.com", "http://www.mozilla.com", "http://www.facebook.com"); // nettlesere $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)", "language" => "en-us,en;q=0.5"), "iphone" => array ("user_agent" => "Mozilla/5.0 (iPhone; U; CPU som Mac OS X; no) AppleWebKit/420+ (KHTML, som Gecko) Versjon/3.0 Mobile/1A537a Safari/419.3", "language" => "en"), "french" => array ("user_agent" = > "Mozilla/4.0 (kompatibel; MSIE 7.0; Windows NT 5.1; GTB6; .NET CLR 2.0.50727)", "language" => "fr,fr-FR;q=0.5")); foreach ($urls som $url) ( echo "URL: $url\n"; foreach ($browsers som $test_name => $browser) ( $ch = curl_init(); // angi adressen curl_setopt($ch, CURLOPT_URL , $url); // angi nettleseren og språket som brukes curl_setopt($ch, CURLOPT_HTTPHEADER, array("Bruker-Agent: ($browser["user_agent"])", "Accept-Language: ($browser["språk" ]) ")); // vi trenger ikke innholdet på siden curl_setopt($ch, CURLOPT_NOBODY, 1); // vi trenger bare overskrifter curl_setopt($ch, CURLOPT_HEADER, 1); // returner resultatet i stedet av utgangen curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1); $output = curl_exec($ch); curl_close($ch); // definere omdirigeringer i HTTP-overskrifter? if (preg_match("!Plassering: (.*)!" , $output, $matches)) ( echo "$test_name: omdirigerer til $matches\n"; ) else ( echo "$test_name: no redirection\n"; ) ) echo "\n\n"; ) I en løkke sjekker vi nettlesere for hver URL. Først angir vi alternativene for forespørselen vår: URL og nettleser og språk som skal testes. Fordi Vi har satt et spesielt alternativ; resultatet av forespørselen vil kun inneholde HTTP-hoder. Ved å bruke et enkelt regulært uttrykk kan vi sjekke om svaret inneholder strengen "Location:". Resultat av skriptkjøring: URL: http://www.cnn.com standard: omdirigerer til http://edition.cnn.com/ iphone: omdirigerer til http://edition.cnn.com/ Fransk: omdirigerer til http://edition.cnn .com/ URL: http://www.mozilla.com standard: omdirigerer til https://www.mozilla.org/firefox/ iphone: omdirigerer til https://www.mozilla.org/firefox/ fransk: omdirigerer til https://www.mozilla.org/firefox/ URL: http://www.facebook.com standard: omdirigerer til https://www.facebook.com/ iphone: omdirigerer til http://m.facebook.com /?refsrc=http%3A%2F%2Fwww.facebook.com%2F&_rdr Fransk: ingen omdirigering Når du utfører GET-forespørsler, kan data sendes i spørringsstrengen. For eksempel, når du søker på Google, blir søket ditt oversatt til en URL: http://www.google.com/search?q=google For å få resultatet av denne spørringen trenger du ikke engang cURL, du kan være lat og bruke "file_get_contents()". Men noen HTML-skjemaer bruker POST-metoden. I dette tilfellet sendes dataene i brødteksten i forespørselsmeldingen i stedet for i selve URL-en. La oss skrive et skript som sender POST-forespørsler. Først, la oss lage en enkel PHP-fil som vil godta disse forespørslene og returnere dataene som er sendt til den. La oss kalle det post_output.php : $url = "http://localhost/post_output.php"; $post_data = array ("foo" => "bar", "query" => "FooBar", "action" => "Send inn"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // lag en POST-forespørsel curl_setopt($ch, CURLOPT_POST, 1); // legg til data curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $output = curl_exec($ch); curl_close($ch); ekko $utgang; Dette skriptet vil gi ut: Array ( => bar => FooBar => Send inn) Dette skriptet sendte en POST-forespørsel til post_output.php-filen. som ga ut innholdet i $_POST-matrisen, og vi mottok dette svaret ved å bruke cURL. Akkurat som i forrige eksempel, la oss lage en fil som godtar forespørsler, upload_output.php : Print_r($_FILES); Og selve skriptet som laster ned filene: $url = "http://localhost/upload_output.php"; $post_data = array ("foo" => "bar", // fil for å laste opp "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); ekko $utgang; Hvis du vil laste opp en fil, er alt du trenger å gjøre å sende stien til den, akkurat som en vanlig POST-forespørselsparameter, prefikset med "@". Resultatet av manuset: Array ( => Array ( => desert.jpg => application/octet-stream => /tmp/phpAhEvXy => 0 => 845941)) En av de avanserte funksjonene til cURL i PHP er muligheten til å utføre flere forespørsler samtidig og asynkront. Under normale forhold stopper skriptet og venter på at forespørselen skal fullføres. Og hvis du trenger å utføre mange spørringer, kan det ta mye tid, fordi... du vil utføre sekvensielt. Denne begrensningen kan omgås: // opprette behandlere $ch1 = curl_init(); $ch2 = curl_init(); // sett alternativer 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); //opprett det multiple cURL-håndtaket $mh = curl_multi_init(); // legg til behandlere curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $løper = null; // execute requests do ( curl_multi_exec($mh, $running); ) while ($running > 0); // frigjør ressurser curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh); Tanken er at du kan lage flere cURL-håndtak, kombinere dem under ett multihåndtak og kjøre dem asynkront. For det første er alt det samme som med en vanlig cURL-forespørsel - en deskriptor opprettes ( curl_init()
), parametere er satt ( curl_setopt()
). Deretter opprettes en multi-descriptor ( curl_multi_init()
) og de tidligere opprettede vanlige beskrivelsene legges til ( curl_multi_add_handle()
). I stedet for å kalle curl_exec() normalt, ringer vi curl_multi_exec()
denne funksjonen informerer oss om antall aktive tilkoblinger ved å bruke den andre parameteren - $running. Derfor løper løkken til $running blir lik 0. Og, selvfølgelig, etter endt arbeid er det nødvendig å frigjøre ressurser. I dette eksemplet sender vi ganske enkelt ut resultatet av spørringene til STDOUT. La oss vurdere et ikke-trivielt tilfelle av bruk av multi cURL. Se for deg en blogg med mange innlegg som inneholder lenker til eksterne nettsteder. Noen av disse koblingene fungerer kanskje ikke. La oss skrive et skript som vil finne alle ødelagte lenker og vise dem til oss. Først må vi trekke alle eksterne lenker fra databasen: // CONFIG $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(); $active = null; // koble til MySQL if (!mysql_connect($db_host, $db_user, $db_pass)) ( die("Kunne ikke koble til: " . mysql_error()); ) if (!mysql_select_db($db_name)) ( die("Kunne ikke velg db: " . mysql_error()); ) // ta alle innlegg med lenker i teksten $q = "SELECT post_content FROM wp_posts WHERE post_content LIKE "%href=%" AND post_status = "publish" AND post_type = "post " "; $r = mysql_query($q) eller die(mysql_error()); while ($d = mysql_fetch_assoc($r)) ( // samle alle lenker ved hjelp av regulære uttrykk if (preg_match_all("/href=\"(.*?)\"/", $d["post_content"], $matches )) ( foreach ($matches som $url) ( // filtrere ut unødvendige domener $tmp = parse_url($url); if (isset($tmp["host"]) && in_array($tmp["host"], $ ekskluderte_domener)) (fortsett; ) // sette sammen $url_list = $url; ) ) ) // fjern repetisjoner $url_list = array_values(array_unique($url_list)); if (!$url_list) (die("Ingen URL å sjekke"); ) I denne delen av skriptet trekker vi rett og slett ut alle eksterne lenker fra databasen. La oss sjekke dem: $mh = curl_multi_init(); // 1. legg til lenker for ($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 "==Døde URL-er==\n"; echo implode("\n", $dead_urls) . "\n\n"; echo "==404 URLer==\n"; echo implode("\n", $not_found_urls) . "\n\n"; echo "==Fungerende URLer==\n"; echo implode("\n", $working_urls); ekko "\n\n"; // 9. legger til et håndtak med den gitte URL-funksjonen add_url_to_multi_handle($mh, $url_list) ( statisk $index = 0; // hvis det fortsatt er lenker if (isset($url_list[$index])) ( // alt er som vanlig $ ch = curl_init(); // set options curl_setopt($ch, CURLOPT_URL, $url_list[$index]); // returner i stedet for å vise resultatet curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // tillat omdirigerer curl_setopt($ ch, CURLOPT_FOLLOWLOCATION, 1); // få bare overskrifter for å spare tid curl_setopt($ch, CURLOPT_NOBODY, 1); // legg til i multi-håndtak curl_multi_add_handle($mh, $ch); $index++; ) ) La oss se på koden mer detaljert (nummereringen tilsvarer kommentarene i koden): La oss kjøre skriptet: Dead URLs== xample1234.com/ ==404 URLs== www.google.com/dsfasdfafd ==Working 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 Kontrollen tok omtrent 2 sekunder. Ved å kjøre 10 tråder samtidig, øker ytelsen 10 ganger sammenlignet med vanlige cURL-forespørsler. For å få innholdet i serversvaret, bruk funksjonen curl_multi_getcontent($ch)
, hvor $ch er en beskrivelse hentet fra curl_multi_info_read()
. Hvis HTTP-forespørselen krever autentisering, bruk følgende kode: $url = "http://www.somesite.com/members/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // send brukernavn og passord curl_setopt($ch, CURLOPT_USERPWD, "mitt brukernavn:mittpassord"); // hvis omdirigeringer er tillatt curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // cURL vil sende passordet etter omdirigeringer curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); $output = curl_exec($ch); curl_close($ch); PHP har sitt eget bibliotek for arbeid med FTP, men du kan også bruke cURL: // les filen $file = fopen("/bane/til/fil", "r"); // url inneholder allerede de nødvendige dataene $url = "ftp://brukernavn: [e-postbeskyttet]:21/path/to/new/file"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // options curl_setopt($ch, CURLOPT_UPLOAD, 1); curl_setopt($ch, CURLOPT_INFILE, $fp); curl_setopt($ch, CURLOPT_INFILESIZE, filstørrelse("/path/to/file")); curl_setopt($ch, CURLOPT_FTPASCII, 1); $output = curl_exec($ ch); curl_close($ch); Forespørsler kan gjøres gjennom en spesifikk proxy: $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"); // hvis autorisasjon kreves curl_setopt($ch, CURLOPT_PROXYUSERPWD,"bruker:pass"); $output = curl_exec($ch); curl_close($ch); Det er mulig å bruke tilbakeringinger mens forespørselen kjører, uten å vente på at den skal fullføres. For eksempel, mens serversvaret lastes ned, kan vi bruke dataene som allerede er mottatt uten å vente på fullstendig nedlasting. $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) (ekko $str; return strlen($str);) Tilbakeringingsfunksjonen må returnere lengden på strengen for at forespørselen skal fungere riktig. Hver gang neste del av serversvaret mottas, vil en tilbakeringing bli kalt. I denne artikkelen så vi på de avanserte funksjonene til cURL i PHP. Neste gang du må sende URL-forespørsler, bruk cURL. Vi må ofte laste ned ulike filer fra Internett, for eksempel kjørbare programfiler, skriptfiler, kildearkiver. Men dette trenger ikke alltid å gjøres gjennom nettleseren. I mange situasjoner er det mye lettere å utføre alle handlinger gjennom terminalen. For på denne måten kan du automatisere prosessen. På den annen side må webansvarlige fra tid til annen teste nettsidens tilgjengelighet, sjekke sendte og mottatte overskrifter og mye mer. For å løse slike problemer og problemer i et lignende område, kan du bruke krølleverktøyet. Det lar deg løse et mye bredere spekter av problemer, inkludert simulering av brukerhandlinger på nettstedet. I denne artikkelen vil vi se på hvordan du bruker curl, hva det er og hvorfor dette programmet er nødvendig. Faktisk er curl mer enn bare et kommandolinjeverktøy for Linux eller Windows. Dette er et sett med biblioteker som implementerer de grunnleggende egenskapene til å jobbe med URL-sider og overføre filer. Biblioteket støtter arbeid med protokoller: FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, LDAP, samt POP3, IMAP og SMTP. Den er flott for å simulere brukerhandlinger på sider og andre operasjoner med URL-er. Støtte for curl-biblioteket er lagt til mange forskjellige programmeringsspråk og plattformer. Curl-verktøyet er en uavhengig innpakning for dette biblioteket. Det er dette verktøyet vi vil fokusere på i denne artikkelen. Før vi går videre til en beskrivelse av hvordan curl linux-kommandoen kan brukes, la oss se på selve verktøyet og dets hovedalternativer som vi trenger. Syntaksen til verktøyet er veldig enkel: $ curl alternativer link La oss nå se på hovedalternativene: Dette er på ingen måte alle alternativene for curl linux, men det viser det grunnleggende du må bruke. Vi har dekket alt relatert til teorien om å jobbe med curl-verktøyet, nå er det på tide å gå videre til praksis og se på eksempler på curl-kommandoen. Den vanligste oppgaven er dette. Det er veldig enkelt å laste ned filen. For å gjøre dette, send bare filnavnet eller html-siden til verktøyet i parameterne: krøll https://raw.githubusercontent.com/curl/curl/master/README.md Men her venter en overraskelse på deg: hele innholdet i filen vil bli sendt til standardutdata. For å skrive den til en hvilken som helst fil bruk: curl -o readme.txt https://raw.githubusercontent.com/curl/curl/master/README.md Og hvis du vil at den resulterende filen skal hete det samme som filen på serveren, bruk -O-alternativet: curl -O https://raw.githubusercontent.com/curl/curl/master/README.md krøll -# -C - -O https://cdn.kernel.org/pub/linux/kernel/v4.x/testing/linux-4.11-rc7.tar.xz Om nødvendig kan du laste ned flere filer med én kommando: curl -O https://raw.githubusercontent.com/curl/curl/master/README.md -O https://raw.githubusercontent.com/curl/curl/master/README En annen ting som kan være nyttig for en administrator er å bare laste ned en fil hvis den er endret: curl -z 21-dese-17 https://raw.githubusercontent.com/curl/curl/master/README.md -O https://raw.githubusercontent.com/curl/curl/master/README Du kan begrense nedlastingshastigheten til den nødvendige grensen for ikke å overbelaste nettverket ved å bruke -Y-alternativet: curl --limit-rate 50K -O https://cdn.kernel.org/pub/linux/kernel/v4.x/testing/linux-4.11-rc7.tar.xz Her må du spesifisere antall kilobyte per sekund som kan lastes ned. Du kan også avslutte forbindelsen hvis hastigheten ikke er nok, bruk -Y-alternativet for å gjøre dette: curl -Y 100 -O https://raw.githubusercontent.com/curl/curl/master/README.md curl -T login.txt ftp://speedtest.tele2.net/upload/ Eller la oss sjekke at filen sendes via HTTP; det er en spesiell tjeneste for dette: curl -T ~/login.txt http://posttestserver.com/post.php I svaret vil verktøyet fortelle deg hvor du kan finne den nedlastede filen. Du kan sende ikke bare filer, men også alle data ved å bruke POST-metoden. La meg minne deg på at denne metoden brukes til å sende data i ulike former. For å sende en slik forespørsel, bruk alternativet -d. For testing vil vi bruke samme tjeneste: curl -d "field1=val&fileld2=val1"http://posttestserver.com/post.php Hvis du ikke er fornøyd med dette innsendingsalternativet, kan du late som om du sender inn skjemaet. Det er et alternativ for denne -F: curl -F "password=@pass;type=text/plain" http://posttestserver.com/post.php Her sender vi passordfeltet med skjemaet som ren tekst, på samme måte kan du sende flere parametere. Informasjonskapsler brukes av nettsteder for å lagre visse opplysninger på brukerens side. Dette kan være nødvendig for eksempel for autentisering. Du kan sende og motta informasjonskapsler ved å bruke curl. For å lagre de mottatte informasjonskapslene til en fil, bruk alternativet -c: curl -c cookie.txt http://posttestserver.com/post.php Du kan deretter sende krøll-cookien tilbake: curl -b cookie.txt http://posttestserver.com/post.php Vi trenger ikke alltid innholdet på siden. Noen ganger kan bare overskriftene være interessante. For å vise bare dem er det -I-alternativet: curl -I https://site Og alternativet -H lar deg sende flere eller flere til serveren, for eksempel kan du sende overskriften If-Modified-Since slik at siden returneres bare hvis den har blitt endret: Hvis serveren krever en av de vanlige typene autentisering, for eksempel HTTP Basic eller FTP, kan curl håndtere denne oppgaven veldig enkelt. For å spesifisere autentiseringsdetaljer, spesifiser dem ganske enkelt atskilt med et kolon i -u-alternativet: curl -u ftpuser:ftppass -T - ftp://ftp.testserver.com/myfile_1.txt Autentisering på HTTP-servere vil bli utført på samme måte. Hvis du trenger å bruke en proxy-server for å laste ned filer, så er det også veldig enkelt. Det er nok å spesifisere proxy-serveradressen i -x-alternativet: curl -x proxysever.test.com:3128 http://google.co.in I denne artikkelen så vi på hvordan du bruker curl, hvorfor dette verktøyet er nødvendig og dets hovedfunksjoner. Til tross for deres likhet med, er de veldig forskjellige. Curl linux-kommandoen er designet mer for å analysere og simulere ulike handlinger på serveren, mens wget er mer egnet for å laste ned filer og gjennomsøke nettsteder. Denne artikkelen vil snakke om et så kraftig verktøy som cURL, samt biblioteket for PHP som gir tilgang til dette verktøyet - libcurl. Hva er alt dette for noe? For å kommunisere med serveren ved hjelp av dataoverføringsprotokoller, for eksempel http eller ftp. Resten av protokollene er ikke spesielt interessante for oss; hvis noen ønsker å gå dypere inn i dette emnet, må de grave opp engelskspråklige ressurser, og denne artikkelen vil inneholde grunnleggende og eksempler på bruk. Så libcurl-biblioteket gir oss muligheten til å overføre data til serveren og motta svar fra den. Hva gir dette oss? Evnen til å etterligne brukeratferd eller ! Du kan motta innholdet på sidene for påfølgende parsing, du kan motta tjenestesvarshoder og programmere logge på nettsteder, lage skript for å legge ut meldinger (for eksempel på Twitter eller på fora) eller informasjon. Alt begrenses kun av fantasien din! Det første vi må gjøre er å installere biblioteket. På min lokale datamaskin bruker jeg Denwer-bygget, som det store flertallet av nybegynnere webmastere, som artikkelen er ment for. Erfarne brukere som uavhengig installerer php+apache+mysql-kombinasjonen vil kunne installere cURL, det er ikke for meg å forklare dem hvordan dette gjøres;) Og vi, nybegynnere, bruker ferdige løsninger for å gjøre det enklere. Installer derfor libcurl som følger: og fjern semikolon i begynnelsen av begrepene: ;extension=php_curl.dll Klar. For å sjekke funksjonaliteten til biblioteket kan du kalle opp phpinfo()-funksjonen og finne linjen der: cURL support enabled. Gratulerer med din første seier. For å begynne å jobbe med verktøyet, må det initialiseres. Dette gjøres som følger: $ch = curl_init(); Vi brukte funksjonen for initialisering av cURL-økten. I dette tilfellet kan du angi nettadressen med en gang, slik: $ch = curl_init("https://nettsted"); Og du kan gjøre dette senere, i alternativene. Rekkefølgen alternativene er installert i spiller ingen rolle. Dette gjøres av en annen funksjon: Curl_setopt (ressurs ch, strengalternativ, blandet verdi) Vi har allerede opprettet den første parameteren til denne funksjonen, det vil si ressurs ch, like ovenfor, men det er mange alternativer og verdiparametere. Jeg tror at du ikke bør kopiere og lime inn alle her, men bare gi en lenke til en detaljert beskrivelse av funksjonen, jeg håper ingen vil bli fornærmet: curl_setopt. Jeg vil gi et eksempel på innstillingsalternativer ved å bruke en URL som eksempel: $url = "https://nettsted"; curl_setopt($ch, CURLOPT_URL,$url); Et par flere eksempler på innstillingsalternativer: la oss få serverens svarhode, uten å få selve siden: Curl_setopt($ch, CURLOPT_HEADER, 1); // les overskriften curl_setopt($ch, CURLOPT_NOBODY, 1); // les KUN overskriften uten brødteksten Så vi har initialisert økten, satt parameterne vi trenger, nå utfører vi den resulterende forespørselen, lukker økten og viser resultatet: $result = curl_exec($ch); curl_close($ch); ekko $resultat; Som et resultat får vi vårt første fullt fungerende eksempel på bruk av libcurl-biblioteket: $ch = curl_init(); $url = "https://nettsted"; curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_HEADER, 1); // les overskriften curl_setopt($ch, CURLOPT_NOBODY, 1); // les KUN overskriften uten brødteksten $result = curl_exec($ch); curl_close($ch); ekko $resultat; Hvordan det fungerer, håper jeg, er klart, fordi vi så på hvert trinn separat :) Som et resultat mottar vi en HTTP-svar-header fra serveren, som vi definitivt vil analysere nedenfor for å bedre forstå alle stadier av interaksjon mellom nettleseren og serveren: HTTP/1.1 200 OK Server: nginx/1.2..php 1 Fabelaktig! Vi mottok svarhodet fra serveren og testet biblioteket i aksjon. Hvordan er dette nyttig for oss? For nå kan du omtrent forestille deg handlingssekvensen når du arbeider med cURL: For eksempel vendte jeg meg til ya.ru-siden og så på den genererte nettleserforespørselen og svaret mottatt fra serveren. Her er de: Jeg tror at etter at noen generelle punkter allerede er klare og alt ser ut til å være klart, så er det på tide å gå videre for å øve og finpusse ferdighetene dine ved å bruke eksempel. Personlig klør hendene mine alltid etter å prøve alt i praksis :) Siden cURL er så bra for parsere, la oss vurdere funksjonen for å få sidekoden etter adressen. I dette tilfellet vil utdata være en matrise med tittel, sideinnhold og til og med feilkoder hvis noe går galt. Funksjon 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); // returnerer nettsiden curl_setopt($ch, CURLOPT_HEADER, 0); // returnerer ikke overskrifter curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // følger omdirigeringer curl_setopt($ch, CURLOPT_ENCODING, ""); // prosesser alle kodinger curl_setopt($ch, CURLOPT_USERAGENT, $uagent); // useragent curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120); // tidsavbrudd for tilkobling curl_setopt($ch, CURLOPT_TIMEOUT, 120); // tidsavbrudd for respons curl_setopt($PT_MAX, CURLOPT_SETOPT) , 10); // stopp etter den 10. viderekoblingen $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;) Inndataparametere: Vi bruker funksjonen for eksempel slik: $result = get_web_page("https://ya.ru"); if (($result["errno"] != 0)||($result["http_code"] != 200)) ( echo $result["errmsg"]; ) else ( $page = $result["content) "]; ekko $side;) Alt skal gå uten feil og du vil motta sidekoden i $page-variabelen. Hvis vi prøver å få tak i den ikke-eksisterende siden yaaaaaaaaaaaa.ru, får vi feilen: Kunne ikke løse vert: yaaaaaaaaaaaa.ru; Finner ikke vert Alt er behandlet korrekt og vakkert :) JavaScript er blokkert i nettleseren din. Aktiver JavaScript for at nettstedet skal fungere! PHP støtter libcurl, et bibliotek laget av Daniel Stenberg som lar deg koble til forskjellige typer servere og protokoller. Disse funksjonene ble introdusert i PHP 4.0.2. curl_init - initialiserer en CURL-økt. ressurs curl_init() Funksjon curl_init() initialiserer en ny økt og returnerer et CURL-håndtak for bruk i , og-funksjonene. Hvis den valgfrie parameteren url er gitt, vil alternativet CURLOPT_URL motta verdien av denne parameteren. Du kan installere den manuelt ved å bruke . curl_setopt - setter alternativer for CURL-overføring/overføring. bool curl_setopt(ressurs ch, strengalternativ, blandet verdi) Funksjon curl_setopt() setter alternativer for CURL-sesjonen identifisert av parameteren kap. Parameter alternativ er alternativet du vil angi, og verdi dette er opsjonsverdien alternativ . Parameter verdi må være lang for følgende alternativer (spesifisert av parameter alternativ): Parameter verdi må være en streng for følgende parameterverdier alternativ : Følgende alternativer forventer en filbeskrivelse, som er hentet ved hjelp av funksjonen fopen() : Parameter verdi long write_callback (ressurs ch, strengdata)( ... return strlen($data);) alternativ : Parameter verdi skal være en funksjon av følgende form streng read_callback (ressurs ch, ressurs fd, lang lengde)() for følgende parameterverdier alternativ : curl_exec - utfører en CURL-økt. bool curl_exec(ressurs ch) Denne funksjonen skal kalles opp etter at du har initialisert en CURL-sesjon og alle alternativer for den økten allerede er satt. Hensikten er ganske enkelt å utføre en forhåndsdefinert CURL-sesjon (spesifisert i parameteren kap). curl_close - lukker CURL-økten. tomrom curl_close(ressurs ch) Denne funksjonen lukker CURL-sesjonen og frigjør alle ressurser. CURL håndtak kap er også slettet. curl_errno - returnerer et heltall som inneholder det siste feilnummeret. Hvis du trenger å sende en flerdimensjonal matrise og en fil i en POST-forespørsel, vil du støte på et uløselig problem. Hvis du sender en flerdimensjonal matrise til CURLOPT_POSTFIELDS, vil det andre nivået bli sendt som strengen "Array". Hvis du konverterer ved hjelp av http_build_query, vil du ikke kunne overføre filen. Nedenfor er en funksjon for koding av en todimensjonal matrise med fillasting for Curl, som vil fungere i både eldre versjoner av PHP 5.3, PHP 5.4 og PHP 5.6 /** konverterer en flerdimensjonal matrise til en endimensjonal matrise ved hjelp av komplekse indekser og erstatter @ i prefikset med CurlFile for bruk i Curl * @param $inputArray * @param string $inputKey * @return array $requestVars = array ("id" => array( 1, 2,"id"=>1234), "navn" => "logg", "loggfil" => "@/tmp/test.log"); vi får: ["id"]=> int(1) ["id"]=> int(2) ["id"]=> int(1234) ["navn"]=> streng(3) "logg" [ "logfile"]=> string(13) "/tmp/test.log" ) */ funksjon convertToStringArray($inputArray, $inputKey="") ( $resultArray=; foreach ($inputArray som $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 ] = $verdi; ) ) returner $resultArray; ) // sjekk $requestVars = array("id" => array(1, 2,"id"=>1234), "name" => "logg", "logfile" " => "@/tmp/test.log"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "side"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, convertToStringArray($requestVars)); $res = curl_exec($ch); curl_close($ch); Applikasjonseksempler på bruk av Curl
$ch = curl_init();
print_r($_POST);
print_r($_FILES);
*/
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
?>
Notater
Hvorfor cURL?
Grunnleggende om cUrl
// 1. initialisering $ch = curl_init(); // 2. angi alternativer, inkludert URL curl_setopt($ch, CURLOPT_URL, "http://www.google.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); // 3. utfører forespørselen og mottar svaret $output = curl_exec($ch); // 4. renseressurser curl_close($ch); Feilsporing
Få informasjon om en forespørsel
Omdirigeringssporing, avhengig av nettleseren
Sender POST-forespørsler
Laster opp filer
Multi curL
Sjekke eksterne lenker i WordPress
Andre cURL-funksjoner i PHP
HTTP-autentisering
Last opp via FTP
Ved hjelp av en proxy
Tilbakeringingsfunksjoner
Konklusjon
curl kommando
Hvordan bruke curl?
Fartsgrense
Overføring av filer
Sender POST-data
Sende og motta informasjonskapsler
Header overføring og analyse
krøll-autentisering
Ved hjelp av en proxy
konklusjoner
Hva er egentlig cURL og libcurl? Generelle punkter
Installerer cURL på Denwer (Denver). Hvordan begynne å bruke libcurl?
Beskrivelse av cURL og første trinn
HTTP-forespørselshodestruktur
Be om
GET / HTTP/1.1 - Vi prøver å få siden på /, det vil si hovedsiden som ligger i roten til mappen. Vi bruker protokollversjon 1.1.
Brukeragent: Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Versjon/12.14— Vi presenterer oss for serveren, vi er Opera-nettleseren.
Vert: ya.ru — Domenenavnet til den forespurte ressursen.
Godta: 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 over akseptable ressursformater.
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8— Liste over støttede språk.
Godta-koding: gzip, deflate— Støttede kodingsmetoder.
Cookie: yandexuid=ХХХХХ - Informasjonskapsler, om nødvendig.
Tilkobling: Keep-Alive - Vennligst ikke bryt forbindelsen og hold kontakten.
Svar
HTTP/1.1 200 Ok - Vi mottar et svar med kode 200, som betyr at alt er OK.
Server: nginx - Serveren introduserte seg selv - dette er nginx.
Dato: søn 10. mars 2013 14:10:50 GMT— Gjeldende dato og klokkeslett på serveren.
Innholdstype: tekst/html; charset=UTF-8— Innholdstype og koding.
Tilkobling: lukk - Serveren ønsker ikke å opprettholde en permanent forbindelse med oss, så den stenger den umiddelbart. En ny tilkobling opprettes for neste forespørsel.
Cache-Control: no-cache,no-store,max-age=0,must-revalidate— Cachinghåndtering. I dette tilfellet er den deaktivert.
Utløper: Søn, 10. mars 2013 14:10:50 GMT— Dato for forventet utløp av økten. I vårt tilfelle faller det sammen med åpningstiden, siden serveren umiddelbart lukket den, umiddelbart etter behandling.
Sist endret: søn, 10. mars 2013 14:10:50 GMT— Tidspunkt for siste endring.
Innholdskoding: gzip — Metode for koding av informasjon.
En fullstendig liste over alle parametere som kan finnes i HTTP-forespørselshodet finner du på Wikipedia.
Nå har du en grov ide om hvordan nettleseren og nettserveren din kommuniserer med hverandre. Dette er veldig nyttig å vite og forstå, fordi vi vil prøve å etterligne nettleserhandlinger ved å bruke libcurl-biblioteket. Gå videre.Eksempel på arbeid med biblioteket
url — side eller nettstedsadresse.
Utdataparameterverdier (matrise med tre elementer):
header['errno'] - hvis noe gikk galt, vil det være en feilkode her.
header['errmsg'] – feilteksten vises her.
header['innhold'] - selve siden\filen\bilde osv.
Deretter kan du gjøre hva du vil med sidekoden, for eksempel analysere den med regulære uttrykk. Men det er alt i de neste leksjonene, men la oss nå stoppe ved dette.Krøll
libcurl støtter for øyeblikket http, https, ftp, gopher, telnet, dict, fil og ldap-protokoller.
libcurl støtter også HTTPS-sertifikater, HTTP POST, HTTP PUT, FTP-opplasting (dette kan også gjøres med ftp PHP-utvidelsen), HTTP-skjemabasert opplasting, proxyer, informasjonskapsler og bruker+passordautentisering.curl_init
Beskrivelse
curl_setopt
Beskrivelse
curl_exec
Beskrivelse
curl_close
Beskrivelse
curl_errno
Beskrivelse
Eksempel 1: Initialisere en ny CURL-økt og hente en nettside.
Eksempel 2: Bruk av PHPs CURL-modul for å få example.com
Eksempel 3: Sjekke URL-tilgjengelighet ved å bruke PHPs CURL
Eksempel 4: Separering av overskriften fra hovedteksten oppnådd ved bruk av PHPs CURL
Eksempel 5: Bestemme en henvisnings-URL ved å bruke PHPs CURL
problemet: curl_setopt($ch,FOLLOW_LOCATION,1); feilen: problemer med open_basedir og safe_mode løsningen: en funksjon som allerede er utviklet av noen løsningen n 2: samme funksjon, modifisert, fungerer utmerket for meg..= $curl_max_loops) ( $curl_loops = 0; return FALSE; ) curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, sant); $data = curl_exec($ch); list($header, $data) = eksplodere("\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))); hvis (!$url) ( //kunne ikke behandle url for å omdirigere til $curl_loops = 0; return $data; ) $last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL)) ; if (!$url["schema"]) $url["scheme"] = $last_url["skjema"]; if (!$url["host"]) $url["host"] = $last_url[ "host"]; if (!$url["path"]) $url["path"] = $last_url["path"]; $new_url = $url["skjema"] . "://" . $ url["host"] . $url["path"] . ($url["query"]?"?".$url["query"]:""); curl_setopt($ch, CURLOPT_URL, $new_url) ; debug("Omdirigerer til", $new_url); return curl_redir_exec($ch); ) else ( $curl_loops=0; return $data; ) ) ?>
bare bruk denne funksjonen uten de FOLLOW_LOCATION og bør fungere. problemet var at når du kommer til linjen der du returnerer dataene hvis http_code var annerledes enn 301 oe 302, har $data foreldet informasjon eller ingen. så $debbbb gjør jobben. Eksempel 6: Parsing av en informasjonskapsel fra overskriften ved hjelp av CURL PHP
Noen ganger kan du ikke bruke CURLOPT_COOKIEJAR og CURLOPT_COOKIEFILE på grunn av serverens php-innstillinger (De sier at du kan hente filer fra serveren ved å bruke disse alternativene). Her er løsningen 1)Ikke bruk CURLOPT_FOLLOWLOCATION 2)Bruk curl_setopt($ch, CURLOPT_HEADER, 1) 3) Ta fra overskriften cookies slik: preg_match_all("|Set-Cookie: (.*);|U", $content, $results); $cookies = implode(";", $resultater); 4)Sett dem med curl_setopt($ch, CURLOPT_COOKIE, $cookies); Eksempel 7: Parsing av en informasjonskapsel fra overskriften ved hjelp av CURL PHP
Som Yevgen nevnte tidligere kan vi noen ganger ikke bruke CURLOPT_COOKIEJAR og CURLOPT_COOKIEFILE. Nedenfor er en header-tilbakeringingsfunksjon jeg skrev tilbake i januar som lar deg vedlikeholde informasjonskapsler mellom cURL-forespørsler. Informasjonskapsler legges til $ch under alle forespørsler selv under omdirigering, slik at du kan bruk den sammen med CURLOPT_FOLLOWLOCATION. Her er koden: funksjon read_header($ch, $string) ( global $location; #hold oversikt over plassering/omdirigeringer global $cookiearr; #lagre informasjonskapsler her global $ch; # ^overstyrer funksjonen param $ch # dette er greit fordi vi må # oppdatere den globale $ch med # nye informasjonskapsler $length = strlen($string); if(!strncmp($string, "Location:", 9)) ( #hold styr på siste omdirigering $location = trim(substr($string, 9, -1)); ) if(!strncmp($string, "Set-Cookie:", 11)) ( #hent informasjonskapselen $cookiestr = trim(substr( $streng, 11, -1)); $cookie = explode(";", $cookiestr); $cookie = explode("=", $cookie); $cookiename = trim(array_shift($cookie)); $cookiearr [$cookiename] = trim(implode("=", $cookie)); ) $cookie = ""; if(trim($string) == "") ( #execute bare på slutten av header foreach ($cookiearr som $key=>$value) ($cookie .= "$key=$value; "; ) curl_setopt ($ ch, CURLOPT_COOKIE, $cookie); ) returner $lengde; ) curl_setopt($ch, CURLOPT_HEADERFUNCTION, "read_header"); Denne koden forutsetter at du vil gjenbruke $ch uten å initialisere den hver gang (kall curl_init bare én gang, i begynnelsen). Hvis du trenger å initialisere $ch på nytt når som helst i koden din, kan du få tilgang til de lagrede informasjonskapslene i $cookiearr og inkludere dem i den nye $ch. Jeg skrev denne funksjonen før jeg hadde nok erfaring med regulære uttrykk slik at du ikke finner noen preg_match-kall her. Jeg har brukt denne koden en god stund og uten problemer med å få tilgang til gmail, yahoo, hotmail, aol osv. hvor jeg måtte gå gjennom pålogging og noen få sider før du kommer til det jeg lette etter. Eksempel 8: Sette opp en header load handler med CURL PHP
Ved å bruke cURL måtte jeg ringe et tredjepartsskript som returnerte binære data som vedlegg for å videresende hentede data igjen som vedlegg. Problemet var at tredjepartsskriptet av og til returnerte HTTP-feil, og jeg ønsket å unngå å sende videre vedlegg med null lengde i slike tilfeller. Kombinasjon av bruk av CURLOPT_FAILONERROR og CURLOPT_HEADERFUNCTION tilbakeringing bidro til å behandle tredjepartsskriptets HTTP-feil pent: function curlHeaderCallback($resURL, $strHeader) ( if (preg_match("/^HTTP/i", $strHeader)) ( header($strHeader) ); header("Innholdsdisposisjon: vedlegg; filnavn="filnavn.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) ( skriv ut "Feil med kode: " . $intReturnCode; ) Eksempel 9. Lagre en side til en fil og beregne overføringshastigheten ved hjelp av CURL PHP
WritePageToFile("http://es.php.net", "es.php.net.txt"); funksjon 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); ekko " "; echo "Average speed download == " . $sAverageSpeedDownload . "
"; curl_close($sh); FClukk ($hFile); ekko "( Se filen "".$sTxtfile."" i samme bane til hosting." " til hvor dette skriptet PHP).
"; echo "Average Speed upload == " . $sAverageSpeedUpload ."
"; ekko "
"; $aCURLinfo = curl_getInfo($sh); print_r($aCURLinfo); echo "
";
}
Eksempel 9. Motta en side via en SSL-tilkobling (https)
$ch=curl_init("https://nettsted"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Deaktiver feilen "SSL-sertifikatproblem, bekreft at CA-sertifikatet er OK" curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // Deaktiver feilen "SSL: sertifikatemnets navn "vertsnavn.ru" samsvarer ikke med målvertsnavnet "123.123"" 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); Eksempel 10: Bruk av økter og informasjonskapsler i curl
$cookie_filename=sys_get_temp_dir()+"/cookie.tmp"; $curl=curl_init("http://nettsted"); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_filename);//lagre mottatte COOKIES til en fil curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_filename); //send til serveren COOKIE-ene mottok fra den under autorisasjonen $out=curl_exec($curl); Eksempel 11: Filopplasting og flerdimensjonal array i Curl. CURLOPT_POSTFIELDS + CurlFile