Предположим, у вас есть переменная user
, которая является экземпляром модели User, но это будет работать для любого экземпляра модели mongoose var Model = user.constructor;
, теперь вы можете выполнить Model.find()
, чтобы выполнить свой запрос, и это будет работать для любой коллекции. .
Если вам нужно название модели, к ней можно обратиться через user.constructor.modelName
.
Вы можете указать 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 => [значок, временная метка]. Затем вы можете сравнить отметку времени и перезагрузить значок.
Не знаю, быстрее ли этот, когда файл не существует удаленно, is_file () , но вы можете попробовать.
$favIcon = 'default FavIcon';
if(is_file($remotePath)) {
$favIcon = file_get_contents($remotePath);
}
Вам следует отправлять запросы HEAD, а не GET, потому что вам вообще не нужно содержимое URI. Как сказал выше Pies, вам следует проверить код состояния (в диапазонах 200–299, при желании вы можете следовать перенаправлениям 3xx).
Ответы на вопросы содержат множество примеров кода, которые могут быть полезны: PHP / Curl : HEAD Запрос занимает много времени на некоторых сайтах
if (false === file_get_contents("http://example.com/path/to/image")) {
$image = $default_image;
}
Должно работать;)
Радикальным решением было бы отображать значки в виде фоновых изображений в блоке div над значком по умолчанию. Таким образом, все накладные расходы будут возложены на клиента, но при этом не будут отображаться битые изображения (отсутствующие фоновые изображения игнорируются во всех браузерах AFAIK).
Как говорят Пироги, вы можете использовать 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';
}
Есть еще более сложная альтернатива. Вы можете проверить все на стороне клиента, используя трюк 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/ (исходный блог в настоящее время недоступен)
Раствор CoolGoose хорош, но это быстрее для больших файлов (как только пытается прочитать 1 байт):
if (false === file_get_contents("http://example.com/path/to/image",0,null,0,1)) {
$image = $default_image;
}
Это не ответ на ваш первоначальный вопрос, но лучший способ сделать то, что вы пытаетесь сделать:
Вместо того, чтобы пытаться получить фавикон сайта напрямую (что является большой проблемой, учитывая, что он может быть /favicon.png, /favicon.ico, /favicon.gif или даже /path/to/favicon.png), используйте google:
<img src="http://www.google.com/s2/favicons?domain=[domain]">
Готово.