WebClub - Всероссийский Клуб Веб-разработчиков
WebClub.RU » Советы » Буферизация страниц

Буферизация страниц


Дата публикации: 02-04-2008

Класс Session предоставляет возможность управлять механизмом буферизации страниц. Переменная этого класса $allow_cache принимает значения no, private и public. Правила умолчания в данном случае зависят от конкретной версии библиотеки PHPLib. Скажем, в версии 7.2 значение этой переменной по умолчанию равно private, а в последующих версиях - no. Методика кэширования страниц, предлагаемая библиотекой PHPLib, очень похожа на механизм буферизации, предоставляемый функциями сеанса в PHP 4.0

Сериализация

В системе PHP 3.0 сериализовать объекты сложно. Функция serialize() неправильно сохраняет методы класса, а вручную это сделать невозможно. В механизме поддержки объектов в программе PHP 3.0 отсутствовало одно важное средство - интроспекция. Нельзя было получить имя класса и имя его родительского класса. Поэтому при разработке библиотеки PHPLib надо было использовать обходные маневры. В классах библиотеки были предусмотрены два дополнительных поля - $classname и $persistent_slots, - которые соответственно содержали имя класса и переменных класса, подлежащих сериализации. Зная имя класса, библиотека PHPLib имела возможность генерировать код PHP, создающий экземпляр этого класса ($class = new class), и сохранить этот код в банке данных сеанса. При повторном обращении к данным сеанса указанная инструкция выполнялась с помощью функции eval(). Помните пример с самомодифицирующимся счетчиком из главы 2? В библиотека PHPLib используется тот же самый принцип.

При работе с пакетом PHP 4.0 подобные обходные маневры не нужны. В нем предусмотрены функции get_class() и get_parent_class(), которые обеспечивают адекватный механизм интроспекции. А функция serialize() работает с объектами значительно лучше.

Работа с сеансами

Применение объекта сеанса библиотеки PHPLib, как правило, нисколько не сложнее, чем использование библиотеки управления сеансами пакета PHP 4.0. Это демонстрирует образец сценария, приведенный в листинге 6.3. В нем выполняются те же действия, что и в примере, который мы рассматривали в главе 4.

Листинг 6.3. Простейший пример использования класса Session библиотеки PHPLib

//явным образом создать экземпляр объекта

$sess = new Example_Session;

//начать сеанс

$sess->start();

//зарегистрировать переменную сеанса

$sess->register("counter");

//инициализировать счетчик

if(!isset($counter))

{

$counter = 0;

}

//вывести идентификатор сеанса и значение счетчик

printf("Идентификатор сенса: %s

", $sess->id);

print("Значение счетчика: $counter");

//увеличить значение счетчика

$counter++;

//сохранить информацию о состоянии сеанса

$sess->freeze();

Единственным существенным различием между этим примером и примером из главы 4 является то, что в библиотеке PHPLib используется объектно-ориентированный подход.

Так же как и библиотека управления сеансами PHP 4.0, библиотека PHPLib применяет для хранения данных сеанса модули хранения (которые в библиотеке PHPLib называются контейнерами). Имена классов контейнеров начинаются с префикса CT_. Самым распространенным способом хранения данных сеанса являются базы данных в формате SQL, но в библиотеке PHPLib предусмотрена возможность работы и с другими классами контейнеров.

Библиотека PHPLib 7.2 содержит следующие классы контейнеров.

  • Класс CT_Sql является контейнером, используемым по умолчанию, и сохраняет данные сеанса в базе данных. В этом классе имеются следующие элементы данных.

Имя Описание
$database_class Имя класса DB_Sql, которое следует использовать для связи с базой данных
$database_table Имя таблицы для хранения данных сеанса
$encoding_mode Эта переменная определяет способ хранения данных сеанса. Она может принимать два значения: base64 и slashes. Без особой необходимости не следует изменять значение, установленное по умолчанию (base64), - предусматривающее необходимость представления данных сеанса перед их записью в базу данных в кодировке Base64. При отладке можно использовать альтернативный метод (константа slashes), который позволяет хранить данные в таблице как обычный текст
  • С точки зрения реализованных в классе возможностей, контейнеры CT_ Split_Sql идентичны контейнерам CT_Sql. Данный класс следует использовать, если база данных не может сохранить все данные сеанса в одном поле, особенно в тех случаях, когда в базе возникают проблемы с обработкой больших двоичных объектов (BLOBs). Класс CT_Split_Sql несовместим с таблицами CT_Sql.

Чтобы изменить размер частей, на которые класс разбивает данные сеанса, можно использовать переменную $split_length, по умолчанию ее значение равно 4096 (4 Кбайт).

  • Контейнер CT_Shm записывает данные сеанса в совместно используемую память. Чтобы с этим классом можно было работать, требуется, чтобы пакет РHP был скомпилирован с включением режима поддержки совместно используемой памяти. Контейнеры CT_Shm работают быстрее, чем другие виды контейнеров, так как позволяют осуществлять прямой доступ к хранимым данным. Однако у таких контейнеров есть один существенный недостаток: если вам по какой-либо причине потребуется перезагрузить сервер, все данные сеанса будут потеряны. Кроме того, из-за большого расхода памяти ограничено число параллельных сеансов. Каждый сеанс получает определенное количество памяти (оно зависит от количества и размера переменных сеанса), и когда ресурсы памяти будут исчерпаны, новый сеанс создать не удастся.

Переменные этого класса отличаются от переменных класса CT_Sql.

Параметр Описание
$max_sesions Максимальное количество одновременных активных сеансов. По умолчанию - 500
$shm_key Уникальный ключ сегмента совместно используемой памяти. Важно, чтобы он был уникальным для каждого приложения
$shm_size Размер сегмента совместно используемой памяти (в байтах). Приблизительно его можно рассчитать по формуле shn_size = = max_sessions * session_size, где размер сеанса в среднем имеет значение примерно 600 байт. Значение по умолчанию равно 64 000 (64 Кб)
  • Контейнер CT_Dbm использует для хранения данных сеанса файл в формате DBM операционной системы UNIX. В базах данных такого типа информация сохраняется в виде пар "ключ - значение" средствами обычной файловой системы. Единственной переменной, которой надо присвоить соответствующее значение (имя вашего файла DBV), является $dbm_file. Указанный файл обязан существовать; к нему должен быть установлен соответствующий режим доступа; серверу требуется доступ для записи к этому файлу.

  • Контейнер CT_Ldap позволяет хранить данные на сервере LDAP (Light Directory Access Protocol, облегченный протокол доступа к каталогам). Чтобы получить возможность использовать контейнеры подобного типа, скомпилируйте пакет PHP с включенной поддержкой протокола LDAP. Класс CT_Ldap располагает следующими свойствами.

Свойство Описание
$ldap_host, $ldap_port Имя хоста и номер порта сервера LDAP
$rootdn, $rootpw Имя и пароль, используемые для связи с сервером LDAP
$basedn Под этим именем будут храниться данные сеанса
$objclass Имя объектного класса (его можно сопоставлять с именем соответствующей таблицы SQL)

Если вы заглянете в файл local.inc, то увидите ряд определений классов. Три из них имеют непосредственное отношение к нашему примеру.

class DB_Example extends DB_Sql {

var $Host = "localhost";

var $Database= "phplib";

var $User = "tobias";

var $Password = "justdoit";

}

class Example_CT_Sql extends CT_Sql{

var $database_class = "DB_Example"; ##к какой базе данных

##подключаться

var $database_table = "active_sessions"; ##здесь следует

##искать наши данные

}

class Example_Session extends Sesion{

var $classname = "Example_Session";

var cookiename = ""; ##по умолчанию будет использоваться имя

##класса

var $magic = "Hocuspocus"; ##исходное значение

##идентификатора

var $mode = "cookie"; ##повторная генерация идентификатора

## сеанса производится через файл

##персональных настроек

var $fallback_mode = "get";

var $lifetime = 0; ##0-работа с персональными

##настройками, иначе - время (в минутах),

##по истечении которого информация о сеансе

##считается устаревшей

var $that_class = "Example_CT_Sql"; ##имя контейнера

##для хранения данных

var $gc_probability = 5;

}

Как нетрудно видеть, между классами возникают определенные отношения: в классе Example_Session переменная $that_class получает имя класса Example_CT_Sql, а переменная $database класса Example_CT_Sql указывает на класс DB_Sql. Рис. 6.1 иллюстрирует эти отношения.

Домен продается

Популярное

Не так давно в сети появился новый сервис, под названием Dead Man Zero. Этот сервис сделал...
Рынок социальных площадок уже давно стал стабильным. Несмотря на то, что время от времени...
Artisteer 4 – единственный в своем роде продукт, позволяющий автоматизировать работу над созданием...
Август 2024 (1)
Май 2024 (1)
Апрель 2024 (1)
Октябрь 2018 (14)
Февраль 2017 (3)
Январь 2017 (1)

Карта сайта: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41

Друзья сайта



Случайная цитата

Оноре де Бальзак:

"Тот, кто ищет миллионы, весьма редко их находит, но зато тот, кто не ищет, не находит их никогда."

Опрос

Какой антивирус Вы используете?

Kaspersky Antivirus
NOD32
Norton Antivirus
Dr.Web
Panda
Аvast!
ClamWin
Другой...