Užitečné funkce pro PHP - díl 5.

MyEgo.cz

home foto blogy mywindows.cz kontakt

Užitečné funkce pro PHP - díl 5.

PHP 06.09.04

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

  1. 1 johno 06.09.04, 12:09:52
    FB

    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 06.09.04, 12:09:55
    FB

    [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 06.09.04, 12:09:59
    FB

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

  4. 4 johno 06.09.04, 02:09:16
    FB

    [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 06.09.04, 02:09:52
    FB

    [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 06.09.04, 03:09:21
    FB

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

  7. 7 johno 06.09.04, 03:09:50
    FB

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

  8. 8 Miroslav Navrátil 06.09.04, 03:09:57
    FB

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

  9. 9 Radek Hulán 06.09.04, 04:09:11
    FB

    [7] pro malé, n=10

  10. 10 johno 08.09.04, 12:09:35
    FB

    [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 08.09.04, 03:09:49
    FB

    [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 08.09.04, 03:09:50
    FB

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

  13. 13 johno 08.09.04, 03:09:56
    FB

    [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 08.09.04, 03:09:59
    FB

    [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 08.09.04, 04:09:14
    FB

    [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 08.09.04, 04:09:19
    FB

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

  17. 17 Radek Hulán 08.09.04, 06:09:25
    FB

    [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 12.08.06, 03:08:06
    FB

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

  19. 19 Pavel Zbytovský 30.10.06, 04:10:28
    FB

    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.