PHP: проверка, если файл существует, но @get_headers влияет на трекер - PullRequest
0 голосов
/ 11 февраля 2019

Я использую 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 ]

0 голосов
/ 11 февраля 2019

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

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

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

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

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

if (file_exists($_SERVER["DOCUMENT_ROOT"] . $row['page'])) {
    ....
}
0 голосов
/ 11 февраля 2019

Если вам действительно нужно использовать 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).

...