Комментарии 79
А зачем тут preg_match?
0
можно и strpos() — суть статьи не в этом, согласитесь ;)
+3
Просто раз уже вы сравнивали скорость, то, возможно, со strpos() обработка была бы быстрее :)
Но это так, мелочи. =)
Так уж сложилось, что я стараюсь избегать preg'ов, ereg'ов в поиске текста :)
Но это так, мелочи. =)
Так уж сложилось, что я стараюсь избегать preg'ов, ereg'ов в поиске текста :)
0
да, соглашусь, что быстрее будет с strpos() и тогда еще немного больше выигрыш в скорости — отрудактирую соответственно статью ;)
0
вообще регэкспы очень быстрые. когда идет речь о том, чтобы делать http запрос — избавляться от регэкспа — оптимизация сотых долей процента.
+4
В вашей точке зрения есть проблема — вы говорите о замене регэкспа strposом как об оптимизации. Ситуация же иная — замена strposа регэкспом тут — извращение и самого начало написать
0
preg_match('/const/', $a)
это не очень хорошо.
Ведь даже в документации большими буквами написано:
Do not use preg_match() if you only want to check if one string is contained in another string. Use strpos() or strstr() instead as they will be faster.
0
да неважно что там написано. регэкспы быстрые, и понятные.
-3
Чем
(я минусами не бросаюсь ._.)
preg_match('/const/', $a)
понятнее strpos($a, 'const') !== false
?(я минусами не бросаюсь ._.)
+2
В последнем блоке кода ошибка.
У вас все время не будет существовать файла, исправте пожалуйста :)
$Headers = @get_headers($url);
if(preg_match("|200|", $AgetHeaders[0]))
У вас все время не будет существовать файла, исправте пожалуйста :)
+4
лучше использовать реализацию через curl или fopen. Так как можно указать больше отправляемых параметров. Допустим некоторые сайты не отдают контент если не получен заголовок «User-Agent».
0
две сотые секунды вам погоду сделают? учитывая еще что это больше от загруженности сети зависит…
0
при большом количестве запросов будет расти и совокупное время
и если преследуем одну цель, почему же не выбрать метод быстрее. ;)
и если преследуем одну цель, почему же не выбрать метод быстрее. ;)
-2
Если нам надо брать файл, то fopen дает выигрыш, т.к. повторно не надо открывать(file_get_contents), если просто проверяем ТО используем getimagesize.
Тесты linux php 5.2.6
microtime file exists = true
file_exists 1.91
fopen 0.27
get_headers 0.31
getimagesize 0.22
microtime file exists = false
file_exists 2.2
fopen 0.21
get_headers 0.22
getimagesize 0.16
p.s.бралось время отдачи без парсинга
Тесты linux php 5.2.6
microtime file exists = true
file_exists 1.91
fopen 0.27
get_headers 0.31
getimagesize 0.22
microtime file exists = false
file_exists 2.2
fopen 0.21
get_headers 0.22
getimagesize 0.16
p.s.бралось время отдачи без парсинга
0
Оптимизация начинается с поиска узких мест.
А оптимизация ради оптимизации это так, рукоблудство.
А оптимизация ради оптимизации это так, рукоблудство.
+1
спасибо. когда-нибудь пригодится.
0
Вы бы уже сишный модуль с ассемблерными ставками написали, глядишь так еще быстрее и надежнее будет :)
Кстати, через системные функции мне кажется быстрее, все равно пхп — обертка :)
Кстати, через системные функции мне кажется быстрее, все равно пхп — обертка :)
+1
а если удаленный сервер не доступен?
0
В следующий раз напишите статью на тему «Стопицот способов вывести значение переменой». А серьезно — может быть хватит уже чепуху постить? Кому это нужно?
+9
habracut plz
0
0
когда я тестил, у меня вышло, что curl значительно быстрее get_headers
0
хабракат?
0
Не хватает //} :)
0
к сожалению, ваш способ ужасен по самой сути.
вы для проверки существования файла открываете два сокета, один настороне клиента, другой — на стороне сервера. при большом количестве таких запросов вы рискуете упереться во множество интересных ограничений.
кроме того, для проверки файла без его открытия есть команда stat. которая будет работать ощутимо быстрее любого из ваших способов. учите матчасть!
вы для проверки существования файла открываете два сокета, один настороне клиента, другой — на стороне сервера. при большом количестве таких запросов вы рискуете упереться во множество интересных ограничений.
кроме того, для проверки файла без его открытия есть команда stat. которая будет работать ощутимо быстрее любого из ваших способов. учите матчасть!
+4
Мгм, а команда stat позволяет проверить наличие файла на удаленном сервере без открытия сокетов? :)
0
да, согласен, что ошибся. но ответить самому себе я не смог, так как хабр мне предложил подождать пять минут, прежде я смогу отправить еще один комментарий.
тем не менее, проверять файлы таким образом — все равно ужасно. потому что на каждую генерацию страницы с ссылками на внешние ресурсы будет затрачено очень большое количество синхронных соединений. и времени тоже. в качестве примера можно привести пример такого рода: проверяется наличие файла на сервере, у которого очередь на i/o очень велика. тогда пока вы не исчерпаете таймаут, ваш скрипт не отработает. а в силу того, что таймауты по умолчанию зачастую стоят одинаковые, пользователь тоже не увидит страницу
тем не менее, проверять файлы таким образом — все равно ужасно. потому что на каждую генерацию страницы с ссылками на внешние ресурсы будет затрачено очень большое количество синхронных соединений. и времени тоже. в качестве примера можно привести пример такого рода: проверяется наличие файла на сервере, у которого очередь на i/o очень велика. тогда пока вы не исчерпаете таймаут, ваш скрипт не отработает. а в силу того, что таймауты по умолчанию зачастую стоят одинаковые, пользователь тоже не увидит страницу
0
is_file неужели медленнее?
0
НЛО прилетело и опубликовало эту надпись здесь
Бред какой-то. Еще быстрее, кстати shutdown()'ить сокет после первой же строки ответа (с кодом) от сервера, зачем нам все заголовки?
Вообще первым абзацем стоило бы понятно написать какую задачу имеено вы хотите решить указанным кодом.
p.s. Вы что, хотите делать 2 запроса? убедиться первым, что файл существует, а вторым скачать? А смысл?
Еще. Если вы при запросе пользователя сами делаете HTTP-запрос, с ростом аудитории ваше приложение будет тормозить. я конечно не знаю, что там у вас, но научитесь хранить контент на своем сервере.
Вообще первым абзацем стоило бы понятно написать какую задачу имеено вы хотите решить указанным кодом.
p.s. Вы что, хотите делать 2 запроса? убедиться первым, что файл существует, а вторым скачать? А смысл?
Еще. Если вы при запросе пользователя сами делаете HTTP-запрос, с ростом аудитории ваше приложение будет тормозить. я конечно не знаю, что там у вас, но научитесь хранить контент на своем сервере.
0
сразу возникают вопросы — а что с ошибками будете делать? а с таймаутами? а с перенаправлениями?
ну и, конечно, вы не предлагаете использовать этот код при обслуживании клиентских запросов. максимум — регулярный вызов по крону, я правильно понял? надеюсь, что да.
ну и, конечно, вы не предлагаете использовать этот код при обслуживании клиентских запросов. максимум — регулярный вызов по крону, я правильно понял? надеюсь, что да.
0
автор, откройте для себя HEAD
+3
А вот интересно, при помощи этой функции, можно вытащить из удаленной мп3 информацию о битрейте, теги какие-нибудь и так далее? *ушел в гугл*
Мне кажется эта функция сильно полезней fopen и других, в тех случаях, когда сам файл большой, а не как иконка, весом в килобайт.
Мне кажется эта функция сильно полезней fopen и других, в тех случаях, когда сам файл большой, а не как иконка, весом в килобайт.
-1
никак эта функция вам не поможет — автор написал бред.
битрейт содержится в первых нескольких кб файла (насколько я помню mp3) — так что вам нужно лишь скачать эту часть файла (любым из доступных способов: сокеты, курл, файловые функции, ...) и распарсить.
битрейт содержится в первых нескольких кб файла (насколько я помню mp3) — так что вам нужно лишь скачать эту часть файла (любым из доступных способов: сокеты, курл, файловые функции, ...) и распарсить.
+1
Да, действительно. Но эти теги содержаться либо в первых нескольких байтах (для первой версии) и в последних (для второй).
Спасибо за ответ:)
Спасибо за ответ:)
0
или в самом конце файла… зависит от версии тегов
0
НЛО прилетело и опубликовало эту надпись здесь
> if(strpos('200', $Headers[0])) {
HTTP/1.1 404 I have 200 other files but not this one
…
упс :)
текст после кода не регламентирован стандартом и может содержать всё что угодно.
HTTP/1.1 404 I have 200 other files but not this one
…
упс :)
текст после кода не регламентирован стандартом и может содержать всё что угодно.
+12
Миллисекунды за счет выбора функции получил, а за счет двойного запроса к стороннему серверу ( 1. проверка наличия файла, 2. вывод его на странице ) — не меньше потерял.
+1
HTTP/1.1 404 I have 200 other files but not this oneАга, а еще в конце — «Ok?» :)
+1
Я думаю, что также работают хостинг компании, у которых можно проверить место под домен занято или нет.
-2
Коллеги, что эта статья делает на главной?
+8
А почему никто не написал бредовость самой идеи проверять наличие ФАЙЛА на УДАЛЕННОЙ системе через протокол, который не знает, что такое файлы в принципе?
+1
Как раз собирался написать коммент в этом ключе, но вы меня опередили.
Такое впечатление, что автор вообще слабо себе представляет, что такое HTTP.
В HTTP вообще нет файлов, есть только ресурсы.
Любая динамическая страница, которую генерирует тот же PHP-шный скрипт — это никакой не файл, а ресурс.
Если цель была проверить наличие ресурса на удаленном сервере через HTTP, данный способ хоть и кривой и дырявый (как уже заметили выше), но более- менее рабочий.
Если же стоит цель проверить именно наличие файла на удаленном сервере, то нужно юзать совершенно другие протоколы, предназначенные для работы с файлами, например FTP.
Такое впечатление, что автор вообще слабо себе представляет, что такое HTTP.
В HTTP вообще нет файлов, есть только ресурсы.
Любая динамическая страница, которую генерирует тот же PHP-шный скрипт — это никакой не файл, а ресурс.
Если цель была проверить наличие ресурса на удаленном сервере через HTTP, данный способ хоть и кривой и дырявый (как уже заметили выше), но более- менее рабочий.
Если же стоит цель проверить именно наличие файла на удаленном сервере, то нужно юзать совершенно другие протоколы, предназначенные для работы с файлами, например FTP.
+1
интересно, а если при отсутствии файла сервер сообщает не 404, а делает редирект на главную страницу и ответ 200?
0
Такое в браузере делать надо, зачем сервер зря напрягать.
<img src="путь к картинке" onerror="alert('Тут я как бы сообщаю, что картинка по какой-либо причине не хочет грузиться, хотя можно, например, подсунуть дефолтную картинку.')">
<img src="путь к картинке" onerror="alert('Тут я как бы сообщаю, что картинка по какой-либо причине не хочет грузиться, хотя можно, например, подсунуть дефолтную картинку.')">
+1
Вы в strpos перепутали needle и haystack.
Надо не strpos('200', $Headers[0]), а strpos($Headers[0], '200')
Надо не strpos('200', $Headers[0]), а strpos($Headers[0], '200')
0
function remote_file_exists($url){
return (bool)preg_match('~HTTP/1\.\d\s+200\s+OK~', @current(get_headers($url)));
}
работает как часы
return (bool)preg_match('~HTTP/1\.\d\s+200\s+OK~', @current(get_headers($url)));
}
работает как часы
0
А почему нельзя было воспользоваться функцией file_exists(), она медленнее?? Судя по коментам ей больше 9 лет
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Проверка файла на наличие / существование