PHP: проверка, если файл существует, но @get_headers влияет на трекер

Я использую PHP, чтобы проверить, существует ли файл .html на сервере. Тем не менее, @get_headers, кажется, «посещает» страницу, когда проверяет файл, и мой скрипт отслеживания, который создает аналитический отчет, выбирает это как просмотр страницы. Есть ли другой способ проверить, существует ли файл без этого? Вот код, который я сейчас использую:

$file = "https://www." . $_SERVER['HTTP_HOST'] . $row['page'];
$file_headers = @get_headers($file);
if(!$file_headers || $file_headers[0] == 'HTTP/1.1 404 Not Found') {
$file_exists = false;
}
else {
$file_exists = true;
}

2

Решение

@get_headers, кажется, «посещает» страницу, когда проверяет файл

Это именно то, что он делает, да.

Есть ли другой способ проверить, существует ли файл без этого?

Проверяя, существует ли файл. Сейчас вы проверяете, «возвращает ли URL-адрес ошибку при запросе».

Если у вас нет специальных перезаписей URL, вы можете сделать это с помощью:

if (file_exists($_SERVER["DOCUMENT_ROOT"] . $row['page'])) {
....
}
4

Другие решения

Если вам действительно нужно использовать get_headers вы можете найти Пример №2 в документации полезно.

Короче: get_header по умолчанию использует GET запросы (которые, безусловно, — является просмотр страницы).

Пример № 2 для справки:

<?php
// By default get_headers uses a GET request to fetch the headers. If you
// want to send a HEAD request instead, you can do so using a stream context:
stream_context_set_default(
array(
'http' => array(
'method' => 'HEAD'
)
)
);
$headers = get_headers('http://example.com');
?>

Хотя я предпочитаю не изменять контекст потока по умолчанию, поэтому я бы предложил создать свой собственный:

<?php
$context = stream_context_create(
array(
'http' => array(
'method' => 'HEAD'
)
)
);

$headers = get_headers('http://example.com', 0, $context);
?>

Работает ли это или нет, в основном зависит от вашего аналитического программного обеспечения (т.е. различает ли оно запросы GET и HEAD).

1

По вопросам рекламы [email protected]