Почему PHP различает расширения .php и .abc для кэширования? - PullRequest
9 голосов
/ 21 декабря 2010

Кажется, существует проблема между тем, как движок PHP обрабатывает идентичные файлы, которые отличаются только по расширению.

Проблема: "Условный запрос If-Modified-Since вернул весь контент без изменений."

Кроме того, я измерил, что расширение .php загружается намного быстрее, чем идентичный twin с расширением .xxx, даже если содержимое файла идентично, и они различаются только по расширению.

alt text

alt text

"HTTP позволяет клиентам делать условные запросы, чтобы проверить, действительна ли имеющаяся у них копия. Поскольку этот ответ имеет Last-Измененный заголовок, клиенты должны иметь возможность использовать заголовок запроса If-Modified-Since для проверки. RED сделал это и обнаружил, что ресурс отправляет полный ответ, даже если он не изменился, указывая, что он не поддерживает Last-Измененная проверка. "


домашняя страница, заканчивающаяся .php

alt text


точно таким же файлом, но еnding .ast

alt text


Учитывая:

Файл home.php копируется как home.xxx и это расширениедобавлен в htaccess, чтобы распознать его как файл PHP.Файл .php прослушивает php.ini, где свежесть установлена ​​на 3 часа, файлы не .php должны прослушивать htaccess, где свежесть устанавливается на 2 часа в соответствии с:

AddType application/x-httpd-php .php .ast .abc .xxx .etc

<IfModule mod_headers.c>
    ExpiresActive On
    ExpiresDefault M2419200
    Header unset ETag
    FileETag None
    Header unset Pragma
    Header set Cache-Control "max-age=2419200"

    ##### DYNAMIC PAGES
    <FilesMatch "\\.(ast|php|abc|xxx)$">
        ExpiresDefault M7200
        Header set Cache-Control "public, max-age=7200"
    </FilesMatch>
</IfModule>

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

Весь page.php загружается быстрее, так как каким-то образом все элементы в нем загружаются из кеша должным образом, в то время как page.abc возвращает полный запросв то время как он должен быть кэширован, что означает, что вся страница медленнее.

Итог: что нужно изменить, чтобы исключить условный запрос If-Modified-Since, возвращающий весь контент без изменений?

1 Ответ

2 голосов
/ 21 декабря 2010

Похоже, у вашего сервера возникли проблемы с определением того, как расшифровать расширение, поскольку это не .php.Даже если вы определили расширение для распознавания как php в своем httpacess, серверу все еще требуются дополнительные шаги для обработки страницы, что означает, что это всегда займет больше времени, чем просто использование .php (хотя разница должна составлять всего несколько мс, скорее всего, проблема с сервером приводит к тому, что это займет гораздо больше времени).Почему бы просто не использовать расширение .php на своих страницах?Зачем вам нужен .abc?Всегда лучше использовать расширение по умолчанию, а не маскировать его.

РЕДАКТИРОВАТЬ: поместите эту функцию в верхней части каждой страницы, она будет определять, какое доменное имя имеет пользователь, убрать расширение www и расширение домена изатем отображать контент только для этого конкретного доменного имени.Вы можете использовать один и тот же файл .php для каждого доменного имени, и вам не нужно делать никаких расширений.

<?php
$domain = explode(".", $_SERVER['SERVER_NAME']);
if ($domain[2]) {
    $domainName = $domain[1];
}
else {
    $domainName = $domain[0];
}

if ($domainName = "YourDomainNameWithNoExtension") {
    echo "Welcome to $domainName";
}
?>
...