Autor Zpráva
Jenicek
Profil
zdravím,
kdysi jsem řešil "malý" problém jak vytahnout pouze hlavičku z url s nekonečným četězcem.
Přemýšlel jsem a nějak mi to nedá se nezeptat.

řekněme ž mám url:
http://nejakaurl.cz/data
která při otevření do nekonečna chrlí data

jak z této url vytahnout pouze hlavičku?
zkoušel jsem v php file_get_contents, curl... i různé kombinace s timeout v .htaccess
ale nepovedlo se...

hlavičkou je myšleno prvních 30 znaků vygenerovaných v http://nejakaurl.cz/data

celkem by mě zajímalo jak toto řešit kdyby jsem musel. :)
Majkl578
Profil
Teoreticky by k tomu šlo použít HTTP metodu HEAD, podle jejíž specifikace server nesmí vracet data, ale pouze hlavičky, přičemž ty by se neměly lišit od těch posílaných při regulérním požadavku metodou GET (viz RFC 2616).
Příklad použití je např. v PHP manuálu v Example #2 u funkce get_headers.
Nicméně server (přesněji daná aplikace) to nemusí podporovat.
Jenicek
Profil
zase jsem chytřejší :D

a co kdybych potřeboval vytahnout prvních 30 znaků přímo ze zdroje?

to jest surový kód ale pouze omezený počet znaků aniž by se server nesnažil stahnout celý kód...
Tori
Profil
Jenicek:
Pokud server podporuje hlavičku Range, mělo by to jít pomocí cUrl s nastavením curl_setopt($ch, CURLOPT_RANGE, '0-30'); Anebo s callbackem u cUrl - to nevyžaduje nic navíc od serveru, dá se použít vždy:
// verze pro PHP 5.3
$bytesRead = 0; // počítadlo, kolik bajtů už bylo celkem přečteno
$readLimit = 100; // kolik bajtů chci načíst
$data = null; // načtená data
$callback = function($ch, $chunk) use (&$bytesRead, &$data, $readLimit) {
    $ln = strlen($chunk);
    $bytesRead += $ln;
    $data .= ($bytesRead > $readLimit) ? substr($chunk, 0, ($readLimit-$bytesRead)) : $chunk;
    return ($bytesRead >= $readLimit ? null : $ln);
};

$ch = curl_init();
curl_setopt_array($ch, array(
    CURLOPT_URL         => "http://www.seznam.cz/",
    CURLOPT_WRITEFUNCTION    => $callback,
));
curl_exec($ch);
curl_close($ch);

var_dump($data);
Jan Tvrdík
Profil
Jenicek:
co kdybych potřeboval vytahnout prvních 30 znaků přímo ze zdroje
Tak by mělo být možné použít fsockopen.
Jenicek
Profil
Tori:
Pokud server podporuje hlavičku Range, mělo by to jít pomocí cUrl s nastavením curl_setopt($ch, CURLOPT_RANGE, '0-30');

tak s tím jsem se ještě nesetkal ale ze zvědavosti určitě zkusím, mám svůj dedik tak by to neměl být problém.
Děkuji

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0