Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Кэширование данных в файл

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
_Dark_
Отправлено: 16 Октября, 2012 - 19:05:12
Post Id


Частый гость


Покинул форум
Сообщений всего: 231
Дата рег-ции: Окт. 2011  


Помог: 5 раз(а)

[+]


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

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

Я немного не понял:
1. Для чего кэш файлу с сериализованными данными давать такое название? Ведь это занимает время для работы с классом, необходимо высчитать хэш строки.

2. Зачем вообще сериализовывать данные? Почему нельзя создать .php файл с именем ключа, переменной внутри которая будет хранить нужные данные, а для чтения просто подключать файл (require) и получать эту переменную? Все будет работать быстрее, т.к. не надо будет высчитывать хэш ключа, не надо будет тратить время на fopen/fread/filesize, не надо будет десереализовывать данные (особенно заметно, если там хранятся масштабные данные, вроде кэша языковых фраз, количество которых измеряется сотнями).

Заранее благодарю за помощь.
 
 Top
chubrick
Отправлено: 16 Октября, 2012 - 20:02:38
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Окт. 2012  


Помог: 0 раз(а)




кэши бывают разные. В основном кэшируется полный вывод страницы. При добавлении и изменении, кэш обновляется. Высчитывание хеша это не такая уж и долгая операция. И вообще, кэш это не для людей, а для программы, поэтому ему незачем иметь понятное имя. Можно, конечно, именовать файлы, как url_session_ip.php, но будут очень длинные имена и уязвимость, если имя (из-за урл) превысит максимум. Сериализуются, обычно, объекты (иногда с наследованием), а не простые переменные и массивы. Даже ассоциативный массив не так просто записать в файл с синтаксисом php.
 
 Top
DlTA
Отправлено: 16 Октября, 2012 - 20:18:14
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




chubrick пишет:
Даже ассоциативный массив не так просто записать в файл с синтаксисом php.

var_export

а серилизуют данные для того чтоб хранить кеш не только в файлах но например в базе
(Добавление)
1 - чтоб не заморачиваться сильно с именем) дал для ячейки какое нить кирилическое название с пробелами и другими недопустимыми символами, и ходишь спокойно.
 
 Top
Мелкий Супермодератор
Отправлено: 16 Октября, 2012 - 20:27:55
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




chubrick пишет:
В основном кэшируется полный вывод страницы.

Что нередко как раз неверно, т.к. напрасно раздувает объём кэша.

chubrick пишет:
Даже ассоциативный массив не так просто записать в файл с синтаксисом php.

Да ну? var_export.
Вот объекты - да. Но объекты пихать в кэш вообще неважная идея.

_Dark_ пишет:
Все будет работать быстрее

Не факт, но надо тестировать. Желательно с json'ом, который значительно быстрее сериализации, но и сохранить может не всё.

_Dark_ пишет:
1. Для чего кэш файлу с сериализованными данными давать такое название?

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


-----
PostgreSQL DBA
 
 Top
_Dark_
Отправлено: 16 Октября, 2012 - 20:38:59
Post Id


Частый гость


Покинул форум
Сообщений всего: 231
Дата рег-ции: Окт. 2011  


Помог: 5 раз(а)

[+]


Разве нельзя сделать что-то вроде
PHP:
скопировать код в буфер обмена
  1. $content = <<<PHP
  2. <?PHP
  3. \$abc = \$data; // где $data - мой массив с данными
  4. ?>
  5. PHP;
  6. // И далее запись в файл
  7.  


А для получения этих данных
PHP:
скопировать код в буфер обмена
  1.  
  2. require_once '...';
  3. return $abc;
  4.  


Насчет хэша в имени понятно, для того, чтобы файл имел корректное имя всегда.

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

chubrick пишет:
И вообще, кэш это не для людей, а для программы, поэтому ему незачем иметь понятное имя.

Мне кажется, что для программы тоже проще просто взять переменную с данными, чем вначале десереализовывать их. Конечно я могу ошибаться.

(Отредактировано автором: 16 Октября, 2012 - 20:42:37)

 
 Top
chubrick
Отправлено: 16 Октября, 2012 - 20:52:53
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Окт. 2012  


Помог: 0 раз(а)




Мелкий,DlTA, спасибо! был не в курсе этой функции
Кстати, ей и объекты можно кэшировать, если правильно все сделать
Спойлер (Отобразить)

(Добавление)
Мелкий, и да, а чем плохо вывод кэшировать? вот есть у меня магазин. Там все для всех выглядит одинаково. Блок с корзиной подгружается ajax. Так почему бы мне не закэшировать все страницы в файлы? Чем это плохо?
 
 Top
Мелкий Супермодератор
Отправлено: 16 Октября, 2012 - 21:53:08
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




chubrick пишет:
чем плохо вывод кэшировать?

0) неудобно инвалидировать. И много чего перестраивать при инвалидации
1) информация бесполезно дублируется (прямое следствие нулевого пункта). В примере с магазином - спецпредложения какие-нибудь, каталог, фильтры по каталогу - все используют один и тот же элемент, но кэшируется многократно
Раз уж упомянул фильтры - самая частоиспользуемая опция и ведёт к огромному росту кэша страниц.
2) и, напоследок, какой вообще смысл грузить тяжеловесный php, когда есть nginx?


-----
PostgreSQL DBA
 
 Top
_Dark_
Отправлено: 17 Октября, 2012 - 14:30:48
Post Id


Частый гость


Покинул форум
Сообщений всего: 231
Дата рег-ции: Окт. 2011  


Помог: 5 раз(а)

[+]


Господа, не уходите от темы Улыбка

Можно ли сделать так, как я указал выше?

Мелкий пишет:
Желательно с json'ом, который значительно быстрее сериализации, но и сохранить может не всё.

Проверил.
Пара json_encode / json_decode медленнее serialize / unserialize в ~7 раз.
Проверял на примере ассоциативного массива из 700 элементов, содержание ключей и значений — строки.
 
 Top
Мелкий Супермодератор
Отправлено: 17 Октября, 2012 - 14:40:53
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




_Dark_ пишет:
Проверил.
Пара json_encode / json_decode медленнее serialize / unserialize в ~7 раз.

Очень интересно. А какая версия PHP?
В июле на 5.3.3 (помнится, может 5.3.5) тестил по мотивам этой ветки:
http://forum.php.su/topic.php?fo...01792#1341501792


-----
PostgreSQL DBA
 
 Top
_Dark_
Отправлено: 17 Октября, 2012 - 17:53:42
Post Id


Частый гость


Покинул форум
Сообщений всего: 231
Дата рег-ции: Окт. 2011  


Помог: 5 раз(а)

[+]


Мелкий пишет:
Очень интересно. А какая версия PHP?

Apache 2.4.3 VC10, PHP 5.4.6

И все же хотелось бы получить ответ на вопрос "Чем плох этот вариант?"
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB