[PHP] Trik tedna #16 - stream_context_create
Objavljeno v Programiranje, Spletno programiranje, Trik tednaPred 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($ch, CURLOPT_FOLLOWLOCATION, true);
?>
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_url, false, $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









November 19th, 2007 at 13:07
Odlična zadevca!
November 19th, 2007 at 14:15
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
.
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
.
November 19th, 2007 at 15:12
Igre: malo slabo si prebral zapis
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.
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.
November 19th, 2007 at 21:00
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 :/
November 19th, 2007 at 21:16
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.
November 20th, 2007 at 19:12
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
Namreč za 10x več prostora plačam 70€ manj na leto + prijazna podpora + use se da lepo zment + hitrost prenosa je še bolš 
November 21st, 2007 at 16:49
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 …
November 24th, 2007 at 19:58
@sverde1: kdaj boš še o čem drugem pisal kot o c0danju?
November 24th, 2007 at 20:22
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
.
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.