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

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


250 Глава 10 Кэширование данных

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

Одновременное использование кэша

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

Файловая система (filesystem) — представляет собой дерево, которое состоит из узлов разветвлений (каталогов) и листовых узлов (файлов). Когда с помощью функции fopen ("/путь/к/файлу, php", $режим) считывается файл, операционная система ищет переданный ей путь. Поиск начинается с корневого каталога. Операционная система открывает необходимый каталог и изучает его содержимое. Каталог (directory) представляет собой таблицу, содержащую перечень имен файлов и каталогов, а также индексные узлы (inode), связанные с каждым именем. Индексный узел, связанный с именем файла, непосредственно соответствует физическому расположению файла на диске. Необходимо отметить важный нюанс: имя файла непосредственно не преобразуется в расположение файла; имя файла отображается на индексный узел, который в свою очередь соответствует месту хранения файла. При открытии файла возвращается указатель на этот файл. Операционная система связывает данную структуру с индексным узлом файла, так как в индексе находятся сведения о местонахождении файла на диске. Вновь необходимо отметить важный нюанс: указатель на файл, возвращаемый функцией fopen (), содержит информацию об индексе открываемого файла, а не имя этого файла.

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

Ниже приведен пример возможного кода для кэширования целой страницы.

<?

if(file_exists("first.cache")) { include("first.cache"); return;

}

else {

// открытие файла в режиме''w', для записи $cachefp = fopen("first.cache", "w"); ob start();

}

?>

<HTML> <BODY>

<!-- Кэшируется на один день --> Сегодня <?= strftime("%А, %В %е %Y") ?>




  Hostland.Ru

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