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

Форум PHP

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

 

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

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

тема: Кэширование страницы PHP
 
 автор: gOFREe   (17.07.2009 в 17:11)   письмо автору
 
 

Почитал про кэширование PHP страниц и решил попробовать написать.
Вот что получилось:

<?
ob_start
(); //кэш

//ВЫВОД СТРАНИЦЫ

$path str_replace("/"""$_SERVER['PHP_SELF']);
$file $path.".html";
$buffer ob_get_contents();
     if (
file_exists($file)) { //если файл существует
         
$fsize filesize($file); //проверяем размер существующего файла
         
ob_end_clean(); //очищяем буфер
         
$bsize strlen($buffer); //проверяем размер буфера
         
if ($fsize == $bsize) { //если файл с буфером равны
             
include $path.".html"//подключаем файл
            
}
            else { 
                
$fh fopen($file"w"); 
                if (!
fwrite($fh,$buffer)) { //иначе перезаписываем
                    
echo "Ошибка записи файла";
                    }
                    
fclose($fh);
                    include 
$path.".html"//подключаем файл
         
}
     }
     else {
         
$fh fopen($file"w"); 
                if (!
fwrite($fh,$buffer)) { //иначе перезаписываем
                    
echo "Ошибка записи файла";
                    }
                    
fclose($fh);
                    include 
$path.".html"//подключаем файл
     
}
?>

Я еще совсем новичок, поэтому сильно не ругайте, просьба объяснить, что сделал не правильно, а что правильно, или может что то можно упростить.

  Ответить  
 
 автор: gOFREe   (18.07.2009 в 13:17)   письмо автору
 
   для: gOFREe   (17.07.2009 в 17:11)
 

Ответьте пожалуйста

  Ответить  
 
 автор: sim5   (18.07.2009 в 13:23)   письмо автору
 
   для: gOFREe   (18.07.2009 в 13:17)
 

Одинаковый размер, еще не означает одинаковое содержание.
А кому вы будете показывать ошибку записи, пользователю? И для чего?

  Ответить  
 
 автор: gOFREe   (18.07.2009 в 13:42)   письмо автору
 
   для: sim5   (18.07.2009 в 13:23)
 

А как еще можно проверить содержание?

  Ответить  
 
 автор: Trianon   (18.07.2009 в 13:26)   письмо автору
 
   для: gOFREe   (18.07.2009 в 13:17)
 

Ну уж коль настаиваете...

начинать нужно с постановки задачи. Ее нет.
Кроме того, кеширование - не более чем один из методов оптимизации.

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

Это общее мнение многих авторитетных источников - не мое личное.

  Ответить  
 
 автор: gOFREe   (18.07.2009 в 13:49)   письмо автору
 
   для: Trianon   (18.07.2009 в 13:26)
 

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

<?
ob_start
(); //кэш

//ВЫВОД СТРАНИЦЫ

$path str_replace("/"""$_SERVER['PHP_SELF']);
$file $path.".html";
$buffer ob_get_contents();
   
ob_end_clean(); //очищяем буфер
     
if (file_exists($file)) { //если файл существует
         
$fsize filesize($file); //проверяем размер существующего файла
         
$bsize strlen($buffer); //проверяем размер буфера
         
if ($fsize == $bsize) { //если файл с буфером равны
             
include $path.".html"//подключаем файл
            
}
            else { 
                
$fh fopen($file"w"); 
                
fwrite($fh,$buffer)  //иначе перезаписываем
                
fclose($fh);
                include 
$path.".html"//подключаем файл
     
}
     else {
         
$fh fopen($file"w"); 
         
fwrite($fh,$buffer)  //иначе перезаписываем
         
fclose($fh);
         include 
$path.".html"//подключаем файл
     
}
?> 

  Ответить  
 
 автор: sim5   (18.07.2009 в 13:58)   письмо автору
 
   для: gOFREe   (18.07.2009 в 13:49)
 

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

  Ответить  
 
 автор: gOFREe   (18.07.2009 в 14:16)   письмо автору
 
   для: sim5   (18.07.2009 в 13:58)
 

А так?


<?
ob_start
(); //кэш

//ВЫВОД СТРАНИЦЫ

$buffer ob_get_contents();
$md5_new_file trim(md5($buffer));
$file $md5_new_file.".html";
ob_end_clean(); //очищяем буфер
     
if (file_exists($file)) { //если файл существует
         
$md5_old_file trim(md5_file($file));
         if (
$md5_old_file == $md5_new_file) { //если файл с буфером равны
             
include $path.".html"//подключаем файл
            
}
            else { 
                
$fh fopen($file"w"); 
                if (!
fwrite($fh,$buffer)) { //иначе перезаписываем
                    
include $path.".html"//подключаем файл
                    
}
                    
fclose($fh);
                    include 
$path.".html"//подключаем файл
         
}
     }
     else {
         
$fh fopen($file"w"); 
                if (!
fwrite($fh,$buffer)) { //иначе перезаписываем
                    
include $path.".html"//подключаем файл
                    
}
                    
fclose($fh);
                    include 
$path.".html"//подключаем файл
     
}
?> 

  Ответить  
 
 автор: sim5   (18.07.2009 в 14:23)   письмо автору
 
   для: gOFREe   (18.07.2009 в 14:16)
 

Вы не блокируете доступ к файлу, у вас что один пользователь?
if (file_exists($file)) { //если файл существует
.......
else { //иначе создаем новый файл
.......
если ошибка, подключаем старый файл
.......
О каком старом речь, если создается новый?

  Ответить  
 
 автор: gOFREe   (18.07.2009 в 14:31)   письмо автору
 
   для: sim5   (18.07.2009 в 14:23)
 

Блокировать flock() ?
if (file_exists($file)) { //если файл существует
.......
else { //иначе создаем новый файл
.......
если ошибка выводим страницу без кэширования
.......

  Ответить  
 
 автор: sim5   (18.07.2009 в 14:40)   письмо автору
 
   для: gOFREe   (18.07.2009 в 14:31)
 

http://ru2.php.net/manual/en/function.flock.php
http://www.php.su/functions/?flock

Какую страницу без кеширования, если ее нет на диске?

  Ответить  
 
 автор: gOFREe   (18.07.2009 в 14:41)   письмо автору
 
   для: sim5   (18.07.2009 в 14:40)
 

Вывод буфера


<?
ob_start
(); //кэш

//Вывод страницы


$buffer ob_get_contents();
$md5_new_file trim(md5($buffer));
$file $md5_new_file.".html";
ob_end_clean(); //очищяем буфер
     
if (file_exists($file)) { //если файл существует
         
$md5_old_file trim(md5_file($file));
         if (
$md5_old_file == $md5_new_file) { //если файл с буфером равны
             
include $file//подключаем файл
            
}
            else { 
                
$fh fopen($file"w"); 
                
flock ($fhLOCK_EX);
                if (!
fwrite($fh,$buffer)) { //иначе перезаписываем
                    
include $file//подключаем файл
                    
}
                    
flock ($fhLOCK_UN);
                    
fclose($fh);
                    include 
$file//подключаем файл
         
}
     }
     else {
         
$fh fopen($file"w"); 
         
flock ($fhLOCK_EX);
                if (!
fwrite($fh,$buffer)) { //иначе перезаписываем
                    
echo $buffer;  // Если ошибка, выводим буфер записанный ранее
                    
}
                    
flock ($fhLOCK_UN);
                    
fclose($fh);
                    
                    include 
$file//подключаем файл
     
}
?> 

  Ответить  
 
 автор: sim5   (18.07.2009 в 14:53)   письмо автору
 
   для: gOFREe   (18.07.2009 в 14:41)
 

if (!fwrite($fh,$buffer)) { //иначе перезаписываем вернее если не записан
echo $buffer; // Если ошибка, выводим буфер записанный ранее
Где у вас ранее запись буфера была, если новый файл создается? Это вывод буфера.
.......
include $file; //подключаем файл что подключаете?

  Ответить  
 
 автор: Trianon   (18.07.2009 в 14:42)   письмо автору
 
   для: gOFREe   (18.07.2009 в 13:49)
 

А по второму пункту?

  Ответить  
 
 автор: gOFREe   (18.07.2009 в 14:45)   письмо автору
 
   для: Trianon   (18.07.2009 в 14:42)
 

Это?

if (!fwrite($fh,$buffer)) { //иначе перезаписываем
                    echo $buffer;  // Если ошибка, выводим буфер записанный ранее
                    } 

  Ответить  
 
 автор: Trianon   (18.07.2009 в 14:48)   письмо автору
 
   для: gOFREe   (18.07.2009 в 14:45)
 

Нет.
Это: Задача такова, пользователь заходит на сайт, если эта страница кэширована, то вывести html страницу(без компиляции кода)

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

покажите мне - Вот тут у меня страница вычислялась долго и самозабвенно.
А тут - нет, тут берется из файла. Где?

Зато прилепить тяжелую функцию md5_file рассчитывать хеш кеша , (который не меняется!!!!!) - это Вы реализовали.

Вторым пунктом шло: Вам рано за это браться.

  Ответить  
 
 автор: gOFREe   (18.07.2009 в 14:55)   письмо автору
 
   для: Trianon   (18.07.2009 в 14:48)
 

Хе... ну да.. страница то все равно выводится ))

  Ответить  
 
 автор: Trianon   (18.07.2009 в 15:11)   письмо автору
 
   для: gOFREe   (18.07.2009 в 14:55)
 

то есть уговорил.
Добре.

  Ответить  
 
 автор: gOFREe   (18.07.2009 в 15:12)   письмо автору
 
   для: Trianon   (18.07.2009 в 15:11)
 

Неееет, не уговорили ) Буду думать.

  Ответить  
 
 автор: Trianon   (18.07.2009 в 15:35)   письмо автору
 
   для: gOFREe   (18.07.2009 в 15:12)
 

уже прогресс.

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

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