Nasıl bir uzak dosya PHP kullanarak Varlığından olmadığını görmek için kontrol edebilirim?

13 Cevap php

Ben bulabildiğim iyi bir if fclose fopen şeyi yazın, gerçekten yavaş sayfa yükleme yapar.

Temelde ne yapmaya çalışıyorum şu: Ben web sitelerinin bir listesi var ve ben yanlarında kendi faviconları göstermek istiyorum. Bir site birine sahip değilse, ancak, ben başka bir görüntü ile değiştirmek yerine kırık bir resim görüntülemek istiyorum.

13 Cevap

Sen CURLOPT_NOBODY üzerinden HTTP HEAD yöntemi kullanmak kıvırmak talimat verebilirsiniz.

Az çok

$ch = curl_init("http://www.example.com/favicon.ico");

curl_setopt($ch, CURLOPT_NOBODY, true);
curl_exec($ch);
$retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// $retcode >= 400 -> not found, $retcode = 200, found.
curl_close($ch);

Neyse, sadece HTTP transfer maliyeti değil, TCP bağlantısı kurulması ve kapanış kaydedin. Ve küçük faviconları olmak, çok gelişme görmeyebilirsiniz.

Caching the result locally seems a good idea if it turns out to be too slow. HEAD checks the time of the file, and returns it in the headers. You can do like browsers and get the CURLINFO_FILETIME of the icon. In your cache you can store the URL => [ favicon, timestamp ]. You can then compare the timestamp and reload the favicon.

Pies Eğer cURL kullanabilirsiniz dediği gibi. Sen cURL size sadece başlıkları ve daha hızlı hale getirebilir değil vücut vermek alabilirsiniz. Eğer zaman aşımı isteği bekliyor olacak çünkü kötü etki her zaman bir süre alabilir; muhtemelen cURL kullanarak aşımı süresini değiştirebilir.

Here is example:

function remoteFileExists($url) {
    $curl = curl_init($url);

    //don't fetch the actual page, you only want to check the connection is ok
    curl_setopt($curl, CURLOPT_NOBODY, true);

    //do request
    $result = curl_exec($curl);

    $ret = false;

    //if request did not fail
    if ($result !== false) {
        //if request was ok, check response code
        $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);  

        if ($statusCode == 200) {
            $ret = true;   
        }
    }

    curl_close($curl);

    return $ret;
}

$exists = remoteFileExists('http://stackoverflow.com/favicon.ico');
if ($exists) {
    echo 'file exists';
} else {
    echo 'file does not exist';   
}

Bu orijinal soruya bir cevap, ama yapmanız için çalışıyoruz ne yapmanın daha iyi bir yol değildir:

Bunun yerine (aslında o olabilir belki / favicon.png, / favicon.ico, / favicon.gif, hatta / yol / / favicon.png verilen bir kraliyet ağrı olan) doğrudan sitenin favicon almaya çalışırken, google kullanabilirsiniz:

<img src="http://www.google.com/s2/favicons?domain=[domain]">

Bitti.

CoolGoose çözümü iyi ama (sadece 1 bayt okumaya çalışır gibi) bu büyük dosyalar için daha hızlıdır:

if (false === file_get_contents("http://example.com/path/to/image",0,null,0,1)) {
    $image = $default_image;
}

Eğer görüntüleri ile ilgileniyor, getimagesize kullanabilirsiniz. File_exists aksine, bu yerleşik işlev uzak dosyaları destekler. Bu görüntü bilgilerini (genişlik, yükseklik, tipi vb ..) içeren bir dizi döndürür. Yapmanız gereken tek dizi (genişlik) ilk elemanını kontrol etmektir. çıkışına dizinin içeriği print_r kullanımı

$imageArray = getimagesize("http://www.example.com/image.jpg");
if($imageArray[0])
{
    echo "it's an image and here is the image's info<br>";
    print_r($imageArray);
}
else
{
    echo "invalid image";
}
if (false === file_get_contents("http://example.com/path/to/image")) {
    $image = $default_image;
}

Çalışmak gerektiğini ;)

Radikal bir çözüm varsayılan simgesinin üzerinde bir div arka plan görüntüleri gibi faviconları görüntülemek için olacaktır. Hala (kayıp arka plan görüntüleri AFAIK tüm tarayıcılarda göz ardı edilir) kırık görüntüme değil iken Böylece, tüm havai istemci üzerinde yer olurdu.

Bu file_get_contents Docs bağlamsal seçeneklerine yararlanarak ile mümkündür HTTP durum kodunu (404 = bulunamadı) alarak yapılabilir. Aşağıdaki kod dikkate yönlendirmeleri alır ve nihai hedef durumu kodu dönecektir (Demo):

$url = 'http://example.com/';
$code = FALSE;

$options['http'] = array(
    'method' => "HEAD",
    'ignore_errors' => 1
);

$body = file_get_contents($url, NULL, stream_context_create($options));

foreach($http_response_header as $header)
    sscanf($header, 'HTTP/%*d.%*d %d', $code);

echo "Status code: $code";

Eğer yönlendirmeleri takip etmek istemiyorsanız, bunu yapabilirsiniz benzer (Demo):

$url = 'http://example.com/';
$code = FALSE;

$options['http'] = array(
    'method' => "HEAD",
    'ignore_errors' => 1,
    'max_redirects' => 0
);

$body = file_get_contents($url, NULL, stream_context_create($options));

sscanf($http_response_header[0], 'HTTP/%*d.%*d %d', $code);

echo "Status code: $code";

Fonksiyonlar, seçenekler ve kullanım değişkenlerin bazıları ben yazdım bir blog yazısı daha ayrıntılı olarak izah edilmiştir: HEAD first with PHP Streams.

Dosya uzaktan, is_file() yok bu bir herhangi bir hızlı olup olmadığını bilmiyorum, ama bunu bir atış verebilir.

$favIcon = 'default FavIcon';
if(is_file($remotePath)) {
   $favIcon = file_get_contents($remotePath);
}

Eğer tüm URI içeriğini gerekmez, çünkü bir tane değil, HEAD istekleri çıkarması gerekir. Pies yukarıda söylediğim gibi, (200-299 aralıkları, ve isteğe bağlı 3xx yönlendirmeleri takip edebilir) durum kodu için kontrol etmelisiniz.

Cevaplar yardımcı olabilir kod örnekleri bir sürü içeren soru: http://stackoverflow.com/questions/770179/php-curl-head-request-takes-a-long-time-on-some-sites

Bir daha da sofistike bir alternatif var. Yapabileceğiniz bir JQuery hile kullanarak tüm istemci tarafı kontrol.

$('a[href^="http://"]').filter(function(){
     return this.hostname && this.hostname !== location.hostname;
}).each(function() {
    var link = jQuery(this);
    var faviconURL =
      link.attr('href').replace(/^(http:\/\/[^\/]+).*$/, '$1')+'/favicon.ico';
    var faviconIMG = jQuery('<img src="favicon.png" alt="" />')['appendTo'](link);
    var extImg = new Image();
    extImg.src = faviconURL;
    if (extImg.complete)
      faviconIMG.attr('src', faviconURL);
    else
      extImg.onload = function() { faviconIMG.attr('src', faviconURL); };
});

Dan http://snipplr.com/view/18782/add-a-favicon-near-external-links-with-jquery/ (orijinal blog halen aşağı)

Sen kullanabilirsiniz:

$url=getimagesize(“http://www.flickr.com/photos/27505599@N07/2564389539/”);

if(!is_array($url))
{
   $default_image =”…/directoryFolder/junal.jpg”;
}

PHP's inbuilt functions may not work for checking URL if allow_url_fopen ayar, güvenlik nedeniyle kapalı olarak ayarlanmıştır. Curl biz sonraki aşamada bizim kodunu değiştirmek gerek olmaz gibi daha iyi bir seçenektir. Aşağıda geçerli bir URL doğrulamak için kullanılan kod:

$url = str_replace(' ', '%20', $url);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);  
curl_close($ch);
if($httpcode>=200 && $httpcode<300){  return true; } else { return false; } 

Nazik Ayrıca URL HTTPS ile başlayan doğrulamak CURLOPT_SSL_VERIFYPEER seçeneğini unutmayın.