[php] не кэшировать если есть ошибки

12
Ragnarok
На сайте с 25.06.2010
Offline
226
1100

Делаю простой кэш для своего велосипеда

//кэш

$cacheName = "cache/" . md5($url) . ".cache";
$cacheExists = file_exists($cacheName);

if(!$cacheExists) { //создаём кэш
$gotErrors = false;
ob_start();
getData(); //условная функция, собирает страницу и выводит её
//тут бы сменить $gotErrors на true если при сборе getData были ошибки
$data = ob_get_contents();
ob_end_clean();
if(!$gotErrors)
file_put_contents($cacheName, $data); //КЭШ СОЗДАН
}
else //либо грузим из кэша
{
$data = file_get_contents($cacheName); //ЗАГРУЖЕНО ИЗ КЭША
}
echo $data;

проблема в том, что сгенерированная страница (через getData()) может содержать warning-и (вывод ошибок на продакшне я конечно отключу, но мало ли..)

Как проверить, содержит ли $data ошибки? чтобы не кешировать её в этом случае

---------- Добавлено 10.08.2016 в 11:16 ----------

самое топорное -- искать <b>Warning</b> в $data но это тот ещё костыль, как по мне.

Оборачивать в try..catch -- но тогда сборка страницы прервётся при первом же notice..

//TODO: перестать откладывать на потом
TF-Studio
На сайте с 17.08.2010
Offline
334
#1

мне кажется исключения лучший выбор. просто прерывать по exit

Всё ещё лучший способ заработка для белых сайтов: GoGetLinks (https://www.gogetlinks.net/?inv=fahbn8).
Ragnarok
На сайте с 25.06.2010
Offline
226
#2
TF-Studio:
мне кажется исключения лучший выбор

так мне не нужно чтобы прерывалось: пусть он выведет страницу с notic'ами и warning'ами, но не кеширует её в таком виде

Aisamiery
На сайте с 12.04.2015
Offline
293
#3
Ragnarok:
так мне не нужно чтобы прерывалось: пусть он выведет страницу с notic'ами и warning'ами, но не кеширует её в таком виде

Я вообще не понимаю что вы кэшируете и как ваши warning попадут в кэш.

сделайте функцию, которая будет возвращать html для вывода окончательный, результат функции и ложите в кэш

Разработка проектов на Symfony, Laravel, 1C-Bitrix, UMI.CMS, OctoberCMS
ДП
На сайте с 23.11.2009
Offline
203
#4

может так как-то проверять?

http://php.net/manual/ru/function.error-get-last.php

LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#5

ТС, понимаете, программирование это не там, где есть волшебство. Тут ТУПО нужно сделать, то что вы хотите. Магии нет, волшебных слов тоже.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
ДП
На сайте с 23.11.2009
Offline
203
#6
Aisamiery:
Я вообще не понимаю что вы кэшируете и как ваши warning попадут в кэш.

сделайте функцию, которая будет возвращать html для вывода окончательный, результат функции и ложите в кэш

Это всё хорошо, если изначально об кеше задумывалось, а тут очень похоже на то, что прикручивают к уже готовому проекту. Поэтому (отвечая на вопрос "как?") - через output buffering, даже код для наглядности приведен.

Собственно поэтому на всякие варнинги человек и напоролся.

Aisamiery
На сайте с 12.04.2015
Offline
293
#7
Дикий пионер:
Это всё хорошо, если изначально об кеше задумывалось, а тут очень похоже на то, что прикручивают к уже готовому проекту. Поэтому (отвечая на вопрос "как?") - через output buffering, даже код для наглядности приведен.
Собственно поэтому на всякие варнинги человек и напоролся.

Что нужно сделать чтобы в буфер попали варнинги которые по умолчанию отправляются в stderr? Я столько лет программирую и никогда не встречал такой кейс. Сейчас попробую потестить ради интереса :)

----

Действительно, есть такой кейс, как то я прошел мимо такого бага :)

ДП
На сайте с 23.11.2009
Offline
203
#8

Ну как бы в браузере вы хоть раз варнинги видели? А тут по сути идёт захват всего, что выдаётся в браузер. Вот и варнинги захватываются.

Aisamiery
На сайте с 12.04.2015
Offline
293
#9

Тогда как то так

//кэш

$cacheName = "cache/" . md5($url) . ".cache";
$cacheExists = file_exists($cacheName);

if(!$cacheExists) { //создаём кэш
ob_start();
getData(); //условная функция, собирает страницу и выводит её
$data = ob_get_contents();
ob_end_clean();
if(is_null(error_get_last()))
file_put_contents($cacheName, $data); //КЭШ СОЗДАН
}
else //либо грузим из кэша
{
$data = file_get_contents($cacheName); //ЗАГРУЖЕНО ИЗ КЭША
}
echo $data;
Ragnarok
На сайте с 25.06.2010
Offline
226
#10
Aisamiery:
error_get_last

круто, похоже, то что нужно. спасибо!

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий