запутанный сценарий кеширования файлов - PullRequest
1 голос
/ 17 января 2011

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

На динамической странице логика выглядит примерно так:

// part1
-некоторая обработка для начала страницы (требуется для части 3)
-echo некоторая информация

// part2
эхо-меню для конкретного пользователя + некоторая информация для пользователя

//part3
echo остальная часть страницы

Проблема в том, что если я кеширую всю страницу, а затем кеш читается, то это нехорошо (part2 будет неверной, поскольку зависит от пользователя).

для кэширования страницы, я просто использую "ob_start ();"в начале файла, затем сохраните ob_get_contents () в файл и затем "ob_end_flush ();"в конце.
Если файл уже существует в кэше и срок его действия не истек, я делаю: "include (file);"и "exit;"

Я пытался разделить кеширование на два файла, но части 2 и 3 зависят от некоторой обработки php части 1. У меня трудное время ...

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

Ответы [ 2 ]

1 голос
/ 17 января 2011

APC / Redis / Memcached

Если бы вы могли, вы должны использовать APC (и / или Redis / Memcached ) для кэширования ваших данных, потому что это будет WAAAAAAAAAAAAAAAAY быстрее (все остается в MEMORY ). Если вы хотите, чтобы ваш веб-сайт работал хорошо, у вас должен быть установлен APC (предварительно скомпилированный байт-код в MEMORY).

Cache_Lite

В противном случае вы должны использовать превосходную библиотеку Cache_Lite для кэширования ваших данных в файл. Введение прекрасно объясняет, как его использовать. Если это все возможно, вы должны написать /dev/shm/, потому что это соответствует MEMORY , что будет намного быстрее, чем Disc IO.

Кеш расщепления

Я попытался разделить кеширование на две части. файлы, но части 2 и 3 зависят от некоторых PHP обработка часть1 У меня есть трудное время ...

У вас должны быть уникальные фрагменты (лучше всего, насколько это возможно, лучше всего, но иногда их трудно отследить), а затем объедините эти фрагменты, которые вам нужны, на этой странице. Каждая часть должна иметь уникальный идентификатор вне курса (для поиска).

<?php
require_once('Cache/Lite.php');

$options = array(
    'cacheDir' => '/tmp/',
    'lifeTime' => 3600
);

// Create a Cache_Lite object
$Cache_Lite = new Cache_Lite($options);

if ($data = $Cache_Lite->get('#{ID for user specific menu}')) {
    echo($data);
} else {
    $data = 'Data of the block 1-1';
    $Cache_Lite->save($data);
}

echo('<br><br>Non cached line !<br><br>');

if ($data = $Cache_Lite->get('#{user specific info}')) {
    echo($data);
} else {
    $data = 'Data of the block 2';
    $Cache_Lite->save($data);
}

?>
0 голосов
/ 17 января 2011

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

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

Если вы не выполняете интенсивную обработку в коде PHP или если вы выполняете запрос, который занимает много времени, я не вижу необходимости кэшировать HTML, выводимыйваш PHP скрипт.

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