Проблема динамического кэширования файлов в PHP - PullRequest
0 голосов
/ 17 сентября 2011

У меня есть несколько файлов CSS и JS, которые динамически генерируются PHP с использованием этого в моем .htaccess:

AddHandler application/x-httpd-php .css .js

А затем внутри файлов, например:

<?PHP if ($Browser == 'msie') { ?>
.bind('selectstart', function(event) { [...] })
<?PHP } ?>

В верхней части их (первая строка) я использую условное получение, основанное на заголовке Last-Modified, например:

<?PHP if (FileIsCached(getlastmod())) die(); ?>

Это функция:

public static function FileIsCached($Timestamp)
{
    $LastModified = substr(date('r', $Timestamp), 0, -5).'GMT';
    $IfModifiedSince = (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] : false);

    if (($Semicolon = strrpos($IfModifiedSince, ';')) !== false)
        $IfModifiedSince = substr($IfModifiedSince, 0, $Semicolon);

    header('Last-Modified: '.$LastModified);

    if (!$IfModifiedSince || ($IfModifiedSince != $LastModified))
        return false;

    header('HTTP/1.1 304 Not Modified');

    return true;
}

Я не знаюНе нужно проверять кодировку, потому что я использую автоматическое gzip внутри моего php.ini:

 output_handler = ob_gzhandler

Я обычно помещаю их в свой index.php так:

<script type="<?PHP echo $JavascriptMIME; ?>" src="/script.js"></script>

Все работает какОчарование ... это мой первый заголовок ответа на загрузку:

HTTP/1.1 200 OK
Date: Fri, 16 Sep 2011 21:21:51 GMT
Last-Modified: Fri, 16 Sep 2011 19:25:37 GMT
Content-Encoding: gzip
Vary: Accept-Encoding
Cache-Control: max-age=31536000, public
Expires: Sat, 15 Sep 2012 21:21:51 GMT
Content-Type: application/javascript
Content-Length: 6161
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive

Это мой кешированный заголовок ответа:

HTTP/1.1 304 Not Modified
Date: Fri, 16 Sep 2011 21:24:39 GMT
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
Expires: Sat, 15 Sep 2012 21:24:39 GMT
Cache-Control: max-age=31536000, public
Vary: Accept-Encoding

Проблема в том, что иногда данные HTTP, похоже, портятся,может быть, с помощью gzip-контента или чего-то подобного.Сетевая консоль Chrome иногда показывает следующую ошибку: «Ресурс интерпретируется как« Другой », но передается с неопределенным типом MIME».Mozilla иногда делает 2 запроса на index.php или пытается загрузить его с подсказкой загрузки.Иногда файловые запросы останавливаются на 5, когда я обычно загружаю 7 файлов, а содержимое последнего загруженного файла портится как:

���������ÿÿ���������HTTP/1.1 200 OK
Date: Fri, 16 Sep 2011 19:53:26 GMT
Server: Apache/2.2.17 (Win32) PHP/5.3.6
X-Powered-By: PHP/5.3.6
Cache-Control: must-revalidate, no-cache, no-store, private, public
Cache-Control: max-age=0, max-stale=0, post-check=0, pre-check=0
Expires: Wed, 11 Apr 1984 18:36:00 GMT
Expires: 0
Last-Modified: Fri, 16 Sep 2011 19:53:26 GMT
Pragma: no-cache
Content-Encoding: gzip
Vary: Accept-Encoding
Content-Type: application/javascript
Content-Length: 674
Keep-Alive: timeout=5, max=99
Connection: Keep-Alive
....

Что это может быть?

1 Ответ

0 голосов
/ 17 сентября 2011

Попробуйте отключить обработчик вывода в PHP и посмотрите, все ли работает правильно.

Я нашел этот комментарий на странице руководства php, это, вероятно, то, с чем вы столкнулись.

Вы можете попробовать это, и если это проблема, используйте Apache SetOutputFilter, чтобы сжать содержимое для вас, добавив следующее в httpd.conf вместо того, чтобы PHP делал это

<Location />
# Insert filter
SetOutputFilter DEFLATE

# Netscape 4.x has some problems...
BrowserMatch ^Mozilla/4 gzip-only-text/html

# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip

# MSIE masquerades as Netscape, but it is fine
# BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

# NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48
# the above regex won't work. You can use the following
# workaround to get the desired effect:
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# Don't compress images
SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png)$ no-gzip dont-vary

# Make sure proxies don't deliver the wrong content
Header append Vary User-Agent env=!dont-vary
</Location>
...