|
|
|
| Почитал про кэширование 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
(17.07.2009 в 17:11)
| | Ответьте пожалуйста | |
|
|
|
|
|
|
|
для: gOFREe
(18.07.2009 в 13:17)
| | Одинаковый размер, еще не означает одинаковое содержание.
А кому вы будете показывать ошибку записи, пользователю? И для чего? | |
|
|
|
|
|
|
|
для: sim5
(18.07.2009 в 13:23)
| | А как еще можно проверить содержание? | |
|
|
|
|
|
|
|
для: gOFREe
(18.07.2009 в 13:17)
| | Ну уж коль настаиваете...
начинать нужно с постановки задачи. Ее нет.
Кроме того, кеширование - не более чем один из методов оптимизации.
Оптимизацией же новичку заниматься вредно.
Для этого нужно сперва накопить опыт на решении задач естественным путем.
Это общее мнение многих авторитетных источников - не мое личное. | |
|
|
|
|
|
|
|
для: 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"; //подключаем файл
}
?>
|
| |
|
|
|
|
|
|
|
для: gOFREe
(18.07.2009 в 13:49)
| | Опять размер. Вы фотографировали аппаратом цифровым? А не замечали, что часто размеры фото как по мерной линейке, а рожи на них разные?
Блокировать нужно доступ перед записью файла. Если ошибка записи, значит нужно подключать имющийся. | |
|
|
|
|
|
|
|
для: 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"; //подключаем файл
}
?>
|
| |
|
|
|
|
|
|
|
для: gOFREe
(18.07.2009 в 14:16)
| | Вы не блокируете доступ к файлу, у вас что один пользователь?
if (file_exists($file)) { //если файл существует
.......
else { //иначе создаем новый файл
.......
если ошибка, подключаем старый файл
.......
О каком старом речь, если создается новый? | |
|
|
|
|
|
|
|
для: sim5
(18.07.2009 в 14:23)
| | Блокировать flock() ?
if (file_exists($file)) { //если файл существует
.......
else { //иначе создаем новый файл
.......
если ошибка выводим страницу без кэширования
....... | |
|
|
|
|
|
|
|
|
для: 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 ($fh, LOCK_EX);
if (!fwrite($fh,$buffer)) { //иначе перезаписываем
include $file; //подключаем файл
}
flock ($fh, LOCK_UN);
fclose($fh);
include $file; //подключаем файл
}
}
else {
$fh = fopen($file, "w");
flock ($fh, LOCK_EX);
if (!fwrite($fh,$buffer)) { //иначе перезаписываем
echo $buffer; // Если ошибка, выводим буфер записанный ранее
}
flock ($fh, LOCK_UN);
fclose($fh);
include $file; //подключаем файл
}
?>
|
| |
|
|
|
|
|
|
|
для: gOFREe
(18.07.2009 в 14:41)
| | if (!fwrite($fh,$buffer)) { //иначе перезаписываем вернее если не записан
echo $buffer; // Если ошибка, выводим буфер записанный ранее
Где у вас ранее запись буфера была, если новый файл создается? Это вывод буфера.
.......
include $file; //подключаем файл что подключаете? | |
|
|
|
|
|
|
|
для: gOFREe
(18.07.2009 в 13:49)
| | А по второму пункту? | |
|
|
|
|
|
|
|
для: Trianon
(18.07.2009 в 14:42)
| | Это?
if (!fwrite($fh,$buffer)) { //иначе перезаписываем
echo $buffer; // Если ошибка, выводим буфер записанный ранее
}
|
| |
|
|
|
|
|
|
|
для: gOFREe
(18.07.2009 в 14:45)
| | Нет.
Это: Задача такова, пользователь заходит на сайт, если эта страница кэширована, то вывести html страницу(без компиляции кода)
Вот покажите мне, где у Вас развивается ветвь с компиляцией кода и где - без компиляции?
Все претензии, которые тут справедливо обнаружил Sim5 - это мелочь, по сравнению с тем, что Вы не решаете главной задачи - не заменяете тяжеловесное вычисление контента чтением из места хранения кеша.
покажите мне - Вот тут у меня страница вычислялась долго и самозабвенно.
А тут - нет, тут берется из файла. Где?
Зато прилепить тяжелую функцию md5_file рассчитывать хеш кеша , (который не меняется!!!!!) - это Вы реализовали.
Вторым пунктом шло: Вам рано за это браться. | |
|
|
|
|
|
|
|
для: Trianon
(18.07.2009 в 14:48)
| | Хе... ну да.. страница то все равно выводится )) | |
|
|
|
|
|
|
|
для: gOFREe
(18.07.2009 в 14:55)
| | то есть уговорил.
Добре. | |
|
|
|
|
|
|
|
для: Trianon
(18.07.2009 в 15:11)
| | Неееет, не уговорили ) Буду думать. | |
|
|
|
|
|
|
|
для: gOFREe
(18.07.2009 в 15:12)
| | уже прогресс. | |
|
|
|