Как можно проверить, чтобы видеть, существует ли удаленный файл с помощью PHP?

Предположим, у вас есть переменная user, которая является экземпляром модели User, но это будет работать для любого экземпляра модели mongoose var Model = user.constructor;, теперь вы можете выполнить Model.find(), чтобы выполнить свой запрос, и это будет работать для любой коллекции. .

Если вам нужно название модели, к ней можно обратиться через user.constructor.modelName.

83
задан 14 November 2011 в 23:42
поделиться

9 ответов

Вы можете указать curl использовать метод HTTP HEAD через CURLOPT_NOBODY.

Более или менее

$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);

В любом случае, вы экономите только на HTTP-передаче, но не на установлении и закрытии TCP-соединения. И, будучи маленькими значками, вы можете не увидеть значительных улучшений.

Кэширование результата локально кажется хорошей идеей, если он оказывается слишком медленным. HEAD проверяет время файла и возвращает его в заголовках. Вы можете работать как браузеры и получать CURLINFO_FILETIME значка. В вашем кеше вы можете сохранить URL => [значок, временная метка]. Затем вы можете сравнить отметку времени и перезагрузить значок.

131
ответ дан 24 November 2019 в 08:40
поделиться

Не знаю, быстрее ли этот, когда файл не существует удаленно, is_file () , но вы можете попробовать.

$favIcon = 'default FavIcon';
if(is_file($remotePath)) {
   $favIcon = file_get_contents($remotePath);
}
0
ответ дан 24 November 2019 в 08:40
поделиться

Вам следует отправлять запросы HEAD, а не GET, потому что вам вообще не нужно содержимое URI. Как сказал выше Pies, вам следует проверить код состояния (в диапазонах 200–299, при желании вы можете следовать перенаправлениям 3xx).

Ответы на вопросы содержат множество примеров кода, которые могут быть полезны: PHP / Curl : HEAD Запрос занимает много времени на некоторых сайтах

1
ответ дан 24 November 2019 в 08:40
поделиться
if (false === file_get_contents("http://example.com/path/to/image")) {
    $image = $default_image;
}

Должно работать;)

6
ответ дан 24 November 2019 в 08:40
поделиться

Радикальным решением было бы отображать значки в виде фоновых изображений в блоке div над значком по умолчанию. Таким образом, все накладные расходы будут возложены на клиента, но при этом не будут отображаться битые изображения (отсутствующие фоновые изображения игнорируются во всех браузерах AFAIK).

4
ответ дан 24 November 2019 в 08:40
поделиться

Как говорят Пироги, вы можете использовать cURL. Вы можете заставить cURL выдавать только заголовки, но не тело, что может ускорить работу. Плохой домен всегда может занять некоторое время, потому что вы будете ждать тайм-аута запроса; вероятно, вы могли бы изменить длину тайм-аута с помощью cURL.

Вот пример:

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';   
}
60
ответ дан 24 November 2019 в 08:40
поделиться

Есть еще более сложная альтернатива. Вы можете проверить все на стороне клиента, используя трюк JQuery.

$('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); };
});

Из http://snipplr.com/view/18782/add-a-favicon-near-external-links-with-jquery/ (исходный блог в настоящее время недоступен)

1
ответ дан 24 November 2019 в 08:40
поделиться

Раствор CoolGoose хорош, но это быстрее для больших файлов (как только пытается прочитать 1 байт):

if (false === file_get_contents("http://example.com/path/to/image",0,null,0,1)) {
    $image = $default_image;
}
34
ответ дан 24 November 2019 в 08:40
поделиться

Это не ответ на ваш первоначальный вопрос, но лучший способ сделать то, что вы пытаетесь сделать:

Вместо того, чтобы пытаться получить фавикон сайта напрямую (что является большой проблемой, учитывая, что он может быть /favicon.png, /favicon.ico, /favicon.gif или даже /path/to/favicon.png), используйте google:

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

Готово.

27
ответ дан 24 November 2019 в 08:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: