Будут ли кэшироваться динамически созданные файлы JavaScript? - PullRequest
1 голос
/ 31 марта 2010

Так что мое приложение использует много файлов js. это много запросов http. Я решил объединить их динамически на сервере в пакеты из 3-4 файлов, разбитых по функциональности.


Мой запрос на стороне клиента: ... script type = "text / javascript" src = "http://mydomain.com/core-js.php" ...

Моя серверная часть делает: --core-js.php-- заголовок («Тип контента: application / x-javascript»);

include_once ( 'file1.js'); include_once ( 'file2.js'); include_once ( 'file3.js'); include_once ( 'file4.js');


Я устанавливаю заголовок истечения срока давности на core-js.php. Мой вопрос, будет ли core-js.php кэшироваться на стороне клиента? Если это будет, кто-то может объяснить, пожалуйста, как?

Спасибо!

Ответы [ 5 ]

3 голосов
/ 31 марта 2010

Клиент не знает и не заботится о том, что то, что ему было отправлено, было удовлетворено, если собрать несколько файлов на стороне сервера. Клиент должен кэшировать его , если заголовки кэширования верны. Вы должны тщательно проверить их, чтобы убедиться, что ваша установка PHP не отправляет другие конфликтующие заголовки (Firefox + Firebug хорош для этого), поскольку страницы PHP обычно используются для динамических вещей, где вы не хотите кэшировать .

1 голос
/ 10 февраля 2013

Пожалуйста, смотрите: http://www.jonasjohn.de/snippets/php/caching.htm, Вы должны проверить заголовки входящих запросов, чтобы отправить правильный ответ. Вы можете сделать что-то вроде ниже:

<?php
ob_start();
$filemtimes = array();
foreach(array('file1.js','file2.js') as $file)
{
include_once($file); 
$filemtimes[]= filemtime($file);
}

$date = gmdate('D, d M Y H:i:s', max($filemtimes)).' GMT';
$length = ob_get_length();
$etag = md5($date.$lengte);

$headers = apache_request_headers();


if(!empty($headers['If-None-Match']) && !empty($headers['If-Modified-Since']))
{

if
(
    $etag == md5($headers['If-Modified-Since'].$length)
)
{

        ob_end_clean();

            header("Content-type: application/x-javascript");
        header('Last-Modified: '.$date."\r\n");
        header('Expires: '.gmdate('D, d M Y H:i:s', (time()+3600)).' GMT'."\r\n");
        header('Cache-Control: max-age=3600'."\r\n");
        header('ETag: '.$headers['If-None-Match']."\r\n");
            header('HTTP/1.1 304 Not Modified');
        header('Connection: close');

        exit;
    }   
}
header("Content-type: application/x-javascript");
header('Last-Modified: '.$date."\r\n");
header('Expires: '.gmdate('D, d M Y H:i:s', (time()+3600)).' GMT'."\r\n");
header('Cache-Control: max-age=3600'."\r\n");
header('ETag: '.$headers['If-None-Match']."\r\n");
header('Content-Length: '.$length."\r\n");
header('Accept-Ranges: bytes'."\r\n");
ob_end_flush();
exit;
?>

Ваш скрипт будет кэширован. Данные не отправляются клиенту. На стороне сервера расчет включений и модификаций выполняется для каждого запроса. Может быть, хранить etag и время модификации в сеансе или cookie, чтобы выполнить проверку перед включением и вычислениями. Или проверьте размеры файлов вместо включений.

0 голосов
/ 07 мая 2012

Да, но это сложно. PHP по умолчанию добавляет несколько заголовков, которые предотвращают кеширование. Вы должны убедиться, что вы удаляете их все. Кроме того, понимает ли ваш PHP-скрипт заголовки If-Modified-Since и If-None-Match? Вы вообще генерируете заголовки Last-Modified и ETag? Это сложно сделать правильно, и зачем, если на вашем веб-сервере все это встроено?

Я бы сделал это по-другому. Сделайте запрос на core.js, а не core.php. Конечно, core.js не существует, поэтому .htaccess перехватывает запрос и направляет его на index.php. Теперь index.php генерирует необходимый javascript и передает его клиенту. Также создается файл core.js. Будущие запросы на core.js будут обрабатываться Apache как обычно для статических файлов, не приближаясь к PHP.

И если вы хотите иметь возможность обновлять javascript, вы можете вместо этого использовать URL-адреса вида last-modified-timestap.core.js. Изменение метки времени в HTML приведет к созданию нового файла javascript при первом запросе.

Я делаю это для динамически создаваемого CSS (дизайнер может редактировать CSS в панели администрирования, сохраняя значения в базе данных), и это хорошо работает.

0 голосов
/ 01 апреля 2010

Да, будет. Клиент не знает, что js-файл, который он запрашивает, представляет собой кучу других файлов, разбитых на один, он просто видит один js-файл, тот, который он запросил, и говорит ему о его кэшировании, core-js.php. Пока вы не измените имя файла (core-js.php), проблем быть не должно.

С другой стороны, вы должны взглянуть на Minify http://code.google.com/p/minify/ Вы можете объединять и кэшировать не только js, но и css в группах, в основном то, что вы делаете. Я уже некоторое время пользуюсь им без проблем, и это довольно мило.

0 голосов
/ 31 марта 2010

Подавляющее большинство браузеров и прокси-серверов кэширования будут учитывать заголовок истечения срока действия (если установлен).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...