Профессиональное программирование на PHP

Страница 288 из 591


296 Глава 11 Повторное использование вычислений

Чтобы извлекать элементы из кэша, можно модифицировать factory-класс и заставить его искать MySQL-кэш, если невозможно найти его собственный внутренний кэш:

class CachingFactory { static $objects; function Word($name) {

if (!self::$objects[Word] [$name]) {

^ self::$objects [Word] [$name] = Text_Word::retrieve($name); return self::$objects [Word] [$name];

}

}

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

mysql> select data from ObjectCache where keyname = 'the';

+---+

data +---+

0:4:"word":2:{s:4:"word";s:3:"the";s:13:"_numSyllables";i:0;} +---+

1 row in set (0.01 sec)

Объем данных приближается к 61 байту, большая часть из которых представляет собой структуру класса. В РНР 4 дело обстоит еще хуже, поскольку статические переменные класса не поддерживаются, а каждая сериализация может включать в себя также массивы исключаемых слогов. Операции сериализации по своей природе являются "многословными", что часто делает их применение излишним.

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

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

Повторное использование вычислений внутри РНР

В самой PHP-машине весьма распространено повторное использование вычислений.




  Hostland.Ru

 «Бесплатный хостинг Hostland.Su» © 2006