Curl käyttö. Web-tiedostojen siirtäminen komentoriviltä. CURL-esimerkki - etäkomentosarjan kutsuminen ja tuloksen saaminen

cURL on erikoistyökalu, joka on suunniteltu siirtämään tiedostoja ja tietoja URL-syntaksin avulla. Tämä tekniikka tukee monia protokollia, kuten HTTP, FTP, TELNET ja monia muita. cURL suunniteltiin alun perin komentorivityökaluksi. Onneksi cURL-kirjastoa tukee PHP-ohjelmointikieli. Tässä artikkelissa tarkastelemme joitain cURL:n edistyneitä toimintoja ja käsittelemme myös hankitun tiedon käytännön soveltamista PHP:n avulla.

Miksi cURL?

Itse asiassa on olemassa useita vaihtoehtoisia tapoja kokeilla verkkosivujen sisältöä. Useissa tapauksissa, pääasiassa laiskuuden vuoksi, käytin yksinkertaisia ​​PHP-funktioita cURL:n sijaan:

$sisältö = file_get_contents("http://www.nettuts.com"); // tai $linjat = tiedosto("http://www.nettuts.com"); // tai readfile("http://www.nettuts.com");

Näillä toiminnoilla ei kuitenkaan ole käytännössä mitään joustavuutta, ja niissä on valtava määrä puutteita virheiden käsittelyssä jne. Lisäksi on tiettyjä tehtäviä, joita et yksinkertaisesti voi suorittaa näillä vakioominaisuuksilla: evästeiden vuorovaikutus, todennus, lomakkeiden lähettäminen, tiedostojen lataaminen jne.

cURL on tehokas kirjasto, joka tukee monia erilaisia ​​protokollia, vaihtoehtoja ja tarjoaa yksityiskohtaista tietoa URL-pyynnöistä.

Perusrakenne

  • Alustus
  • Parametrien antaminen
  • Toteutus ja hakutulos
  • Vapauttaa muistia

// 1. alustus $ch = curl_init(); // 2. määritä parametrit, mukaan lukien url curl_setopt($ch, CURLOPT_URL, "http://www.nettuts.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); // 3. saa tulokseksi HTML:n $output = curl_exec($ch); // 4. sulje yhteys curl_close($ch);

Vaihe 2 (eli kutsuminen curl_setopt()) käsitellään tässä artikkelissa paljon enemmän kuin kaikkia muita vaiheita, koska Tässä vaiheessa tapahtuu kaikki mielenkiintoisimmat ja hyödyllisimmät asiat, jotka sinun on tiedettävä. cURL:ssä on valtava määrä erilaisia ​​vaihtoehtoja, jotka on määritettävä, jotta URL-pyyntö voidaan määrittää huolellisimmalla tavalla. Emme käsittele koko luetteloa, vaan keskitymme vain siihen, mitä pidän tarpeellisena ja hyödyllisenä tässä oppitunnissa. Voit opiskella kaikkea muuta itse, jos tämä aihe kiinnostaa sinua.

Virheen tarkistus

Lisäksi voit myös käyttää ehdollisia lausekkeita testataksesi, onko toiminto suoritettu onnistuneesti:

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

Tässä pyydän teitä huomioimaan erittäin tärkeän asian: meidän on käytettävä "=== false" vertailuun "== false" sijaan. Niille, jotka eivät ole perillä, tämä auttaa meitä erottamaan tyhjän tuloksen loogisen arvon false, mikä osoittaa virheen.

Tietojen vastaanottaminen

Toinen lisävaihe on hankkia tietoja cURL-pyynnöstä sen suorittamisen jälkeen.

// ... curl_exec($ch); $info = curl_getinfo($ch); echo "Oti". $info["total_time"] . "sekuntia url:lle". $info["url"]; //...

Palautettu taulukko sisältää seuraavat tiedot:

  • "url"
  • "sisältötyyppi"
  • "http_koodi"
  • "header_size"
  • "request_size"
  • "tiedostoaika"
  • "ssl_verify_result"
  • "uudelleenohjausmäärä"
  • "koko_aika"
  • "namelookup_time"
  • "yhteysaika"
  • "pretransfer_time"
  • "size_upload"
  • "size_download"
  • "nopeus_lataus"
  • "speed_upload"
  • "lataussisällön_pituus"
  • "upload_content_length"
  • "starttransfer_time"
  • "uudelleenohjausaika"

Uudelleenohjauksen tunnistus selaimesta riippuen

Tässä ensimmäisessä esimerkissä kirjoitamme koodin, joka voi havaita URL-uudelleenohjaukset eri selainasetusten perusteella. Esimerkiksi jotkut verkkosivustot ohjaavat uudelleen matkapuhelimen tai minkä tahansa muun laitteen selaimia.

Aiomme käyttää CURLOPT_HTTPHEADER-vaihtoehtoa lähtevien HTTP-otsikoiden määrittämiseen, mukaan lukien käyttäjän selaimen nimi ja käytettävissä olevat kielet. Lopulta voimme määrittää, mitkä sivustot uudelleenohjaavat meidät eri URL-osoitteisiin.

// testaa URL-osoite $urls = array("http://www.cnn.com", "http://www.mozilla.com", "http://www.facebook.com"); // selaimien testaus $selaimet = 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 kuten Mac OS X; fi) AppleWebKit/420+ (KHTML, kuten Gecko) Version/3.0 Mobile/1A537a Safari/419.3", "language" => "en"), "french" => array ("user_agent"); => "Mozilla/4.0 (yhteensopiva; MSIE 7.0; Windows NT 5.1; GTB6; .NET CLR 2.0.50727)", "kieli" => "fr,fr-FR;q=0.5")); foreach ($urls muodossa $url) ( echo "URL: $url\n"; foreach ($selaimet muodossa $test_name => $browser) ( $ch = curl_init(); // määritä url curl_setopt($ch, CURLOPT_URL , $url); // määritä selaimen otsikot curl_setopt($ch, CURLOPT_HTTPHEADER, array("User-Agent: ($browser["user_agent"])", "Accept-Language: ($browser["kieli"] )" )); // emme tarvitse sivun sisältöä curl_setopt($ch, CURLOPT_NOBODY, 1); // meidän täytyy saada HTTP-otsikot curl_setopt($ch, CURLOPT_HEADER, 1); // palauttaa tulokset tulosteen sijaan curl_setopt($ch, CURLOPT_RETURNTRANSFER, $output = curl_exec($ch) // oliko HTTP-uudelleenohjaus if ("!Location: (.*)!"); , $matches) ( echo " $testin_nimi: uudelleenohjaa kohteeseen $matches\n"; ) else ( echo "$test_name: ei uudelleenohjausta\n"; ) ) echo "\n\n" )

Ensin määritämme luettelon tarkistettavien sivustojen URL-osoitteista. Tarkemmin sanottuna tarvitsemme näiden sivustojen osoitteet. Seuraavaksi meidän on määritettävä selaimen asetukset jokaisen URL-osoitteen testaamiseksi. Tämän jälkeen käytämme silmukkaa, jossa käymme läpi kaikki saadut tulokset.

Temppu, jota käytämme tässä esimerkissä cURL-asetusten asettamiseen, antaa meille mahdollisuuden saada sivun sisällön sijaan vain HTTP-otsikot (tallennettuina $outputiin). Seuraavaksi yksinkertaisen säännöllisen lausekkeen avulla voimme määrittää, oliko merkkijono "Location:" vastaanotetuissa otsikoissa.

Kun suoritat tämän koodin, sinun pitäisi saada jotain tällaista:

POST-pyynnön luominen tiettyyn URL-osoitteeseen

GET-pyyntöä muodostettaessa lähetetyt tiedot voidaan välittää URL-osoitteeseen "kyselymerkkijonon" kautta. Esimerkiksi kun teet Google-haun, hakutermi sijoitetaan uuden URL-osoitteen osoitepalkkiin:

Http://www.google.com/search?q=ruseller

Sinun ei tarvitse käyttää cURL-osoitetta simuloidaksesi tätä pyyntöä. Jos laiskuus voittaa sinut kokonaan, käytä "file_get_contents()"-funktiota saadaksesi tuloksen.

Mutta asia on, että jotkut HTML-lomakkeet lähettävät POST-pyyntöjä. Näiden lomakkeiden tiedot kuljetetaan HTTP-pyynnön rungon kautta, ei kuten edellisessä tapauksessa. Jos esimerkiksi täytit lomakkeen foorumilla ja napsautit hakupainiketta, sinulle tehdään todennäköisesti POST-pyyntö:

Http://codeigniter.com/forums/do_search/

Voimme kirjoittaa PHP-skriptin, joka voi simuloida tällaista URL-pyyntöä. Luodaan ensin yksinkertainen tiedosto POST-tietojen hyväksymiseksi ja näyttämiseksi. Kutsutaan sitä post_output.php:ksi:

Tulosta_r($_POST);

Sitten luomme PHP-skriptin cURL-pyynnön tekemiseksi:

$url = "http://localhost/post_output.php"; $post_data = array ("foo" => "bar", "query" => "Nettuts", "action" => "Lähetä"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // osoittavat, että meillä on POST-pyyntö curl_setopt($ch, CURLOPT_POST, 1); // lisää muuttujat curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $tulostus = curl_exec($ch); curl_close($ch); echo $lähtö;

Kun suoritat tämän skriptin, sinun pitäisi saada tällainen tulos:

Siten POST-pyyntö lähetettiin post_output.php-skriptille, joka puolestaan ​​tulostaa superglobaalin $_POST-taulukon, jonka sisällön saimme käyttämällä cURL-osoitetta.

Tiedostoa ladataan

Luodaan ensin tiedosto sen luomiseksi ja lähettämiseksi upload_output.php-tiedostoon:

Tulosta_r($_FILES);

Ja tässä on komentosarjakoodi, joka suorittaa yllä olevan toiminnon:

$url = "http://localhost/upload_output.php"; $post_data = array ("foo" => "bar", // ladattava tiedosto "upload" => "@C:/wamp/www/test.zip"); $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); $tulostus = curl_exec($ch); curl_close($ch); echo $lähtö;

Kun haluat ladata tiedoston, sinun tarvitsee vain välittää se tavallisena viestimuuttujana, jota edeltää @-symboli. Kun suoritat kirjoitetun skriptin, saat seuraavan tuloksen:

Useita cURL

Yksi cURL:n suurimmista vahvuuksista on kyky luoda "useita" cURL-käsittelijöitä. Tämän avulla voit avata yhteyden useisiin URL-osoitteisiin samanaikaisesti ja asynkronisesti.

Klassisessa cURL-pyynnön versiossa komentosarjan suoritus keskeytetään ja odottaa pyynnön URL-toiminnon valmistumista, minkä jälkeen komentosarja voi jatkua. Jos aiot olla vuorovaikutuksessa kokonaisen joukon URL-osoitteita, tämä johtaa melko merkittävään aikainvestointiin, koska klassisessa versiossa voit työskennellä vain yhden URL-osoitteen kanssa kerrallaan. Voimme kuitenkin korjata tämän tilanteen käyttämällä erikoiskäsittelijöitä.

Katsotaanpa esimerkkikoodia, jonka otin php.net:stä:

// luoda useita cURL-resursseja $ch1 = curl_init(); $ch2 = curl_init(); // määritä URL-osoite ja muut parametrit 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); //luo usean cURL-käsittelijän $mh = curl_multi_init(); //lisää useita käsittelijöitä curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $aktiivinen = null; //suorita do ( $mrc ​​​​= curl_multi_exec($mh, $active); ) while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($active && $mrc ​​​​== CURLM_OK) ( if (curl_multi_select($mh) != -1) ( do ( $mrc ​​​​= curl_multi_exec($mh, $active); ) while ($mrc == CURLM_CALL_MULTI_PERFORM); ) ) //closing curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh);

Ajatuksena on, että voit käyttää useita cURL-käsittelijöitä. Yksinkertaisen silmukan avulla voit seurata, mitä pyyntöjä ei ole vielä suoritettu.

Tässä esimerkissä on kaksi pääsilmukkaa. Ensimmäinen do-while-silmukka kutsuu curl_multi_exec(). Tätä toimintoa ei voi estää. Se toimii niin nopeasti kuin mahdollista ja palauttaa pyynnön tilan. Niin kauan kuin palautettu arvo on vakio CURLM_CALL_MULTI_PERFORM, tämä tarkoittaa, että työ ei ole vielä valmis (esimerkiksi http-otsikoita lähetetään parhaillaan URL-osoitteeseen); Siksi tarkistamme tämän palautusarvon, kunnes saamme erilaisen tuloksen.

Seuraavassa silmukassa tarkistamme ehdon, kun muuttuja $active = "true". Se on curl_multi_exec()-funktion toinen parametri. Tämän muuttujan arvo on "true" niin kauan kuin jokin olemassa olevista muutoksista on aktiivinen. Seuraavaksi kutsumme curl_multi_select()-funktiota. Sen suoritus on "estetty", kun vähintään yksi aktiivinen yhteys on olemassa, kunnes vastaus saadaan. Kun näin tapahtuu, palaamme pääsilmukkaan jatkaaksemme kyselyjen suorittamista.

Sovelletaan nyt tätä tietoa esimerkkiin, joka on todella hyödyllinen suurelle joukolle ihmisiä.

Linkkien tarkistaminen WordPressissä

Kuvittele blogi, jossa on valtava määrä viestejä ja viestejä, joista jokainen sisältää linkkejä ulkoisiin Internet-resursseihin. Jotkut näistä linkeistä saattavat olla jo kuolleet eri syistä. Sivu on ehkä poistettu tai sivusto ei ehkä toimi ollenkaan.

Aiomme luoda skriptin, joka analysoi kaikki linkit ja löytää lataamattomat verkkosivustot ja 404-sivut, ja toimittaa sitten meille yksityiskohtaisen raportin.

Sanon heti, että tämä ei ole esimerkki WordPressin laajennuksen luomisesta. Tämä on ehdottomasti hyvä testausalusta testeillemme.

Aloitetaan vihdoin. Ensin meidän on noudettava kaikki linkit tietokannasta:

// määritys $db_host = "localhost"; $db_user = "juuri"; $db_pass = ""; $db_name = "wordpress"; $poissuljetut_verkkotunnukset = array("paikallinen isäntä", "www.omaverkkotunnus.com"); $max_yhteydet = 10; // muuttujien alustus $url_list = array(); $työskentely_urls = array(); $dead_urls = array(); $not_found_urls = array(); $aktiivinen = null; // muodosta yhteys MySQL:ään if (!mysql_connect($db_host, $db_user, $db_pass)) ( die("Ei voitu muodostaa yhteyttä: " . mysql_error()); ) if (!mysql_select_db($db_name)) ( die("Voisi not select db: " . mysql_error()); ) // valitse kaikki julkaistut viestit, joissa on linkkejä $q = "VALITSE post_content FROM wp_posts WHERE post_content LIKE "%href=%" AND post_status = "publish" AND post_type = "post " "; $r = mysql_query($q) tai kuole(mysql_error()); while ($d = mysql_fetch_assoc($r)) ( // hae linkit säännöllisillä lausekkeilla if (preg_match_all("!href=\"(.*?)\"!", $d["post_content"], $ vastaa) ) ( foreach ($vastaa kuin $url) ( $tmp = jäsennys_url($url); if (in_array($tmp["isäntä"], $poissuljetut_domains)) ( jatka; ) $url_list = $url; ) ) ) / / poista kaksoiskappaleet $url_list = array_values(array_unique($url_list)); if (!$url_list) ( die("Ei tarkistettavaa URL-osoitetta"); )

Ensin luomme konfigurointitiedot tietokannan kanssa vuorovaikutusta varten, sitten kirjoitamme luettelon verkkotunnuksista, jotka eivät osallistu tarkistukseen ($excluded_domains). Määritämme myös luvun, joka kuvaa skriptissämme käyttämiemme samanaikaisten yhteyksien enimmäismäärää ($max_connections). Liitymme sitten tietokantaan, valitsemme linkit sisältävät viestit ja keräämme ne taulukkoon ($url_list).

Seuraava koodi on hieman monimutkainen, joten käy se läpi alusta loppuun:

// 1. usean käsittelijän $mh = curl_multi_init(); // 2. lisää joukko URL-osoitteita kohteelle ($i = 0; $i< $max_connections; $i++) { add_url_to_multi_handle($mh, $url_list); } // 3. инициализация выполнения do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); // 4. основной цикл while ($active && $mrc == CURLM_OK) { // 5. если всё прошло успешно if (curl_multi_select($mh) != -1) { // 6. делаем дело do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); // 7. если есть инфа? if ($mhinfo = curl_multi_info_read($mh)) { // это значит, что запрос завершился // 8. извлекаем инфу $chinfo = curl_getinfo($mhinfo["handle"]); // 9. мёртвая ссылка? if (!$chinfo["http_code"]) { $dead_urls = $chinfo["url"]; // 10. 404? } else if ($chinfo["http_code"] == 404) { $not_found_urls = $chinfo["url"]; // 11. рабочая } else { $working_urls = $chinfo["url"]; } // 12. чистим за собой curl_multi_remove_handle($mh, $mhinfo["handle"]); // в случае зацикливания, закомментируйте данный вызов curl_close($mhinfo["handle"]); // 13. добавляем новый url и продолжаем работу if (add_url_to_multi_handle($mh, $url_list)) { do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } } } // 14. завершение curl_multi_close($mh); echo "==Dead URLs==\n"; echo implode("\n",$dead_urls) . "\n\n"; echo "==404 URLs==\n"; echo implode("\n",$not_found_urls) . "\n\n"; echo "==Working URLs==\n"; echo implode("\n",$working_urls); function add_url_to_multi_handle($mh, $url_list) { static $index = 0; // если у нас есть ещё url, которые нужно достать if ($url_list[$index]) { // новый curl обработчик $ch = curl_init(); // указываем url curl_setopt($ch, CURLOPT_URL, $url_list[$index]); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_NOBODY, 1); curl_multi_add_handle($mh, $ch); // переходим на следующий url $index++; return true; } else { // добавление новых URL завершено return false; } }

Täällä yritän selittää kaiken yksityiskohtaisesti. Listan numerot vastaavat kommentissa olevia numeroita.

  1. 1. Luo useita käsittelijöitä;
  2. 2. Kirjoitamme add_url_to_multi_handle()-funktion hieman myöhemmin. Joka kerta kun sitä kutsutaan, uuden URL-osoitteen käsittely alkaa. Aluksi lisäämme 10 ($max_connections) URL-osoitetta;
  3. 3. Aloita suorittamalla curl_multi_exec()-funktio. Niin kauan kuin se palauttaa CURLM_CALL_MULTI_PERFORM, meillä on vielä tekemistä. Tarvitsemme tätä pääasiassa yhteyksien luomiseen;
  4. 4. Seuraavaksi tulee pääsilmukka, joka toimii niin kauan kuin meillä on vähintään yksi aktiivinen yhteys;
  5. 5. curl_multi_select() jumiutuu odottamaan URL-haun valmistumista;
  6. 6. Jälleen kerran meidän on saatava cURL tehdäksemme työtä, nimittäin noutaaksemme palautusvastaustiedot;
  7. 7. Tiedot tarkistetaan tästä. Pyynnön suorittamisen seurauksena taulukko palautetaan;
  8. 8. Palautettu taulukko sisältää cURL-käsittelijän. Käytämme sitä valitaksemme tiedot erillisestä cURL-pyynnöstä;
  9. 9. Jos linkki oli kuollut tai komentosarja aikakatkaistiin, meidän ei pitäisi etsiä http-koodia;
  10. 10. Jos linkki palautti meille 404-sivun, http-koodi sisältää arvon 404;
  11. 11. Muuten meillä on toimiva linkki edessämme. (Voit lisätä virhekoodin 500 tarkistuksia jne...);
  12. 12. Seuraavaksi poistamme cURL-käsittelijän, koska emme enää tarvitse sitä;
  13. 13. Nyt voimme lisätä toisen URL-osoitteen ja suorittaa kaiken, mistä puhuimme aiemmin;
  14. 14. Tässä vaiheessa skripti suorittaa työnsä. Voimme poistaa kaiken tarpeettoman ja luoda raportin;
  15. 15. Lopuksi kirjoitamme funktion, joka lisää url:n käsittelijään. Staattista muuttujaa $index kasvatetaan aina, kun tätä funktiota kutsutaan.

Käytin tätä kirjoitusta blogissani (joitakin rikkinäisiä linkkejä, jotka lisäsin tarkoituksella testatakseni sitä) ja sain seuraavan tuloksen:

Minun tapauksessani skriptillä kesti hieman alle 2 sekuntia indeksoida 40 URL-osoitetta. Suorituskyvyn kasvu on merkittävää, kun työskentelet entistä useamman URL-osoitteen kanssa. Jos avaat kymmenen yhteyttä samanaikaisesti, komentosarja voi suorittaa kymmenen kertaa nopeammin.

Muutama sana muista hyödyllisistä cURL-vaihtoehdoista

HTTP-todennus

Jos URL-osoitteessa on HTTP-todennus, voit helposti käyttää seuraavaa komentosarjaa:

$url = "http://www.jokusivusto.fi/jäsenet/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // määritä käyttäjätunnus ja salasana curl_setopt($ch, CURLOPT_USERPWD, "omakäyttäjänimi:omasalasana"); // jos uudelleenohjaus on sallittu curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // sitten tallenna tietomme hakemistoon cURL curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); $tulostus = curl_exec($ch); curl_close($ch);

FTP-lataus

PHP:llä on myös kirjasto FTP-työskentelyä varten, mutta mikään ei estä sinua käyttämästä cURL-työkaluja täällä:

// avaa tiedosto $tiedosto = fopen("/polku/tiedostoon", "r"); // URL-osoitteen tulee sisältää seuraava sisältö $url = "ftp://käyttäjänimi: [sähköposti suojattu]:21/polku/uuteen/tiedostoon"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_UPLOAD, 1); curl_setopt($ch, CURLOPT_INFILE, $fp curl_setopt($ch, CURLOPT_INFILESIZE, file size("/polku/tiedostoon") // määritä ASCII-muoto curl_setopt($ch, CURLOPT_FTPASCII, 1); ); curl_close($ch);

Välityspalvelimen käyttäminen

Voit suorittaa URL-pyynnön välityspalvelimen kautta:

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://www.example.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // määritä osoite curl_setopt($ch, CURLOPT_PROXY, "11.11.11.11:8080"); // jos sinun on annettava käyttäjätunnus ja salasana curl_setopt($ch, CURLOPT_PROXYUSERPWD,"user:pass"); $tulostus = curl_exec($ch); curl_close($ch);

Takaisinsoittotoiminnot

On myös mahdollista määrittää toiminto, joka käynnistyy jo ennen kuin cURL-pyyntö on valmis. Esimerkiksi vastauksen sisällön latautuessa voit aloittaa tietojen käytön odottamatta niiden latautumista kokonaan.

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

Tämänkaltaisen funktion TÄYTYY palauttaa merkkijonon pituus, mikä on vaatimus.

Johtopäätös

Tänään opimme, kuinka voit käyttää cURL-kirjastoa omiin itsekkäisiin tarkoituksiin. Toivottavasti pidit tästä artikkelista.

Kiitos! Hyvää päivänjatkoa!

cURL on työkalu, jonka avulla voit olla vuorovaikutuksessa eri palvelimien kanssa ja joka tukee monia protokollia: HTTP, FTP, TELNET jne. cURL on alun perin komentorivin apuohjelma. Mutta onneksi PHP tukee työskentelyä cURL-kirjaston kanssa. Tässä artikkelissa tarkastellaan ei-triviaaleja esimerkkejä cURL-työskentelystä.

Miksi cURL?

Itse asiassa on monia muita tapoja lähettää pyyntö toiselle palvelimelle esimerkiksi sivun sisällön hakemiseksi. Monet ihmiset, enimmäkseen laiskuudesta, käyttävät yksinkertaisia ​​PHP-funktioita cURL:n sijasta:

$sisältö = file_get_contents("http://www.example.com"); // tai $rivit = tiedosto("http://www.esimerkki.fi"); // tai readfile("http://www.example.com");

Ne eivät kuitenkaan mahdollista tehokasta virheiden käsittelyä. On myös monia tehtäviä, joita he eivät voi tehdä ollenkaan - esimerkiksi evästeiden käsittely, valtuutus, lähetyspyynnöt, tiedostojen lataaminen.

cUrl on tehokas työkalu, joka tukee useita protokollia ja tarjoaa täydelliset pyyntötiedot.

curl-perustiedot

Ennen kuin siirrymme monimutkaisiin esimerkkeihin, katsotaanpa PHP:n cURL-pyynnön perusrakennetta. Suorittaaksesi cURL-pyynnön PHP:ssä, sinun on suoritettava 4 päävaihetta:

  1. Alustus.
  2. Asetusvaihtoehdot.
  3. Pyynnön toteuttaminen.
  4. Siivousresurssit.
// 1. alustus $ch = curl_init(); // 2. aseta asetukset, mukaan lukien URL curl_setopt($ch, CURLOPT_URL, "http://www.google.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); // 3. pyynnön suorittaminen ja vastauksen vastaanottaminen $output = curl_exec($ch); // 4. puhdistusresurssit curl_close($ch);

Tarkastelemme enimmäkseen tämän artikkelin vaihetta 2, koska siinä tapahtuu taikuutta. CURL-vaihtoehtojen luettelo on erittäin laaja, joten emme harkitse kaikkia vaihtoehtoja tänään, vaan käytämme niitä, jotka ovat hyödyllisiä tiettyjen ongelmien ratkaisemisessa.

Virheiden seuranta

Tarvittaessa voit lisätä seuraavat rivit seurataksesi virheitä:

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

Huomaa, että käytämme "===" "==" sijaan, koska On tarpeen erottaa tyhjä palvelinvastaus ja Boolen arvo FALSE, joka palautetaan virheen sattuessa.

Tietojen saaminen pyynnöstä

Toinen valinnainen vaihe on hankkia tietoja cURL-pyynnöstä sen suorittamisen jälkeen.

// ... curl_exec($ch); $info = curl_getinfo($ch); echo "Oti". $info["total_time"] . "sekuntia url:lle". $info["url"]; //...

Tämän seurauksena saat taulukon, jossa on seuraavat tiedot:

  • "url"
  • "sisältötyyppi"
  • "http_koodi"
  • "header_size"
  • "request_size"
  • "tiedostoaika"
  • "ssl_verify_result"
  • "uudelleenohjausmäärä"
  • "koko_aika"
  • "nimihaun_aika"
  • "yhteysaika"
  • "pretransfer_time"
  • "size_upload"
  • "size_download"
  • "nopeus_lataus"
  • "speed_upload"
  • "lataussisällön_pituus"
  • "upload_content_length"
  • "starttransfer_time"
  • "uudelleenohjausaika"

Uudelleenohjauksen seuranta selaimesta riippuen

Tässä esimerkissä kirjoitamme skriptin, joka havaitsee uudelleenohjaukset eri selainasetusten perusteella. Jotkut sivustot esimerkiksi uudelleenohjaavat kävijöitä mobiililaitteista vierailijoille muista maista.

Käytämme CURLOPT_HTTPHEADER-vaihtoehtoa määrittääksemme omat otsikot, mukaan lukien User-Agent ja Language, ja katsomme, mihin sivustot uudelleenohjaavat meidät.

// URL-osoitteet $urls = array("http://www.cnn.com", "http://www.mozilla.com", "http://www.facebook.com"); // selaimet $selaimet = 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; Prosessori kuten Mac OS X; fi) AppleWebKit/420+ (KHTML, kuten Gecko) Version/3.0 Mobile/1A537a Safari/419.3", "language" => "en"), "french" => array ("user_agent" =) > "Mozilla/4.0 (yhteensopiva; MSIE 7.0; Windows NT 5.1; GTB6; .NET CLR 2.0.50727)", "kieli" => "fr,fr-FR;q=0.5")); foreach ($urls muodossa $url) ( echo "URL: $url\n"; foreach ($selaimet muodossa $test_name => $browser) ( $ch = curl_init(); // aseta osoite curl_setopt($ch, CURLOPT_URL , $url); // määritä selain ja kieli curl_setopt($ch, CURLOPT_HTTPHEADER, array("Käyttäjä-agentti: ($selain["user_agent"])", "Accept-Language: ($browser["kieli" ]) ")); // emme tarvitse sivun sisältöä curl_setopt($ch, CURLOPT_NOBODY, 1); // tarvitsemme vain otsikot curl_setopt($ch, CURLOPT_HEADER, 1); // palauta tulos sen sijaan sen tulos curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1) $output = curl_exec($ch // määritä uudelleenohjaukset HTTP-otsikoissa , $tulostus, $osumat) ( echo "$testin_nimi: uudelleenohjaa kohteeseen $osuma\n"; ) else ( echo "$testin_nimi: ei uudelleenohjausta\n"; ) ) echo "\n\n";

Silmukassa tarkistamme jokaisen URL-osoitteen selaimista. Ensin asetamme pyyntömme asetukset: URL-osoite ja selain sekä testattava kieli.

Koska Olemme asettaneet erikoisvaihtoehdon. Pyynnön tulos sisältää vain HTTP-otsikot. Yksinkertaisen säännöllisen lausekkeen avulla voimme tarkistaa, sisältääkö vastaus merkkijonon "Location:".

Skriptin suorituksen tulos:

URL-osoite: http://www.cnn.com standardi: uudelleenohjaukset osoitteeseen http://edition.cnn.com/ iphone: uudelleenohjaukset osoitteeseen http://edition.cnn.com/ ranska: uudelleenohjaukset osoitteeseen http://edition.cnn .com/ URL: http://www.mozilla.com standardi: uudelleenohjaa osoitteeseen https://www.mozilla.org/firefox/ iphone: uudelleenohjaa osoitteeseen https://www.mozilla.org/firefox/ french: uudelleenohjaa osoitteeseen https://www.mozilla.org/firefox/ URL: http://www.facebook.com standardi: uudelleenohjaukset osoitteeseen https://www.facebook.com/ iphone: uudelleenohjaukset osoitteeseen http://m.facebook.com /?refsrc=http%3A%2F%2Fwww.facebook.com%2F&_rdr ranska: ei uudelleenohjausta

POST-pyyntöjen lähettäminen

GET-pyyntöjä suoritettaessa tiedot voidaan välittää kyselymerkkijonossa. Kun esimerkiksi teet haun Googlessa, kyselysi käännetään URL-osoitteeksi:

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

Saadaksesi tämän kyselyn tuloksen et tarvitse edes cURL-osoitetta, voit olla laiska ja käyttää "file_get_contents()".

Mutta jotkut HTML-lomakkeet käyttävät POST-menetelmää. Tässä tapauksessa tiedot lähetetään pyyntöviestin tekstiosassa eikä itse URL-osoitteessa.

Kirjoitetaan skripti, joka lähettää POST-pyynnöt. Ensin luodaan yksinkertainen PHP-tiedosto, joka hyväksyy nämä pyynnöt ja palauttaa sille lähetetyt tiedot. Kutsutaan sitä post_output.php:ksi:

$url = "http://localhost/post_output.php"; $post_data = array ("foo" => "bar", "query" => "FooBar", "action" => "Lähetä"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // tee POST-pyyntö curl_setopt($ch, CURLOPT_POST, 1); // lisää tietoja curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $tulostus = curl_exec($ch); curl_close($ch); echo $lähtö;

Tämä skripti tulostaa:

Array ( => palkki => FooBar => Lähetä)

Tämä komentosarja lähetti POST-pyynnön post_output.php-tiedostoon. joka tulosti $_POST-taulukon sisällön ja saimme tämän vastauksen käyttämällä cURL-osoitetta.

Tiedostojen lataaminen

Kuten edellisessä esimerkissä, luodaan tiedosto, joka hyväksyy pyynnöt, upload_output.php:

Tulosta_r($_FILES);

Ja itse komentosarja, joka lataa tiedostot:

$url = "http://localhost/upload_output.php"; $post_data = array ("foo" => "bar", // ladattava tiedosto "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); $tulostus = curl_exec($ch); curl_close($ch); echo $lähtö;

Jos haluat ladata tiedoston, sinun tarvitsee vain välittää polku siihen, aivan kuten normaali POST-pyyntöparametri, jonka etuliite on "@". Käsikirjoituksen tulos:

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

Multi cURL

Yksi PHP:n cURL:n edistyneistä ominaisuuksista on kyky suorittaa useita pyyntöjä samanaikaisesti ja asynkronisesti.

Normaaleissa olosuhteissa komentosarja pysähtyy ja odottaa pyynnön valmistumista. Ja jos sinun on suoritettava paljon kyselyjä, se voi viedä paljon aikaa, koska... suoritat peräkkäin. Tämä rajoitus voidaan ohittaa:

// luo käsittelijät $ch1 = curl_init(); $ch2 = curl_init(); // aseta asetukset 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); //luo usean cURL-kahvan $mh = curl_multi_init(); // lisää käsittelijät curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $käynnissä = null; // suorita pyynnöt do ( curl_multi_exec($mh, $running); ) while ($running > 0); // vapauttaa resursseja curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh);

Ajatuksena on, että voit luoda useita cURL-kahvoja, yhdistää ne yhden monikahvan alle ja suorittaa ne asynkronisesti.

Ensinnäkin kaikki on sama kuin tavallisessa cURL-pyynnössä - luodaan kuvaaja ( curl_init() ), parametrit asetetaan ( curl_setopt() ). Seuraavaksi luodaan monikuvaaja ( curl_multi_init() ) ja aiemmin luodut tavalliset kuvaajat lisätään ( curl_multi_add_handle() ). Sen sijaan, että kutsumme curl_exec():tä normaalisti, kutsumme curl_multi_exec() tämä toiminto ilmoittaa meille aktiivisten yhteyksien lukumäärän käyttämällä toista parametria - $running. Siksi silmukka kulkee, kunnes $juoksu on yhtä suuri kuin 0. Ja tietysti työn päätyttyä on tarpeen vapauttaa resurssit.

Tässä esimerkissä yksinkertaisesti tulostamme kyselyjen tuloksen STDOUT:iin. Tarkastellaan ei-triviaalista usean cURL-osoitteen käyttöä.

Ulkoisten linkkien tarkistaminen WordPressissä

Kuvittele blogi, jossa on paljon viestejä, jotka sisältävät linkkejä ulkoisille sivustoille. Jotkut näistä linkeistä eivät välttämättä toimi.

Kirjoitetaan käsikirjoitus, joka löytää kaikki rikkinäiset linkit ja näyttää ne meille.

Ensin meidän on vedettävä kaikki ulkoiset linkit tietokannasta:

// CONFIG $db_host = "localhost"; $db_user = "juuri"; $db_pass = ""; $db_name = "wordpress"; $excluded_domains = array("paikallinen isäntä", "sivusto"); $max_yhteydet = 10; $url_list = array(); $työskentely_urls = array(); $dead_urls = array(); $not_found_urls = array(); $aktiivinen = null; // muodosta yhteys MySQL:ään if (!mysql_connect($db_host, $db_user, $db_pass)) ( die("Ei voitu muodostaa yhteyttä: " . mysql_error()); ) if (!mysql_select_db($db_name)) ( die("Voisi not select db: " . mysql_error()); ) // ota kaikki viestit, joissa on linkit tekstissä $q = "VALITSE post_content FROM wp_posts WHERE post_content LIKE "%href=%" AND post_status = "publish" AND post_type = "post ""; $r = mysql_query($q) tai kuole(mysql_error()); while ($d = mysql_fetch_assoc($r)) ( // kerää kaikki linkit käyttämällä säännöllistä lauseketta if (preg_match_all("/href=\"(.*?)\"/), $d["post_content"], $matches )) ( foreach ($vastaa kuin $url) ( // suodata pois tarpeettomat verkkotunnukset $tmp = parse_url($url); if (isset($tmp["host"]) && in_array($tmp["host"], $ poissuljetut_verkkotunnukset)) ( jatka; ) // koota $url_list = $url ) ) // poista toistot $url_list = array_values(array_unique($url_list)); if (!$url_list) ( die("Ei tarkistettavaa URL-osoitetta"); )

Tässä skriptin osassa vedämme yksinkertaisesti kaikki ulkoiset linkit tietokannasta. Tarkastetaan ne:

$mh = curl_multi_init(); // 1. lisää linkit kohteelle ($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 "==Kuolleet URL-osoitteet==\n"; echo implode("\n", $dead_urls) . "\n\n"; echo "==404 URL-osoitetta==\n"; echo implode("\n", $not_found_urls) . "\n\n"; echo "==Toimivat URL-osoitteet==\n"; echo implode("\n", $työskentely_urls); echo "\n\n"; // 9. lisää kahvan annetulla URL-funktiolla add_url_to_multi_handle($mh, $url_list) ( staattinen $index = 0; // jos linkkejä on vielä if (isset($url_list[$index])) ( // kaikki on tavalliseen tapaan $ ch = curl_init( // aseta valinnat curl_setopt($ch, CURLOPT_URL, $url_list[$index]) // palauttaa tuloksen näyttämisen sijaan curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); uudelleenohjaa curl_setopt($) ch, CURLOPT_FOLLOWLOCATION, 1 // hanki vain otsikot säästääksesi aikaa curl_setopt($ch, CURLOPT_NOBODY, 1) // lisää monikahvaiseen curl_multi_add_handle($mh, $ch);

Katsotaanpa koodia tarkemmin (numerointi vastaa koodin kommentteja):

  1. Lisäämme alkumäärän kuvaajia, jotta järjestelmää ei ylikuormitettaisi säikeillä. Lukua ohjaa $max_connections-muuttuja.
  2. $curRunning-muuttuja tallentaa käynnissä olevien säikeiden lukumäärän, $running tallentaa edellisen arvon, jos niistä tulee eriarvoisia, yksi säikeistä on valmis.
  3. Saamme tiedot täytetystä pyynnöstä.
  4. Jos palvelin ei vastaa, linkki ei toimi.
  5. Palvelimen vastaus on 404.
  6. Muuten linkki toimii.
  7. Pyyntö on valmis, vapautamme resurssit.
  8. Lisätään uusi URL-osoite monikuvaajaan.
  9. Toiminto add_url_to_multi_handle() lisää uuden kahvan annetulla URL-osoitteella monikuvaajaan.

Suoritetaan skripti:

Kuolleet URL-osoitteet== xample1234.com/ ==404 URL-osoitetta== www.google.com/dsfasdfafd ==Toimivat URL-osoitteet== 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

Tarkastus kesti noin 2 sekuntia. Suorittamalla 10 säiettä samanaikaisesti suorituskyky paranee 10 kertaa tavallisiin cURL-pyyntöihin verrattuna. Käytä toimintoa saadaksesi palvelimen vastauksen sisällön curl_multi_getcontent($ch) , jossa $ch on deskriptori, joka on saatu curl_multi_info_read() .

Muut cURL-ominaisuudet PHP:ssä

HTTP-todennus

Jos HTTP-pyyntö vaatii todennusta, käytä seuraavaa koodia:

$url = "http://www.jokusivusto.fi/jäsenet/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // lähetä käyttäjätunnus ja salasana curl_setopt($ch, CURLOPT_USERPWD, "omakäyttäjänimi:omasalasana"); // jos uudelleenohjaukset ovat sallittuja curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // cURL lähettää salasanan uudelleenohjauksen jälkeen curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); $tulostus = curl_exec($ch); curl_close($ch);

Lataa FTP:n kautta

PHP:llä on oma kirjasto työskentelyä varten FTP:n kanssa, mutta voit myös käyttää cURL-osoitetta:

// lue tiedosto $tiedosto = fopen("/polku/tiedostoon", "r"); // url sisältää jo tarvittavat tiedot $url = "ftp://username: [sähköposti suojattu]:21/polku/uuteen/tiedostoon"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // asetukset curl_setopt($ch, CURLOPT_UPLOAD, 1 curl_setopt($ch, CURLOPT_INFILE, $fp, curl_setopt("/path/to/file")); ch);

Välityspalvelimen käyttäminen

Pyynnöt voidaan tehdä tietyn välityspalvelimen kautta:

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://www.example.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // välityspalvelimen osoite curl_setopt($ch, CURLOPT_PROXY, "11.11.11.11:8080"); // jos valtuutus vaaditaan curl_setopt($ch, CURLOPT_PROXYUSERPWD,"user:pass"); $tulostus = curl_exec($ch); curl_close($ch);

Takaisinsoittotoiminnot

On mahdollista käyttää takaisinsoittoja pyynnön ollessa käynnissä odottamatta sen valmistumista. Esimerkiksi, kun palvelimen vastausta ladataan, voimme käyttää jo vastaanotettuja tietoja odottamatta niiden lataamista kokonaan.

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

Takaisinsoittotoiminnon on palautettava merkkijonon pituus, jotta pyyntö toimisi oikein.

Joka kerta kun palvelimen vastauksen seuraava osa vastaanotetaan, kutsutaan takaisinsoitto.

Johtopäätös

Tässä artikkelissa tarkastelimme PHP:n cURL:n lisäominaisuuksia. Seuraavan kerran, kun sinun on tehtävä URL-pyyntöjä, käytä cURL-osoitetta.

CURL-kirjaston (Client URLs) avulla voit siirtää tiedostoja etätietokoneeseen käyttämällä useita Internet-protokollia. Sillä on erittäin joustava konfiguraatio ja sen avulla voit täyttää melkein kaikki etäpyynnöt.

CURL tukee HTTP-, HTTPS-, FTP-, FTPS-, DICT-, TELNET-, LDAP-, FILE- ja GOPHER-protokollia sekä HTTP-post-, HTTP-put-, evästeitä, FTP-latauksia, keskeytettyjen tiedostojen siirtojen jatkamista, salasanoja, porttinumeroita, varmenteita SSL , Kerberos ja välityspalvelimet.

CURL:n avulla verkkopalvelin voi toimia minkä tahansa HTTP-pohjaisen palvelun, esimerkiksi XML-RPC:n, SOAP:n tai WebDAV:n, täysimittaisena asiakkaana.

Yleensä kirjaston käyttö koostuu neljästä vaiheesta:

  1. CURL-resurssin luominen curl_init-funktiolla.
  2. Parametrien asettaminen curl_setopt-funktiolla.
  3. Pyynnön suorittaminen curl_exec-funktiolla.
  4. CURL-resurssin vapauttaminen curl_close-funktiolla.

Yksinkertainen esimerkki CURL:n käytöstä

// Alusta curl-kirjasto
if ($ch = @curl_init())
{
// Aseta pyynnön URL-osoite
@curl_setopt($ch, CURLOPT_URL, "http://server.com/");
// Jos tosi, CURL sisältää otsikot tulosteeseen
@
// Mihin pyynnön tulos sijoitetaan:
// false - vakiolähtövirtaan,
// true - curl_exec-funktion palautusarvona.
@
// Maksimi odotusaika sekunneissa
@
// Aseta User-agent-kentän arvo
@curl_setopt($ch, CURLOPT_USERAGENT, "PHP Bot (http://blog.yousoft.ru)");
// Suorita pyyntö
$data = @curl_exec($ch);
// Tulostaa vastaanotetut tiedot
echo $data ;
// Vapauta resurssi
@curl_close($ch);
}
?>

Esimerkki GET-pyynnön käytöstä

$ch = curl_init();
// GET-pyyntö on määritetty URL-rivillä
curl_setopt($ch, CURLOPT_URL, "http://server.com/?s=CURL");
curl_setopt ($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, tosi);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);

$tiedot = curl_exec($ch);
curl_close($ch);
?>

GET-pyynnön lähettäminen ei eroa sivun vastaanottamisesta. On tärkeää huomata, että kyselymerkkijono muodostetaan seuraavasti:

Http://server.com/index.php?nimi1=arvo1&nimi2=arvo2&nimi3=arvo3

jossa http://server.com/index.php on sivun osoite, nimiX on muuttujan nimi, arvoX on muuttujan arvo.

Esimerkki POST-pyynnön käytöstä

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://server.com/index.php");
curl_setopt ($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, tosi);
// Sinun on nimenomaisesti ilmoitettava, että POST-pyyntö tulee
curl_setopt($ch, CURLOPT_POST, true);
// Muuttujien arvot välitetään täällä
curl_setopt ($ch, CURLOPT_POSTFIELDS, "s=CURL");
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt ($ch, CURLOPT_USERAGENT, "PHP Bot (http://mysite.ru)");
$tiedot = curl_exec($ch);
curl_close($ch);
?>

POST-pyynnön lähettäminen ei eroa paljon GET-pyynnön lähettämisestä. Kaikki perusvaiheet pysyvät samoina. Muuttujat määritetään myös pareittain: nimi1=arvo1&nimi2=arvo2 .

HTTP-valtuutusesimerkki

// HTTP-valtuutus
$url = "http://server.com/protected/";
$ch = curl_init();


curl_setopt($ch, CURLOPT_USERPWD, "omakäyttäjänimi:omasalasana");
$tulos = curl_exec($ch);
curl_close($ch);
echo $tulos ;
?>

Esimerkki FTP-istunnosta

$fp = fopen(__TIEDOSTO__, "r");
$url = "ftp://käyttäjänimi: [sähköposti suojattu]:21/polku/uuteen tiedostoon.php";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt ($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_FTPASCII, 1);
curl_setopt($ch, CURLOPT_INFILESIZE, tiedostokoko(__FILE__));
$tulos = curl_exec($ch);
curl_close($ch);
?>

Jos sinulla on ongelmia cURL-osoitteen käytössä, sinun on lisättävä seuraavat rivit ennen curl_close-kutsua saadaksesi raportin viimeisimmästä pyynnöstä:

print_r(curl_getinfo($ch));
echo "cURL-virhenumero:" . curl_errno($ch). "
" ;
echo "cURL error:" . curl_error($ch). "
" ;
curl_close($ch);
?>

c URL on erittäin hyödyllinen komentorivityökalu tietojen siirtämiseen palvelimelta tai palvelimelle. Curl tukee useita protokollia, kuten FILE, HTTP, HTTPS, IMAP, IMAPS, LDAP, DICT, LDAPS, TELNET, FTPS, GOPHER, RTMP, RTSP, SCP, SFTP, POP3, POP3S, SMB, SMBS, SMTP, SMTPS ja TFTP .

cURL-osoitetta voidaan käyttää monilla erilaisilla ja mielenkiintoisilla tavoilla. Tämän työkalun avulla voit ladata, lähettää ja hallita tiedostoja, tarkistaa sähköpostiosoitteesi tai jopa päivittää tilasi joillakin sosiaalisen median sivustoilla tai tarkistaa sään ulkona. Tässä artikkelissa tarkastellaan cURL-työkalun viittä hyödyllisintä ja peruskäyttöä missä tahansa .

1. Tarkista URL-osoite

Yksi cURL:n yleisimmistä ja yksinkertaisimmista käyttötavoista on itse komennon tulostaminen ja sen jälkeen testattava URL-osoite

Curl https://domain.ru

Tämä komento näyttää URL-osoitteen sisällön päätteessäsi

2. Tallenna URL-tuloste tiedostoon

Curl -o-verkkosivusto https://domain.ru % Yhteensä % Vastaanotettu % Xferd Keskimääräinen nopeus Aika Aika Nykyinen lataus Lataus Yhteensä käytetty vasen nopeus 100 41793 0 41793 0 0 275k 0 --:--:-- - -:-- :-- --:--:-- 2,9 milj

Tässä esimerkissä tulos tallennetaan tiedostoon nimeltä "verkkosivusto" nykyisessä työhakemistossa.

3. Tiedostojen lataaminen Curlin avulla

Voit ladata tiedostoja Curlilla lisäämällä komentoon -o-vaihtoehdon. Sitä käytetään tiedostojen tallentamiseen paikalliselle palvelimelle samoilla nimillä kuin etäpalvelimella

Curl -O https://domain.ru/file.zip

Tässä esimerkissä arkisto "file.zip" ladataan nykyiseen työhakemistoon.

Voit myös ladata tiedoston eri nimellä lisäämällä -o-vaihtoehdon cURL-osoitteeseen.

Curl -o archive.zip https://domain.ru/file.zip

Joten arkisto "file.zip" ladataan ja tallennetaan nimellä "Archive.zip".

cURL-osoitetta voidaan käyttää myös useiden tiedostojen lataamiseen kerralla alla olevan esimerkin mukaisesti

Curl -O https://domain.ru/file.zip -O https://domain.com/file2.zip

Curlia voidaan käyttää myös tiedostojen lataamiseen turvallisesti SSH:n kautta seuraavan komennon avulla

Curl -u-käyttäjä sftp://server.domain.ru/path/to/file

Huomaa, että sinun on käytettävä ladattavan tiedoston koko polkua

4. Ota tiedot verkkosivuston HTTP-otsikosta

Voit helposti saada HTTP-otsikkotiedot miltä tahansa verkkosivustolta lisäämällä -I ('i') -vaihtoehdon cURL-osoitteeseen.

Curl -I http://domain.ru HTTP/1.1 200 OK Päivämäärä: su, 16. lokakuuta 2016 23:37:15 GMT Palvelin: Apache/2.4.23 (Unix) X-Powered-By: PHP/5.6.24 Yhteys : sulje Sisältö-tyyppi: text/html; charset=UTF-8

5. Pääsy FTP-palvelimeen

Päästäksesi FTP-palvelimeen Curlin avulla, sinun on käytettävä seuraavaa komentoa

Curl ftp://ftp.domain.ru -- käyttäjän käyttäjätunnus: salasana

Curl muodostaa yhteyden FTP-palvelimeen ja luettelee kaikki käyttäjän kotihakemiston tiedostot ja hakemistot

Voit ladata tiedoston FTP:llä

Curl ftp://ftp.domain.ru/file.zip -- käyttäjän käyttäjätunnus: salasana

ja lataa tiedosto FTP-palvelimelle

Curl -T file.zip ftp://ftp.domain.ru/ --user username:password

Voit tarkistaa Curl-sivun manuaalisesti nähdäksesi kaikki käytettävissä olevat cURL-vaihtoehdot ja sen toiminnot

Miesten kihara

PS. Jos pidit tästä viestistä, jaa se ystäviesi kanssa sosiaalisissa verkostoissa alla olevien painikkeiden avulla tai jätä kommentti. Kiitos.

Tämä opas on tarkoitettu niille web-kehittäjille, jotka haluavat automatisoida tiedostojen siirrot verkossa tai olla vuorovaikutuksessa muiden Internet-palvelujen kanssa. Tämän luvun lukeminen edellyttää, että ymmärrät asiakas-palvelin-strategian ja tunnet PHP-syntaksin perusteet.

cURL ja libcurl ovat kirjastoja, joiden avulla palvelin voi siirtää tiedostoja etätietokoneeseen käyttämällä useita Internet-protokollia. Kirjastot ovat erittäin joustavia ja mahdollistavat melkein minkä tahansa etäpyynnön suorittamisen. Niitä käyttämällä web-palvelin voi toimia minkä tahansa HTTP-protokollapohjaisen palvelun täysimittaisena asiakkaana, esimerkiksi: XML-RPC, SOAP tai WebDAV.

Tämä artikkeli käsittelee mitä cURL on, kuinka sitä käytetään komentoriviltä ja sen käyttöä PHP:ssä.

Mikä on cURL ja libcurl

cURL on lyhenne sanoista "Client URLs". Daniel Stenberg kehitti sen vuonna 1998 komentorivityökaluksi. Libcurl on kannettava kirjasto, joka tarjoaa yksinkertaisen API to cURL -toiminnon. Kirjasto on lankaturvallinen, IPv6-yhteensopiva ja tukee pysyviä yhteyksiä. Sterling Hughes lisäsi php-käyttöliittymän.

cURL ja libcurl voidaan käyttää tiedon siirtämiseen käyttämällä protokollia, kuten HTTPS, FTP, FTPS, GOPHER, LDAP, DICT, TELNET ja FILE. Tuki lähes kaikille *nix-järjestelmille on otettu käyttöön, samoin kuin Windows, OS/2, BeOS ja eräät muut.

Curl-kirjasto on avoimen lähdekoodin tuote, jolla on alkuperäinen MIT/X-lisenssi, jonka avulla voit käyttää tätä pakettia mihin tahansa tarkoitukseen: sekä kaupalliseen että ei-kaupalliseen, ja sisällyttää sen jakeluösi (vaikka se levitettäisiin ilman avointa lähdekoodia ).

Huomaa, että cURL:llä ei ole mitään tekemistä Curl Corporationin kanssa, joka on Curl-ohjelmointikielen kaupallinen valmistaja.

Asennetaan cURL

Jotta voit työskennellä PHP-versiossa 4.2.3 ja uudemmissa, tarvitset cURL-version, joka on vähintään 7.9.0. Jotta voit työskennellä PHP-versiossa 4.3.0 ja uudemmissa, tarvitset cURL-version, joka on vähintään 7.9.8.

Windows

Kuten kaikki muut lisämoduulit, se vaatii asennetun PHP-jakelun. Asenna cURL kopioimalla tiedostot php4ts.dll, ssleay32.dll, php_curl.dll, msvcrt.dll DLL-hakemistosta Windowsin järjestelmähakemistoon, yleensä tämä:

C:\windows\system Windows 9x/Me:lle c:\winnt\system32 Windows NT/2000:lle c:\windows\system32 Windows XP:lle.

Tämän jälkeen sinun on poistettava rivin kommentti

;extension=php_curl.dll

php.ini-tiedostossa tai lataa moduuli dynaamisesti komentosarjan ollessa käynnissä.

dl("php_curl.dll");
?>

Unix

Lähin peili, joka sisältää lähdekoodit ja käännetyt binaarit eri käyttöjärjestelmille, löytyy verkkosivulta http://curl.haxx.se/.

Koska cURL käyttää openssl-kirjastoa SSL-yhteyksiin, SSL-palvelin on ensin asetettava. Jos openssl-kirjastoa ei löydy cURL-asennuksen aikana, cURL asennetaan ilman SSL-yhteyksiä.

cURL:n asentaminen koostuu seuraavista vaiheista: ./configure, make, make install.

Tämän jälkeen sinun on rakennettava PHP uudelleen --with-curl-vaihtoehdolla

Voit selvittää, onko cURL-tuki käytössä php:ssä suorittamalla phpinfo().

cURL-esimerkki

cURL:n käyttäminen komentoriviltä on erittäin helppoa. Seuraava esimerkki pyytää verkkosivua ja tulostaa sen stdoutiin

$ curl -L zend.com

M (vaihtoehto -L sallii uudelleenohjaukset)

On myös mahdollista käyttää cURL:ää komentoriviltä PHP:n avulla. Seuraava esimerkki pyytää 3 sivua ja näyttää ne näytöllä

$var = echo shell_exec ( "/usr/bin/curl -L http://www.zend.com http://zend.com/developers.php http://zend.com/zend/tut/");
?>

Esimerkki cURL:n käytöstä PHP:ssä

Libcurlin käyttäminen PHP-skriptissä on melko yksinkertaista, etenkin sellaisissa toimissa kuin POST-pyyntöjen luominen.

Jotta voit käyttää libcurlia, sinun on noudatettava näitä ohjeita:

  • Alusta cURL-istunto
  • Asenna cURL-asetukset (vaihtoehtojen asennusjärjestyksellä ei ole väliä)
  • Suorita pyyntö
  • Lopeta cURL-istunto

Yllä olevan havainnollistamiseksi tarjoamme käytännön esimerkkejä cURL-osoitteen käyttämisestä POST-pyynnön, HTTP-valtuutuksen ja FTP-istunnon luomiseen.

// Etsi kirjoja amazon.com-palvelimelta
$url = "http://www.amazon.com/exec/obidos/search-handle-form/002-5640957-2809605";
$ch = curl_init();
// aseta url, johon lähetät
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); //salli uudelleenohjaukset
// palaa muuttujaan
curl_setopt($ch, CURLOPT_TIMEOUT, 3); // aikakatkaisu 4 sekunnin kuluttua
curl_setopt($ch, CURLOPT_POST, 1); // aseta POST-menetelmä
curl_setopt ($ch, CURLOPT_POSTFIELDS, "url=index%3Dbooks&field-keywords=PHP+MYSQL"); // lisää POST-kenttiä
$tulos = curl_exec($ch); // Suorita koko prosessi
curl_close($ch);
echo $tulos ;
?>

// HTTP-todennus
$url = "http://www.esimerkki.fi/suojattu/";
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERPWD, "omakäyttäjänimi:omasalasana");
$tulos = curl_exec($ch);
curl_close($ch);
echo $tulos ;
?>

// FTP tämä komentosarja palvelimelle
$fp = fopen(__TIEDOSTO__, "r");
$url = "ftp://käyttäjänimi: [sähköposti suojattu]:21/polku/uuteen tiedostoon.php";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt ($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_FTPASCII, 1);
curl_setopt($ch, CURLOPT_INFILESIZE, tiedostokoko(__FILE__));
$tulos = curl_exec($ch);
curl_close($ch);
?>

Jos sinulla on ongelmia cURL-osoitteen käytössä, sinun on lisättävä seuraavat rivit ennen curl_close-kutsua saadaksesi raportin viimeisimmästä pyynnöstä:

print_r(curl_getinfo($ch));
echo "\n\ncURL-virhenumero:" . curl_errno($ch);
echo "\n\ncURL-virhe:" . curl_error($ch);
// ...sulje cURL-kahva ($ch) alla
?>

Päätös cURL:n vai libcurlin käytöstä tulee tehdä olosuhteiden mukaan. Jos kirjoitat komentoriviltä suoritettavaa skriptiä tai palveluntarjoajasi ei tue libcurlia, on järkevää käyttää cURL-osoitetta. Muissa tapauksissa libcurlin käyttö on kätevämpää.




Jos sinulla on muita kysymyksiä tai jokin on epäselvää - tervetuloa palveluumme