URL or path/to/cached/file // ===================================================== function getFavicon($url) { $useCache = TRUE; $cacheTime = 86400; // seconds to expire $cacheDir = '/images/cache'; $cacheFile = md5($url).'.ico'; $cache = join( DIRECTORY_SEPARATOR, array( $_SERVER['DOCUMENT_ROOT'], $cacheDir, $cacheFile )); $cacheRel = join( DIRECTORY_SEPARATOR, array( $cacheDir, $cacheFile )); $url = strpos($url,'http://') ? $url : 'http://'.$url; // Serve from the cache if it is younger than $cacheTime if (file_exists($cache) && time() - $cacheTime < filemtime($cache) && $useCache) { return $cacheRel; exit; } // first request URL $HTTPRequest = @fopen($url, 'r'); if ($HTTPRequest) { stream_set_timeout($HTTPRequest, 0, 500); $html = fread($HTTPRequest, 4096); $HTTPRequestData = stream_get_meta_data($HTTPRequest); fclose($HTTPRequest); if (!$HTTPRequestData['timed_out']) { if (preg_match('/]+rel="(?:shortcut )?icon"[^>]+?href="([^"]+?)"/si', $html, $matches)) { $linkUrl = html_entity_decode($matches[1]); if (substr($linkUrl, 0, 1) == '/') { $urlParts = parse_url($url); $faviconURL = $urlParts['scheme'].'://'.$urlParts['host'].$linkUrl; } elseif (substr($linkUrl, 0, 7) == 'http://') { $faviconURL = $linkUrl; } elseif (substr($url, -1, 1) == '/') { $faviconURL = $url.$linkUrl; } else { $faviconURL = $url.'/'.$linkUrl; } } else { $urlParts = parse_url($url); $faviconURL = $urlParts['scheme'].'://'.$urlParts['host'].'/favicon.ico'; } // then request favicon URL $HTTPRequest = @fopen($faviconURL, 'r'); if ($HTTPRequest) { stream_set_timeout($HTTPRequest, 0, 500); $favicon = fread($HTTPRequest, 8192); $HTTPRequestData = stream_get_meta_data($HTTPRequest); fclose($HTTPRequest); if (!$HTTPRequestData['timed_out'] && strlen($favicon) < 8192) { if ($useCache) { // Cache the output to a file $fp = fopen($cache, 'w'); fwrite($fp, $favicon); fclose($fp); } return $faviconURL; } } } } return false; } ?>