Intereting Posts
PHP GMAIL Контакты XML-анализ с помощью DOMDocument и cURL Получение переданного значения в контроллере из вида, codeigniter Можно ли изменить default_socket_timeout из моего php-кода? Получите отметку времени сегодня и вчера в php Виды доступа в моделях / контроллерах Есть ли какой-нибудь код в WordPress, когда пароль не вводится и появляется другой код, когда пароль правильный Как указать путь установки Composer? Как использовать именованные каналы в PHP между различными функциями или даже разными процессами без fork? Предельная длина PHP каждой строки в массиве Защищенные от PHP классы и свойства, защищенные от кого? Как запустить php-файл в качестве задания cron в cPanel в службе Bigrock Shared Hosting? Функция электронной почты PHP () не работает на выделенном сервере GoDaddy Как получить расширение изображения с помощью file_get_contents php? Codeigniter 2x сеанс firefox MVC считывает URL-адрес контроллера и действия

кеширование JSON: Apache, PHP, jQuery

Я пытаюсь кэшировать содержимое JSON, сгенерированное php-скриптом из базы данных. Однако набор данных очень стабилен, изменений и дополнений очень мало. Значение данных может не измениться в течение недель. Проблема заключается в том, что он содержит столбец LOB, и это занимает всего лишь некоторое время для загрузки, более продолжительное по сравнению с предоставлением json из текстового файла, поскольку git – это фактический вызов базы данных, который замедляет работу.

Я показываю данные в таблице с разбиением на страницы (datatables jquery plugin), и для каждой страницы изменение данных извлекается из базы данных снова, также при возвращении на предыдущую страницу.

Я пробовал:

"beforeSend": function (request) { request.setRequestHeader("cache-control", "max-age=86400"); }, 

Не работает.

Я попробовал mod_expires:

 ExpiresActive On ExpiresDefault "access plus 4 hours" ExpiresByType application/javascript "access plus 1 day" ExpiresByType application/json "access plus 1 day" 

Не работает.

Поэтому я предполагаю, что все эти настройки предназначены для реальных файлов только в файловой системе, а не для динамически генерируемых файлов?

Я бы предпочел настраиваемый подход, подразумевающий использование Apache / PHP, поскольку у меня не будет полного контроля над сервером.

ИЗМЕНИТЬ ПЕРЕД ПЕРВЫМ ОТВЕТОМ:

Обратите внимание, что JSON содержит несколько записей, поэтому хранилище ключей / значений было бы довольно сложно получить. Ключ должен содержать много вещей: выражение Query / filter и запрошенную страницу для подкачки.

EDIT 2:

Разработка и производство. Windows … поэтому memcached на самом деле не вариант …

ИЗМЕНИТЬ 3:

Я пробовал решение kristovaher, но не работает. Заголовки кеша не находятся в ответе все время, и после некоторого plaing вокруг я считаю, что я решил проблему: я должен использовать NTLM-аутентификацию и, когда вы делаете 2 запроса сразу после друг друга, он отлично работает, однако, если вы подождете немного , кажется, что пользователь повторно аутентифицирован, а затем заголовок управления кэшем «потерян».

Cache-control – это заголовок ответа. (edit: На самом деле это также заголовок запроса. Спасибо за Gumbo за указание его.) Вам нужно добавить такие заголовки в ответ (данные, которые отправляет PHP).

 <?php // How long my cache should last $cacheDuration=300; // in seconds // Client is told to cache these results for set duration header('Cache-Control: public,max-age='.$cacheDuration.',must-revalidate'); header('Expires: '.gmdate('D, d MYH:i:s',($_SERVER['REQUEST_TIME']+$cacheDuration)).' GMT'); header('Last-modified: '.gmdate('D, d MYH:i:s',$_SERVER['REQUEST_TIME']).' GMT'); // Pragma header removed should the server happen to set it automatically // Pragma headers can make browser misbehave and still ask data from server header_remove('Pragma'); ?> 

Вы должны сделать это лучше, чем это. Заголовки кэширования только говорят одному клиенту, как поддерживать эти данные, другой пользователь может все еще заставить ваш сервер повторить все это. Это будет выглядеть система интеллектуального кэша:

  • Вы создаете свой JSON, что бы это ни было.
  • Вы храните этот JSON в своей файловой системе в качестве временного файла.
  • Вы отправляете содержимое клиенту с заголовками Cache-control, заставляя браузер не запрашивать данные с сервера снова и вместо этого использовать кеш.
  • Если другой пользователь приходит на сайт, а в его браузере нет этого кеша, ваш скрипт должен проверить, существует ли файл кеша (который вы создали в точке 2), если он существует, тогда вы читаете данные клиенту из этого файла, а не генерируете снова.
  • Вы также должны проверить, насколько старый файл кэша, может быть, сгенерировать файл снова каждые несколько дней.

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

РЕДАКТИРОВАТЬ:

Пример Live здесь: http://waher.net/cachetest.php (тот же код, что и выше).

Этот файл загружается браузером из кеша в течение 5 минут. Но учтите, что если вы обновляете страницу, она игнорирует кеш браузера и все еще делает запрос на сервер. Вы можете попробовать лучше, если открыть новую вкладку вместо обновления страницы и ввести URL-адрес, а Firebug / Chrome Dev Tools покажет, что файл был загружен из кеша.

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

Во всяком случае, мое решение заключалось в использовании APC:

http://www.php.net/manual/en/book.apc.php

Я использую окна, соответствующие бинарные файлы можно найти здесь:

http://downloads.php.net/pierre/

который зависит от вашей версии PHP и того, как она была скомпилирована (с vc6 или vc9). Php_apc.dll нужно будет поместить в ваш каталог расширения php, и вам нужно будет добавить строку

 extension=php_apc.dll 

к php.ini

Тогда вы в основном делаете:

 if (apc_exists($key)){ return apc_fetch($key); } // get data from database because it was not in the cache //... //add data to cache apc_add($key, $result); 

Если данные на моей странице не закрыты, загрузка занимает около 1-2 секунд. Ну, это неплохо, но очень лагги. если данные находятся в кеше, это больше похоже на 20-30 мс. конечно, эта разница очень заметна.