Persistentní HTTP připojení

Školení, která pořádám

Dopsal jsem knihu

Protokol HTTP ve verzi 1.1 zavádí persistentní připojení, které se dá použít k významnému urychlení požadavků na webový server. Prohlížeče tento mechanismus transparentně využívají a s trochou šikovnosti ho můžeme použít i v PHP:

<?php
/** Stažení stránky protokolem HTTP s využitím persistentních konexí
* @param string doménové jméno serveru
* @param string požadovaná cesta
* @param int port pro připojení
* @return array ($status, $headers, $body) nebo false v případě chyby
*/
function get_page($host, $path, $port = 80) {
    static $fp = false, $host_prev = "", $port_prev = 0;
    
    if (!$fp || get_resource_type($fp) != "stream" || feof($fp) || $host != $host_prev || $port != $port_prev) {
        $fp = fsockopen($host, $port);
        if (!$fp) {
            return false;
        }
        $host_prev = $host;
        $port_prev = $port;
    }
    fwrite($fp, "GET $path HTTP/1.1\r\n");
    fwrite($fp, "Host: $host\r\n");
    fwrite($fp, "\r\n");
    
    // zde bude načtení statusu do řetězce $status
    // zde bude načtení hlaviček do pole $headers = array("hlavička" => array("hodnota", ...), ...)
    // zde bude načtení těla přesné délky v závislosti na hlavičce Content-Length nebo Transfer-Encoding: chunked do řetězce $body
    
    if (isset($headers["connection"]) && in_array("close", $headers["connection"])) {
        fclose($fp); // jinak se používají persistentní konexe
    }
    return array($status, $headers, $body);
}
?>

Ve funkci je ponechána pouze část zajišťující využití persistentních připojení, načtení statusu, hlaviček a přesné délky těla nechám zase někdy na příště.

Nové připojení se otevře v případě, že je funkce volaná poprvé nebo se minule otevření nepodařilo (!$fp), spojení bylo ukončeno (get_resource_type), dospělo na svůj konec (feof) nebo minulému připojení neodpovídá adresa nebo port.

Persistentní připojení se dá využívat ještě intenzivněji – na server můžeme vychrlit své požadavky bez čekání na jeho odpověď a příchozí data zpracovávat až následně. Ale vzhledem k tomu, že server může spojení kdykoliv ukončit a my bychom museli požadavky posílat znovu, je už tento způsob na zpracování o něco náročnější.

Pokud naopak persistentní připojení využívat nechceme, je možné poslat hlavičku Connection: close.

Přijďte si o tomto tématu popovídat na školení Výkonnost webových aplikací (6.10.2010, Praha).

Jakub Vrána, Seznámení s oblastí, 15.3.2006, diskuse: 6 (nové: 0)

Diskuse

PHX:

Zajimeve. Jen by me zajimalo zda by to slo vyuzit na obousmernou komunikaci. Neco jako telnet. Nebo jeste lepsi priklad by byl chat. Ze by se stranka nemusela reloudovat kazdych X sekund, ale pri zmene by server poslal data.
# 15.3.2006 13:42:23 reagovat

ikona Jakub Vrána:

Server push se takto realizovat nedá, ale možná by stálo za prozkoumání http://www.xulplanet.com/tutorials/mozsdk/serverpush.php.
# 15.3.2006 14:25:03 reagovat

C@esar:

Tady je ten chat, co hledate>
http://www.gtchat.de/news_en.xhtml
# 19.3.2006 15:42:41 reagovat

Leo:

"Jen by me zajimalo zda by to slo vyuzit na obousmernou komunikaci."

To by se klient (prohlizec v pc uzivatele) musel promenit v server. Leo
# 15.3.2006 21:00:22 reagovat

Dookie:

A proc nepouzit mod do apache?
# 17.3.2006 09:45:53 reagovat

ikona Jakub Vrána:

Rozšiřte nám obzory, jaký mod a jak ho použít?
# 17.3.2006 10:11:47 reagovat

Vložit příspěvek

Používejte diakritiku. Nelze používat HTML značky, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

© 2005-2010 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.