Плохо ли рассматривать PHP-сессии и куки как вариант кеширования? - PullRequest
0 голосов
/ 30 марта 2011

Ниже приведен простой запуск класса кэширования на основе драйвера в PHP. Другой пользователь отправил это ...

<?php
class Cache
{
    protected $Driver;
    public function __construct($driver)
    {
        require_once 'drivers/' . $drivers . '.driver.php';
        $driver = "Cache_Driver_" . $driver;

        $this->Driver = new $driver;
    }


    public function create($key,$value)
    {
        return $this->Driver->create($key,$value);
    }

    public function read($key,$value)
    {
        return $this->Driver->read($key,$value);
    }

    public function update($key,$value)
    {
         return $this->Driver->update($key,$value);
    }

    public function remove($key)
    {
        return $this->Driver->remove($key);
    }
}

?>

Мой план состоит в том, чтобы иметь отдельный класс «файлы / драйверы» для каждого метода кэширования, который я буду использовать в своем приложении. Пока я планирую использовать,

- Файл
- APC
- Memcache или Memcached
- Redis
- сеансы
- печенье

Итак, мой главный вопрос (# 1) здесь, я понимаю, что сессии и файлы cookie обычно не считаются частью кэширования, но я думаю, что они здесь подходят, а не для того, чтобы «кэшировать» много данных, но скорее как способ получения / установки моих сеансов и файлов cookie, вместо того, чтобы иметь конкретные сеансы и классы файлов cookie, они будут использовать мои методы get / set / unset из этого класса.

Скажите, пожалуйста, что вы думаете об этой идее? Хорошо, плохо, есть предложения? Спасибо!

вопрос (# 2) n Для моего класса, который будет для сессий, я думал, в моем конструкторе для сессионного класса Driver я мог бы вызвать

session_start()

есть. Возможная проблема, не требует ли это, чтобы я сразу же инициировал кэш с драйвером сеанса, как в верхней части моего приложения, прежде чем что-либо еще вызывать? Или, что еще хуже, придется вызывать session_start () вне самого класса, в верхней части моего приложения? Снова в поисках предложений, я чувствую, что что-то упускаю, еще раз спасибо за любую помощь.

<?php  
$cache = new Cache('Session');
?>

Ответы [ 3 ]

3 голосов
/ 30 марта 2011

печенье

Существует ряд ограничений на хранение данных в файлах cookie, что делает их не идеальными в качестве решения для кэширования и, вероятно, не стоит затраченных усилий:

  • Количество файлов cookie ограничено по количеству и размеру для каждого домена. Например, в IE , каждый файл cookie ограничен 4 КБ, и может быть максимум 20 файлов cookie на домен.
  • Файлы cookie отправляются на сервер при каждом запросе. Если вы храните 80 КБ данных в файлах cookie, то каждый запрос (включая запросы, относящиеся к нединамическим ресурсам на одном хосте) будет достаточно большим.
  • Cookies для каждого пользователя (см. Ниже)

$_SESSION

Кэширование данных в $_SESSION является гораздо более разумным, поскольку единственное увеличение трафика туда и обратно - это единственный маленький заголовок cookie с идентификатором сеанса. Большим недостатком кэширования в массиве $_SESSION является то, что данные сеанса являются отдельными для каждого клиента. С другими вашими компонентами кэширования (APC, Memcache и т. Д.) Данные передаются и доступны для запросов от каждого клиента. Проблема, которая возникает, заключается в том, что с кешами сеансов для каждого клиента нет простого способа очистить или обновить значение из данных сеанса других клиентов, что приводит к устаревшим кешам.

Заключение

В то время как кэши для каждого клиента, как правило, являются разумными вещами, разница в модели работы между ними и другими внутренними компонентами кэша общего хранилища (APC, memcache и т. Д.) Означает, что многие приложения ожидают общее хранилище. кэш, вероятно, сломается, когда будет представлен кеш для каждого клиента. Оба типа кэша имеют свое место, но путаница в том, какой тип используется, может стать причиной проблем.

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

2 голосов
/ 30 марта 2011

Я понимаю, что сеансы и файлы cookie обычно не считаются частью кэширования, но я думаю, что они здесь подходят не для того, чтобы «кэшировать» большой объем данных, а скорее как способ получения / установки моих сеансов и файлов cookie. вместо того, чтобы иметь определенные сессии и классы cookie, они использовали бы мои методы get / set / unset из этого класса.

PHP имеет совершенно адекватные способы работы с файлами cookie и сессиями. Они называются $_COOKIE / setcookie и $_SESSION. Вам не нужна обертка для них, которая предназначена для другой цели, даже если интерфейс адекватен на поверхности. Например, файлы cookie содержат дополнительные вещи, о которых вам нужно беспокоиться, например, доменные имена и время истечения срока действия, в то время как сеансы не будут. Может быть, срок действия ваших кэшированных данных истечет, но тогда как вы будете управлять этой информацией об истечении в сеансе?

Если вы хотите обернуть их, оберните их, но не клин их в интерфейс, предназначенный для другой цели.

Разве для этого не требуется, чтобы я сразу же запускал кэш с драйвером сеанса, как в верхней части моего приложения, прежде чем что-либо еще вызывалось?

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

1 голос
/ 30 марта 2011

PHP уже поддерживает разные бэкэнды для управления сессиями.Не создавайте свои собственные оболочки, PHP-сессия уже является оболочкой.Вы можете настроить PHP для использования файлов (по умолчанию), mysql, memcache или ряда других методов.

...