Vlastní ICQ status v PHP
09.04.2005
Chtěli jste si někdy na web přidat vlastní ikonku se statusem icq? Tak si přečtěte tento návod s přímou ukázkou zdrojových kódů
Zjištění stavu
function icq_online($icq_number){
if($fp = fsockopen("status.icq.com", 80)){
stream_set_timeout($fp, 2);
fputs($fp, "GET /online.gif?icq=".$icq_number."&img=5 HTTP/1.0\r\n\r\n");
$s='';
while($line=FGetS($fp,3)){
$s.=$line;
}
return ereg('online1.gif',$s) ? true : false;
} else {
return false;
}
}
Tato funkce zjistí odpověď ze serveru ICQ a pomocí hlavičky zjistí, zda-li jste on-line nebo off-line. Vrací hodnotu true nebo false. Samozřejmostí je nastavení timeoutu, který zajistí, že pokud nebude možné se připojit na server ICQ do 2 sekund, automaticky se budete považovat za off-line.
Zobrazení obrázku a cache
function get_icq_status($icq_number){
$lifetime = 600;
$cur = dirname(__FILE__).DIRECTORY_SEPARATOR;
$status = $cur.'status.png';
$online = $cur.'online.png';
$offline = $cur.'offline.png';
if(!file_exists($status) || time()-filemtime($status)>$lifetime){
if(icq_online($icq_number)){
copy($online, $status);
} else {
copy($offline, $status);
}
chmod($status, 0777);
}
header('Pragma: no-cache', true);
header('Content-type: image/png', true);
echo file_get_contents($status);
exit();
}
Aby se stav nezjišťoval po každém načtení stránky (což by bylo pěkně pomalé a zvyšovalo by to zátěž serveru), tak se zkopíruje vámi nadefinovaný obrázek do souboru status.png, u kterého se zjišťuje a porovnává datum jeho vytvoření. Je-li soubor starší než 10 minut, aktualizuje se.
Ukázka ke stažení
Kód, který používám na mém serveru již měsíc bez sebemenších výkonnostních problémů si můžete stáhnout jako icq_status.zip [11 kB]
Zdroj
Část kódu byla převzata a upravena z vynikajícího PIFíkova weblogu PHP weblog
Re: Vlastní ICQ status v PHP od Llaik
09.04.2005 #Misto ereg() bych pouzil radeji strpos() - je to vyrazne rychlejsi.
Ale diky zminene cache se to srovnava, hezke pocteni
Re: Vlastní ICQ status v PHP od llook
19.04.2005 #Navíc ten ereg není binary-safe. Teď si nejsem jistý, jestli to neplatí jenom na patterny, ale mám dojem, že veškeré testování končí na prvním null byte v řetězci (protože interně POSIXový regexp pracuje s céčkovskými null-terminated řetězci).
Re: Vlastní ICQ status v PHP od Torai
01.09.2005 #šel by zobrazit i stav INVISIBLE?