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); 

Komentáře 19

  1. #1 johno

    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);
    }

  2. #2 Radek Hulán autor webu ▲10 ▼0

    [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 😉

  3. #3 Radek Hulán autor webu ▲10 ▼0

    [1] nelépe bude toto:
    $s = '';
    foreach($data as $key=>$val) $s.=$key.'='.urlencode($val).'&';
    $s=substr($s,0,-1);

  4. #4 johno

    [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ť &amp;

    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ť.

  5. #5 dgx

    [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 &amp; do kódu nepatří. Nahrazení & za &amp; 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 &

  6. #6 Radek Hulán autor webu ▲10 ▼0

    [4] vsadím se klidně o $1, že to moje řešení je rozhodně nejrychlejší 🙂

  7. #7 johno

    Pre aké N(spomínané hore), Radku?

  8. #8 Miroslav Navrátil

    Hehe, $1 ... Ten film znám, nevíš náhodou jak se menuje? 😉

  9. #9 Radek Hulán autor webu ▲10 ▼0

    [7] pro malé, n=10

  10. #10 johno

    [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í.

  11. #11 johno

    [10] No v každom prípade to vyzerá tak, že moje riešenie je predsa len o niečo rýchlejšie.

  12. #12 Radek Hulán autor webu ▲10 ▼0

    [11] moment, moment, večer napíšu svůj skript, ten rozdíl 7% se mi nechce líbit 😉

  13. #13 johno

    [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á.

  14. #14 Radek Hulán autor webu ▲10 ▼0

    [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!

  15. #15 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.

  16. #16 johno

    [14] Jo pokiaľ nerobíš 10000 iterácií tak to nemá cenu.

  17. #17 Radek Hulán autor webu ▲10 ▼0

    [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é..

  18. #18 Stoyan

    Jde tento zdrojový kód zprovoznit na některém z českých webhostingů?

  19. #19 Pavel Zbytovský

    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.