Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: кеширование
 
 автор: moonfox   (06.12.2009 в 19:21)   письмо автору
 
 

наткнулся на статью в которой приводится пример создания файла с html данными на стороне сервера , типа кеш.
пример демонстрирует вывод и получения данных в буфер.
типа того:


<?php
  
// Если существует кэшированная версия…
  
if (file_exists('./cache/2.cache')) {
    
// Читаем и выводим файл
    
readfile('./cache/2.cache');
    exit();
  }

  
// Начинаем буферизацию вывода
  
ob_start();

  
// Выводим остальной HTML
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Кэшированная страница</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
</head>
<body>
Эта страница кэшируется средствами PHP
<a href="http://www.php.net/outcontrol">Функции управления выводом</a>
</body>
</html>
<?php
  
// Получаем содержимое буфера
  
$buffer ob_get_contents();

  
// Останов буферирования и вывод буфера
  
ob_end_flush();

  
// Сохранение кэш-файла с контентом
  
$fp fopen('./cache/2.cache''w');
  
fwrite($fp$buffer);
  
fclose($fp);
?> 


хедер и футер находятся и так в физических html/tpl файлах с использованием
cache-control, expires заголовков.
скорее тут интересует кеширование выборки из БД, например огромного списка меню в интернет-магазине... но для чего действительно ob_start() ???
- делаем выборку из БД
- суем результат в файл на хосте
- инклюдим/принтим его
- при обновлении страницы/повторном заходе, ищем этот файл в нашем кеше и сверяем время его изменения с текущим если фиксируем нужную нам разницу, то делаем повторно выборку из БД, пишем в этот файл и инклюдим/принтим в противном случае просто инклюдим этот файл.

  Ответить  
 
 автор: Fractured#   (06.12.2009 в 19:57)   письмо автору
 
   для: moonfox   (06.12.2009 в 19:21)
 

> но для чего действительно ob_start() ???
http://lmgtfy.com/?q=ob_start

Всё, что написано далее мне непонятно. Что ты хочешь от нас?

P.S. Кеширование всей страницы сразу практически смысла не имеет.

  Ответить  
 
 автор: GeorgeIV   (06.12.2009 в 20:14)   письмо автору
 
   для: Fractured#   (06.12.2009 в 19:57)
 

Это почему?

  Ответить  
 
 автор: moonfox   (06.12.2009 в 20:19)   письмо автору
 
   для: GeorgeIV   (06.12.2009 в 20:14)
 

вы лучше скажите
зачем в примере используют буфер
если можно и без этого.

  Ответить  
 
 автор: GeorgeIV   (06.12.2009 в 20:24)   письмо автору
 
   для: moonfox   (06.12.2009 в 20:19)
 

Попробуйте и увидите для чего!
Чтобы страница сформировалась правильно, сначала должны уйти заголовки( они не буферизируются, а уже потом остальное из буфера). Это гарантия того, что если где то в коде есть посылка заголовка, он уйдет раньше, чем тело HTML.

А второе, это же надо весь выводимый HTML-код запихать в переменную, тобы записать в файл. Буферизация и тут поможет.

  Ответить  
 
 автор: moonfox   (06.12.2009 в 20:26)   письмо автору
 
   для: GeorgeIV   (06.12.2009 в 20:24)
 

правильно написали
Используя ob_start в самом начале выполнения вашего приложения, вы можете посылать заголовки в любой понравившейся точке программы, не сталкиваясь с обычными ошибками. Затем, как только вы будете уверены, что больше выводить HTTP-заголовки не потребуется, вы можете сразу же вывести содержимое страницы из буфера.

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


не аргумент.
Это гарантия того, что если где то в коде есть посылка заголовка, он уйдет раньше, чем тело HTML.


А второе, это же надо весь выводимый HTML-код запихать в переменную, тобы записать в файл. Буферизация и тут поможет.

я использую смарти, поэтому все равно все лежит в переменной или массиве.

  Ответить  
 
 автор: GeorgeIV   (06.12.2009 в 20:29)   письмо автору
 
   для: moonfox   (06.12.2009 в 20:26)
 

Вы сросили, вам ответили.
Применять или нет, это уже ваше дело.

  Ответить  
 
 автор: Fractured#   (06.12.2009 в 20:29)   письмо автору
 
   для: moonfox   (06.12.2009 в 20:26)
 

> я использую смарти, поэтому все равно все лежит в переменной или массиве

там лежит шаблон, а не сгенерированная страница.

И не надо использовать тег [code] для цитат. Либо режь строки на более короткие.

[поправлено модератором]

  Ответить  
 
 автор: moonfox   (06.12.2009 в 20:33)   письмо автору
 
   для: Fractured#   (06.12.2009 в 20:29)
 

а какая разница страница или шаблон????
другой момент что у смарти есть кеш в виде чистого пхп, связанного с его отработкой.
я говорю о сокращении обращений к БД, а для того чтоб в кеш в смарти попали наши выборки их выбрать и отдать надо.

[поправлено модератором]

  Ответить  
 
 автор: Fractured#   (06.12.2009 в 20:36)   письмо автору
 
   для: moonfox   (06.12.2009 в 20:33)
 

>а какая разница страница или шаблон????

Попытайся самостоятельно опеределить различия между шаблоном и сгенерированной страницей.

> я говорю о сокращении обращений к БД

Так кешируй результаты запросов, а не всю страницу.

  Ответить  
 
 автор: moonfox   (06.12.2009 в 20:46)   письмо автору
 
   для: Fractured#   (06.12.2009 в 20:36)
 

однако....
что шаблон, что php с printam'а всяких там <html><div>...
в обоих случаях есть "шаблон" и есть "сгенированная страница".

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

  Ответить  
 
 автор: Fractured#   (06.12.2009 в 20:54)   письмо автору
 
   для: moonfox   (06.12.2009 в 20:46)
 

> и кто говорил о "всей странице...", епт,

Почитате, что такое ob_start().

> в обоих случаях есть "шаблон" и есть "сгенированная страница".

Вот кусок шаблона:
{foreach name=outer item=contact from=$contacts}
    <hr />
    {foreach key=key item=item from=$contact}
        {$key}: {$item}&lt;br&gt;
        {$key}: {$item}<br />
    {/foreach}
{/foreach}

(его PHP-эквивалент тоже с натяжкой можно считать шаблоном)

А вот кусок страницы, которая может быть получена из такого шаблона:
<hr />
    phone: 1<br />
    fax: 2<br />
    cell: 3<br />
<hr />
    phone: 555-4444<br />
    fax: 555-3333<br />
    cell: 760-1234<br />

[поправлено модератором]

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования