Užitečné funkce pro PHP - díl 5.
Znáte CURL
PHP extension? Pokud ne, doporučuji se s ním seznámit, je to jedno
z nejužitečnějších (pro určité úkoly) PHP rozšíření pro práci na úrovni
http, https, ftp, gopher,
telnet, dict, file a ldap protokolů. Například tímto kódem jste schopni poslat
HTTP POST
request (tedy to samé, co se stane při stisknutí tlačítka SUBMIT formuláře).
// HTTT POST function postit(&$data,$url,$verbose){ $s=""; foreach($data as $key=>$val) { if (!empty($s)) $s.= '&'; $s.= $key.'='.urlencode($val); } // init $ch = curl_init($url); // set options curl_setopt($ch, CURLOPT_HTTP_VERSION, 1.0); curl_setopt($ch, CURLOPT_VERBOSE, $verbose); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 100); curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $s); // perform post $rr=curl_exec($ch); if ($verbose) echo $rr; curl_close($ch); }
// příklad použití $data['jmeno'] = 'Radek Hulan'; $data['komentar'] = 'Toto je komentar'; postit($data,'http://vase.domena.com',1);
Zajímavé je i použití parametru CURLOPT_PROXY
, například následovně:
$proxy = 'http://81.5.140.49:80'; curl_setopt($ch, CURLOPT_PROXY, $proxy);
No keď to už ladím tak ma napadlo toto:
$s = null;
foreach($data as $key => $val) {
if ($s !== null) $reqbody.= '&';
$s .= $key.'='.urlencode($val);
}
[1] ano, to by mohlo být o 0.00000001 sekund rychlejší, pokud vůbec, nicméně, pak to bude čekat 10 sekund na
curl_exec
;)[1] nelépe bude toto:
$s = '';
foreach($data as $key=>$val) $s.=$key.'='.urlencode($val).'&';
$s=substr($s,0,-1);
[3] No to asi ne. Jedine, že by bol substr() rýchlejší ako N krát vyhodnotenie podmienky
if($s !== null)
, kde N je dĺžka poľa $data.Osobne si myslím, že pre N < 1000 to asi nenastane. :-)
Inak máš tam ešte bug. $regbody asi malo byť $s a tiež som si neni istý či & nemá byť &
V každom prípade toto ladenie a čačkanie je taký kóderský fetiš, ktorého sa odvtedy ako som sa stretol s asemblerom nemôžem zbaviť.
[4] o rychlosti
if($s !== null)
bych si u PHP příliš iluze nedělal, přece jen, je to skriptovaný jazyk. Ale líbí se mi Tvé uvažování ;-)Entita
&
do kódu nepatří. Nahrazení&
za&
se provádí až těsně před odesláním řetězce na HTML výstup funkcí HTMLSpecialChars. V tomto případě žádný HTML výstup není třeba, takže zůstane u&
[4] vsadím se klidně o $1, že to moje řešení je rozhodně nejrychlejší :-)
Pre aké N(spomínané hore), Radku?
Hehe, $1 ... Ten film znám, nevíš náhodou jak se menuje? ;)
[7] pro malé,
n=10
[9] No tak som sa tomu chvíľu venoval a dospel som k tomuto skriptu.
Treba to však pustiť na nejakej čistej mašine lebo na hostingu je dosť veľký "šum".
U mňa doma(localhost) to dáva v väčšinou niečo takéto:
RaDo
Priemer: 0.049314928054810 Standardna odchylka: 0.004746350668415
Johno
Priemer: 0.046010541915894 Standardna odchylka: 0.000599868807071
Zaujímavý je však rádový rozdiel v štandardnej odchýlke. Vyzerá to tak, že tvoje riešenie má ešte nejaký "chaos faktor", ktorý spôsobuje nestabilné časy jednotlivých iterácií.
[10] No v každom prípade to vyzerá tak, že moje riešenie je predsa len o niečo rýchlejšie.
[11] moment, moment, večer napíšu svůj skript, ten rozdíl 7% se mi nechce líbit ;-)
[12] Už sa na neho teraz teším. Skús pustiť u seba (viackrát) ten môj skript a napísať sem výstup aby som vedel či moja mašina nie je nejaká divná.
[11] zkusil jsem ten tvůj zdroják předělat v tom, že prvně se dělá tvoje iterace, a pak moje, a takovéto jsou výsledky:
RaDo
Priemer: 0.037951960563660 Standardna odchylka: 0.000928254446914
Johno
Priemer: 0.038889474868774 Standardna odchylka: 0.002774445582024
Takže vedu!
Závěr: zjevně toto nemá cenu pro PHP řešit, není to C++. Děkuji, Johno!
[14] Ale kdeže vedieš. Pozri si štandardnú odchýlku.
PHPko nejako sa nejako divne správa pri tej funkcii, ktorá sa volá ako prvá. Ofajčil som to tak, že som tam dal zahrievací test, ktorý sa neráta do výsledkov. Až po ňom sa pustí samotný test.
To bol asi ten pochybný "chaos faktor", na ktorý som najprv nedošiel pretože štandardné odchýlky sa teraz už približne rovnajú. Už to vyzerá ako dobrý výsledok.
Dal som tam ten nový skript.
[14] Jo pokiaľ nerobíš 10000 iterácií tak to nemá cenu.
[15] takto dopadl nový skript:
RaDo
Priemer: 0.038763890266418 Standardna odchylka: 0.001791402019161
Johno
Priemer: 0.039631237983704 Standardna odchylka: 0.002375150284238
zanedbatelné rozdíly, přičítal bych to podivné funkci PHP, nicméně, zjevné je, že čím déle PHP pracuje, tím se jakoby více "stabilizuje", je to velice divné..
Jde tento zdrojový kód zprovoznit na některém z českých webhostingů?
Tyhle skripty byly asi pro PHP4. Ale nebylo by nyní lepší
http_build_query
?Btw: mohlo by se to hodit dalším lidem, kdo to budou číst.