Профессиональное программирование на 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") ?> |
| |
|
В начало ←предыдущая следующая→ ... 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 ... | ||