Быстрая проверка на наличие файла на удаленном хосте

gr1nader
На сайте с 26.10.2012
Offline
20
7381

Суть такова есть некий парсер который парсит ссылки с jpeg файлами, далее ссылки выдает в масив, однако не по всем ссылкам есть jpeg файлы иногда их нет вообще а иногда банальный редирект на страницу html, как по быстрому проверить наличие файла по ссылкам из масива?

пробовал так:

1. вариант проверяет долго и сервак умирает иногда не доходит до конца проверки не подошел:

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, "$file");
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_FILETIME, true);
curl_setopt($curl, CURLOPT_NOBODY, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$header = curl_exec($curl);
$info = curl_getinfo($curl, CURLINFO_CONTENT_TYPE);
curl_close($curl);

$mimes = array('image/jpeg','image/pjpeg');
if (in_array($info, $mimes)) {
//
}

2. вариант имхо не очень так как проверяет на наличие файла а не на майм работает быстрее немного чем первый но все равно ужасно медленно

$fileexist = (get_headers($p));	

$serverheader = array('HTTP/1.0 200 OK');
if (in_array($fileexist[0], $serverheader)) {
}

подскажите как оптимизировать/ускорить, на выдаваемой странице в конце идет пейджинг может быть по странично както или рабить на пакеты буду благодарен за ваши предложения с примерами, спасибо.

OK
[Удален]
#1


for ($i=0; $i<count($pic_array); $i++)
{
$pic = @file_get_contents ($pic_array[$i]);
if ($pic)
{
//картинка существует
}
else
{
//картинка не существует
}
}

Если картинки не нужно загружать - вместо file_get_contents используйте fopen ($pic_array[$i], "r"); и закрывайте файл после проверки @fclose($pic);

IL
На сайте с 20.04.2007
Offline
435
#2
gr1nader:
как оптимизировать/ускорить,

CURLOPT_TIMEOUT

gr1nader:
на выдаваемой странице в конце идет пейджинг может быть по странично както или рабить на пакеты

Я полагаю, "пейджинг" рассчитывается не на основе напарсенного в реальном времени? Или скрипт пытается качать все "много" картинок и потом ещё на странички разбивает? Хотя, если всё это не для всегобщего обозрения (админка?), то промежуточное сохранение результатов смысла не имеет.

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
gr1nader
На сайте с 26.10.2012
Offline
20
#3

ivan-lev, спасибо както не подумал об этом сразу об CURLOPT_TIMEOUT, качает все наживую и выдает, кешированием сейчас занимаюсь

G
На сайте с 16.02.2011
Offline
42
#4

Ускорить можно использую мультикурл (несколько потоков),

Когда-то делал так

function s_curl($urls){

$uagent = "Opera/9.80 (Windows NT 6.1; U; MRA 5.7 (build 03755); ru) Presto/2.6.30 Version/10.63";
$cmh = curl_multi_init();
$tasks = array();
foreach ($urls as $url) {
$site = str_replace('http://', '', $url);
$site = str_replace('www.', '', $site);
$site = substr($site, 0, stripos($site,'.'));
$site = $_SERVER['DOCUMENT_ROOT'].'/'.$site.'.txt';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); // если будет редирект - непереходим
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // возвращать результат
curl_setopt($ch, CURLOPT_HEADER, 0); // не возвращать http-заголовок
curl_setopt($ch, CURLOPT_ENCODING, ""); // обрабатывает все кодировки
curl_setopt($ch, CURLOPT_USERAGENT, $uagent); // браузер
if (is_file($site)){
curl_setopt($ch, CURLOPT_COOKIEFILE, $site); // куки
curl_setopt($ch, CURLOPT_COOKIEJAR, $site); //
}
curl_setopt($ch, CURLOPT_REFERER, $url); // реферер
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); // таймаут соединения
curl_setopt($ch, CURLOPT_TIMEOUT, 10); // таймаут ожидания
$tasks[$url] = $ch; // добавляем дескриптор потока в массив заданий
curl_multi_add_handle($cmh, $ch); // добавляем дескриптор потока в мультикурл
}
$active = null;

do {
$mrc = curl_multi_exec($cmh, $active);
}
while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && ($mrc == CURLM_OK)) {
if (curl_multi_select($cmh) != -1) {
do {
$mrc = curl_multi_exec($cmh, $active);
$info = curl_multi_info_read($cmh);
if ($info['msg'] == CURLMSG_DONE) {
$ch = $info['handle'];
$url = array_search($ch, $tasks);
$tasks[$url] = curl_multi_getcontent($ch);
curl_multi_remove_handle($cmh, $ch);
curl_close($ch);
}
}
while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
// закрываем мультикурл
curl_multi_close($cmh);
return $tasks;
}
*В коде визивиг сожрал квадратные скобки - замените ***91; и ***93.

Собственно вопрос редиректа тут тоже решен.

По поводу того что это, может не картинка - стоит проверить заголовки (CURLOPT_HEADER)

и после скачивания проверять картинку: http://habrahabr.ru/post/44610/ а то мало ли)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий