[PHP] Trik tedna #16 - stream_context_create

Objavljeno v Programiranje, Spletno programiranje, Trik tedna

Pred kratkim sem delal na crawlerju (za en projekt, ki naj zaenkrat še ostane skrivnost), ki se sprehaja po RSS-jih blogov. Hotel sem uporabiti navadno branje datotek z funkcijo file_get_contents(), ampak sem se spomnil, da bi bilo koristno (in se je že izkazalo za koristno ;-) ) lastniku bloga pustiti sled, da bo vedel, kdo ga je poskeniral. Zato sem prišel na idejo, da bi uporabil CURL extension, ampak ta ideja se je izkazala za slabo, takoj ko sem naložil testno aplikacijo na moj hosting. Zakaj? Ker sem moral, zato da je crawler deloval pravilno, uporabiti tole vrstico, ki pove CURL-ju, da naj sledi preusmeritvam (kar je pomembno predvsem pri blogih, ki imajo preusmeritev na feedburner):

<?php
// ...
curl_setopt($chCURLOPT_FOLLOWLOCATIONtrue);
?>

Ampak ta vrstica vrže ven error, če je na hostu vklopljen safe mode (ker naj bi bila nevarna). Torej imel sem na izbiro 2 možnosti: zadevo urediti z socketi in se zajebavati z rekurzijo pri redirectih itd. ali pa uporabit začetno idejo z funkcijo file_get_contents(), ki mimogrede tudi samodejno sledi preusmeritvam. Ker sem malce len sem opcijo z socketi hitro dal v predal, kjer piše “uporabi v sili” :) .

Torej da preidem k bistvu… ker sem se odločil za uporabo funkcije file_get_contents() sem iskal način kako z uporabo te funkcije poslati header lastniku bloga in odgovor sem našel v tretjem parametru te funkcije, ki se imenuje context:

<?php
$feed_url 
'http://blog.sverde1.com/feed/';
$opts = array(
    
'http' => array(
        
'header' => "User-Agent: ExampleCrawler.tld 1.0-beta\r\n"
    
)
);

$context stream_context_create($opts);

echo 
file_get_contents($feed_urlfalse$context);
?>

Funkcija stream_context_create() nam torej ustvari resource z našim context-om, kjer je zapisan dodaten header, ki ga pošlje funkcija zraven requesta za datoteko $feed_url.

Sedaj lahko skorajda pozabimo na sockete in CURL, saj nam ta funkcija omogoča tudi da v kombinaciji z file_get_contents, fopen,… pošiljamo POST zahtevke:

<?php
$data 
'user=sverde1&pass=neki&login=Login';
$opts = array (
    
'http' => array (
        
'method' => 'POST',
        
'header'=> "Content-type: application/x-www-form-urlencoded\r\n"
                 
"Content-Length: " strlen($data) . "\r\n",
        
'content' => $data
    
)
);

// ...
?>

Zahteve:

  • PHP4 >= 4.3.0
0%
0%



9 Komentarjev na “[PHP] Trik tedna #16 - stream_context_create”

  1. Vojkec Says:

    Odlična zadevca! :)

  2. Igre Says:

    jaz pa bom rekel da je cURl super, sicer imam strežnik preko prijatelja, pa mi pusti vse odprto, tako da se tam igram, brez safe mode pa dela, prav lepo sledi :) , samo da sem jaz delal bota, ker sem tudi jaz len … naj dela komp zame :D .

    Ti pa bi lahko poskusil prebrati odgovor, sej je v headerju preusmeritev … potem ko veš kateri URL, pa ni problem naprej …

    A ti nebo problem določati USER_AGENT pri file_get_contents ?Ter še par cukerčkov ki jih omogoča cURL :D .

  3. sverde1 Says:

    Igre: malo slabo si prebral zapis :D

    CURL sem v originalu že uporabil, ampak zaradi vključenega safe mode-a na plačljivem strežniku ni delovalo.

    Ja lahko bi se z socketi zajebaval, ampak zakaj, če je zgornja rešitev 3x krajša od rešitve z CURL in verjetno 5x ali še večkrat krajša od rešitve z socketi. Gre se zato, da ti čez pol leta, ko moraš nekaj popravit, ni treba porabit 2uri zato, da si prideš gor, kaj si razmišljal ko si pisal kodo. :)

    A ti nebo problem določati USER_AGENT pri file_get_contents ?Ter še par cukerčkov ki jih omogoča cURL :D .

    Glih o tem je bistvo tega zapisa, da lahko file_get_contents nastaviš headerje, ki jih pošlje… Cukerčkov, ki jih pa CURL omogoča pa pri crawlerju niti ne rabim, ker se gre samo zato, da mi vrne vsebino RSS feeda, ki ga nato sparsam z simple XML.

  4. Ice-Heki Says:

    Ne boš verjel … Danes mi je kolega povedal, da je videl na Hitrosti prenovljeno ponudbo paketov, ki imajo izklopljen safe mode … mislem končno … te so tud eni čudaki, da pravjo, da je vsakršno koli kreiranje map s PHPjem kr nevarno …
    Pa povečal so tudi kapaciteto paketov, vendar, hm zanimivo, da so naši paketi ostali ravno tako veliki, kot so bili prej …
    Če bodo z njimi kakšne težave se bom pa pač priroman selit na drug host … na žalost :/

  5. sverde1 Says:

    Ja vem, da so na hitrosti posodobili pakete, že nekaj časa nazaj, ampak prvo jaz imam paket 100, safe mode pa je izklopljen šele, če imaš paket >= 800, drugič pa mi nebi verjetno nič koristilo tudi če bi imel bivši paket 600, ker niso avtomatsko nadgradili paketov.

  6. Boštjan Says:

    Sicer offtopic ampak ker je že ice-heki povedu neki na to temo…

    Jst sm pa pred kratkim (julija) zapustil hitrost in moram reči da sem zelo zadovoljen da sem to storil :D Namreč za 10x več prostora plačam 70€ manj na leto + prijazna podpora + use se da lepo zment + hitrost prenosa je še bolš :)

  7. Ice-Heki Says:

    Ja @Sverde: Jaz ne pokurim 800 MB, mi pa ta paket 600 poteče čez hm, mesec dva … če se zanimaš za to, da bi ostal na hitrosti povej in se lahko zmenimo, pa daš 1/3 paketa (ostalo plačam jaz)…
    Sicer pa me vse bolj mika najem optike in postavitev lastnega strežnika …

  8. Jan Says:

    @sverde1: kdaj boš še o čem drugem pisal kot o c0danju? :D

  9. sverde1 Says:

    Ja vem, zadnje čase še sam Trik tedna pišem. Ampak na žalost je situacija taka, da med tednom nimam časa da bi karkoli napisal, zaradi šole (jah treba se je učit :S ) in drugih obveznosti, čez vikend pa večinoma pišem eno aplikacijo (ti že veš katero ;) ), ki upam da bo čim prej v stanju da gre iz private beta v public beta :D .

    Po drugi strani pa sem med tem časom spisal že nekaj postov, ki sem jih poslal v koš, saj se mi niso zdeli dovolj kvalitetni.

Leave a Comment

Ime (obvezno)

E-mail (ne bo objavljen) (obvezno)

Spletna stran