Кэширование на стороне сервера и клиента относительно большого файла JSON - PullRequest
2 голосов
/ 24 августа 2011

Мне нужно сгенерировать и доставить относительно большой JSON-файл пользователям. По большому счету я имею ввиду 400 кб. Это объединение двух таблиц, и, вероятно, со временем оно станет больше. Я планирую использовать его для заполнения пробелов в таблице HTML, связывая элементы по идентификаторам из базы данных.

Чтобы сэкономить пропускную способность, я хотел, чтобы клиент загружал этот файл JSON только один раз в день. (Кажется, простыми вариантами являются «каждый раз» и «никогда» ... гр.) На самом деле, он будет обновляться реже на стороне сервера, но я не хочу, чтобы это происходило реже. 90% браузеров, использующих эту опцию, - IE7 / 8, если это имеет значение.

Что касается кэширования на стороне сервера, я сейчас просто помещаю файл JSON в текстовый файл на сервере, если он старше нескольких часов. Я понимаю, что мог бы использовать memcached вместо этого. Имеет ли memcached значительное преимущество перед файлом? (Один сервер, 1 тыс. Посетителей в день, у меня еще не установлена ​​memcached.)

Согласно комментариям к PHP, я попробовал это:

$expires = 60*60*24;
header("Pragma: public");
header("Cache-Control: maxage=".$expires);
header('Expires: ' . gmdate('D, d M Y H:i:s', time()+$expires) . ' GMT');

Но, похоже, ничего не делает. Chrome сообщает мне, что он «ОК» каждый раз, когда я загружаю генерирующую страницу напрямую, и никакие заголовки, касающиеся управления кэшем, не отображаются на вкладке сеть / заголовки. Я явно не нажимаю на обновление. Не похоже, что я кеширую вообще. Есть ли другие способы сэкономить клиенту некоторое время и пропускную способность? Лучшая идея, которую я имею, - это творческий подход с опцией кэша .ajax().

На самом деле я еще не дошел до реализации вызова Ajax. Детские шаги.

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

Примечание: я использую PHP под IIS 7, так что это CGI. Я чувствую, что я читаю, что может иметь значение.

Ответы [ 3 ]

3 голосов
/ 24 августа 2011

Отправка правильных заголовков кэша - это только половина необходимых шагов. Вам все еще нужно отправить 304 статус, сообщающий, что ничего не изменилось с момента последнего получения клиентом контента. Это может быть сложно. Я рекомендую использовать .htaccess вместо этого. Больше можно найти здесь

Пример

ExpiresActive On
ExpiresDefault "access plus 1 day"

Edit -

Если вам нужно было сделать все это в php, то вам нужно вручную проверить заголовки запроса и отправить 304. Вот как вы можете это сделать:

$last_modified_time = filemtime($file); 
$etag = md5_file($file); 
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT"); 
header("Etag: $etag"); 
if (@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time || 
    trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) { 
    header("HTTP/1.1 304 Not Modified"); 
    exit; 
}
1 голос
/ 24 августа 2011

Задумывались ли вы об использовании браузера в локальном хранилище?Вы используете JavaScript, чтобы проверить, хранятся ли данные локально.Если это не так или он старый, то вы получаете его с сервера и сохраняете его локально.Почти все «современные» браузеры поддерживают локальное хранилище, то есть IE8, Firefox 3.5, Safari 4, Chrome и выше.Извините, но IE7 не поддерживает его.

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

0 голосов
/ 24 августа 2011

для сохранения bsndwith, вы также можете использовать сжатие при передаче.запустите php-файл с вызовом ob_start('ob_gzhandler');, но убедитесь, что для вашего типа содержимого установлено значение text / plain или text / html, поскольку ie7 не считает, что gzipped application / json content существует

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