Проверяем, существует ли ресурс HTTP с помощью PHP

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

Это может быть изображение, которое, как он ожидает, существует на удаленном сервере, или ссылка на сайт, которую пользователь скопировал и вставил в поле формы.

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

Чаще всего они будут пытаться загрузить ресурс, используя что-то вроде file_get_contents:

<?php

$resourceUrl = 'http://example.com/img/large-image-34.jpg';

$resourceExists = false;
if(file_get_contents($resourceUrl) !== false){
    $resourceExists = true;
}

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

Использование cURL

Одна из замечательных особенностей cURL заключается в том, что она имеет опцию CURLOPT_NOBODY, которая позволяет вам отправлять HEAD запрос:

Метод HEAD идентичен GET за исключением того, что сервер НЕ ДОЛЖЕН возвращать тело сообщения в ответе. Метаинформация, содержащаяся в заголовках HTTP в ответ на запрос HEAD ДОЛЖНА быть идентична информации, отправленной в ответ на запрос GET.

Этот метод может быть использован для получения метаинформации о сущности, подразумеваемой запросом, без передачи самого сущности-тела. Данный метод часто используется для проверки гипертекстовых ссылок на валидность, доступность и недавние изменения.

w3.org

В принципе, HEAD запрос позволит вам проверить, существует ли ресурс, не скачивая его. В PHP этот тип запроса может быть выполнен подобным образом:

<?php

$resourceUrl = 'http://example.com/vid/large-video.mp4';
$resourceExists = false;

$ch = curl_init($resourceUrl);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_exec($ch);
$statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

// 200 = OK
if($statusCode == '200'){
    $resourceExists = true;
}

Как вы, наверное, можете себе представить, скачивать большое видео на PHP только для того, чтобы подтвердить его существование, было бы безумием!

Наверх ↑

Сергей Ермилов

Создаю веб-проекты, придумываю идеи, занимаюсь разработкой, оптимизирую и продвигаю сайты. Первые шаги в этом направлении были сделаны в 2008 году. Если у вас есть какие-то идеи или вы хотите что-то предложить, то пишите мне и моей команде.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вы можете использовать HTML теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>