Autor Zpráva
Yuhů
Profil
Potřebuju si skriptem stáhnout vzdálenou stránku (zadanou jako parametr).

Když použiju funkci FOpen($stranka, "r"),
tak to dostanu bez HTTP hlaviček.
V mém případě mě ale zajímají zrovna hlavičky.

Pokud použiju funkci FSockOpen($hostname, 80) // 80 je port
tak sice http hlavičky dostanu, ale zase nemůžu zadat obecnou adresu.

Jak přeštu skriptem hlavičky odpovědi požadavku na vzdálené URL?
llook
Profil
Myslím, že na tohle žádná vestavěná funkce není. Je akorát možné rozparsovat tu URL a pak použít fsockopen.

$url = parse_url('http://jakpsatweb.cz/');
$fp = fsockopen($url['host'], (isset($url['port']) ? $url['port'] : 80));
fwrite($fp, 'GET '.(isset($url['path']) ? $url['path'] : '/')' HTTP/1.0'."\r\n");
// atd...
Leo
Profil
"tak sice http hlavičky dostanu, ale zase nemůžu zadat obecnou adresu."

Nechapu, fsockopen muze oslovit jakoukoliv adresu, akorat ten HTTP pozadavek musis vytvorit. Jinak v teto souvislosti se v PHP pouziva udelatko jmenem curl, ale nemam s nim zkusenost, Leo
Yuhů
Profil
llooku, díky moc, začínám to chápat,
můžeš prosím rozvést to svoje
// atd...
?

Jak vidíš, se sockety a fsockopen() nemám tolik zkušeností. Normálně potom můžu z $fp číst?
Leo
Profil
$host = "www.neco.cz";
$port = 80;
$fp = fsockopen($host,$port);

if ($fp) {
fputs($fp,"GET /stranka.html HTTP/1.0\r\nHost: $host\r\nUser-Agent:Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)\r\n\r\n");
while ($line=fgets($fp,2048)) {
echo $line;
}
}

Leo
Leo
Profil
HTTP/1.1, Leo
Leo
Profil
Jinak pokud te zajimaji hlavicky mozna bys mohl pouzit HEAD misto GET, Leo
llook
Profil
"//atd..." znamená že prostě do socketu odešlu celý požadavek pomocí fwrite a pak načtu odpověď pomocí fread.
A jak správně doplnil Leo, měl bych si předtím ještě ověřit, jestli se socket podařilo otevřít:


if ($fp) {
/* Samotný příkaz */
fwrite($fp, 'GET '.$url['path'].(isset($url['query']) ? '?'.$url['query'] : ''). " HTTP/1.0\r\n");

/* Další hlavičky (každý řádek končí DOSácky \r\n) */
fwrite($fp, "User-Agent: Googlebot :-)\r\n");
fwrite($fp, "Cookie: E=MC2\r\n");

/* Požadavek končí prázdným řádkem */
fwrite($fp, "\r\n");

/* Načtení dat */
$response = '';
while ($data = fread($fp, 1024)) {
$response .= $data;
}
echo('<pre>'.$response.'</pre>');
}
/* Doufám, že tam nikde nemám překlep */
Toto téma je uzamčeno. Odpověď nelze zaslat.