Přebírání dat ze stránek na jiném serveru

Nejkratší možné řešení je zkusit se na stránku zeptat jako na soubor:

$url = "http://www.howtogeek.com";
$str = file_get_contents($url);

Převzato. Některé servery ale mohou mít tento zjednodušený způsob komunikace z bezpečnostních důvodů v konfiguračních souborech zakázaný. Spávně bychom totiž měli použít http protokol. To ale vyžaduje navázat spojení (vytvořit "socket") a poslat serveru hlavičky. Zajímavé je, že máme k dispozici metody GET a POST, i když nečekáme, že stránka by snad nutně musela být odezvou na formulář (použijeme metodu GET a prostě nepošleme žádná data):

$sock = fsockopen("www.interval.cz", 80);   // otevření socketu
fputs($sock, "GET /index.asp HTTP/1.1\r\nHost: www.interval.cz\r\n\r\n");   // pošleme požadavek
$page = "";
while ($line = fgets($sock, 128)):   // postupně načteme všechny řádky ze stránky
  $page .= $line;   // a uložíme si je do proměnné
endwhile;
// odstraníme hlavičky
$page = strstr($page, "\r\n\r\n");
$page = substr($page, 4, strlen($page) - 4);

Ukázka převzata ze serveru interval.cz. Odstraňovanými hlavičkami se zde rozumí hlavičky http protokolu, které server přidá před text stránky, která se předává. Podle téhož serveru vypadají následovně:

HTTP-verze stavový-kód stavové-hlášení
hlavičky (každá na nový řádek)
prázdný řádek
předávaný text stránky

Příkaz hledá ten přázdný řádek (řádek překvapivě končí jako ve Windows \r\n, nikoli jako v Linuxu jen \n). Funkce strstr vrací zbytek řetězce od tohoto výskytu až do konce stránky (včetně, proto se následně první čtyři znaky mažou). Pokud by tato funkce měla ještě třetí parametr ( strstr($page, "\r\n\r\n", TRUE) ), pak by naopak předala právě jen ty hlavičky.

Pro naše účely se tedy můžeme podívat například na stránku s teplotními čidly na "domečku" (http://senzor-12110-2.fsid.cvut.cz/) a zobrazit si její obsah. Za tím účelem buď odstraníme <, > a &, nebo je nahradíme tak, aby se nám zobrazily jako znaky, a takto "zneškodněnou" stránku prostě přímo vypíšeme - náhradu provedeme například takto:

strtr($nactena_stranka, "<>&", "[]*");

kdy každý znak je nahrazen něčím neškodným. Tato funkce umí nahrazovat i delší úseky, ale pomocí alternativní syntaxe, kdy nahrazované skupiny znaků musí splňovat požadavky stejné, jako název proměnné (například začínat písmenem nebo podtržítkem). Obecnější by asi byl příkaz str_replace(co,čím,kde), například

str_replace("<","&lt;",$nactena_stranka);

Překvapivě i tento příkaz může povyměňovat více různých skupin znaků najednou - parametrem totiž mohou být pole; pokud si je předem vhodně nadefinujeme, můžeme si měnit, kolik skupin znaků chceme:

$co = array('<','>','&');
$cim = array('&lt;','&gt;','&amp;');
str_replace($co,$cim,$nactena_stranka);

Upravenou načtenou hodnotu jednoduše přes echo vložíme do textu naší stránky. Celé by to mohlo vypadat takhle:

$url = "http://senzor-12110-2.fsid.cvut.cz";
$str = file_get_contents($url);

$co = array('<','>','&');
$cim = array('&lt;','&gt;','&amp;');
str_replace($co,$cim,$str);

echo "Načetli jsme stránku:";
echo $str;

Tedy pokud není zakázáno stránku adresovat jako soubor. To bychom potom museli použít http protokol:

$sock = fsockopen("senzor-12110-2.fsid.cvut.cz", 80);   // otevření socketu
  // pošleme požadavek
fputs($sock, "GET /index.asp HTTP/1.1\r\nHost: senzor-12110-2.fsid.cvut.cz\r\n\r\n"); 
$page = "";
while ($line = fgets($sock, 128)) {$page .= $line ;};

$co = array('<','>','&');
$cim = array('&lt;','&gt;','&amp;');
str_replace($co,$cim,$page);

echo "Načetli jsme stránku:";
echo $page;

Odzkoušejte prosím sami.

Poznámka: nechodí na webzdarma (přes //file:, přes http), chodí na iat.fs.cvut.cz (přes //file:, přes http), chodí na serveru FSH, tedy users.fs.cvut.cz (přes //file:, přes http), kde mají školní konta studenti. První (jednodušší) přístup bývá zakázán spíše na serveru, odkud se stránka přebírá - u miniwebserveru senzorové sítě k tomu není důvod.

Zpracování dat do obrázku

Data z výše zmíněného serveru lze také zpracovat jako obrázek, podrobněji viz teplomer.htm.