|
|
|
| Здравствуйте!
Решил сделать кеширование результатов запросов в mysql.
Результаты запросов как правило массивы полей и значений с html данными (например части исходного кода веб страницы). Одномерные, двумерные... Но бывает и просто данные, а не массив.
Причем html данные могут содержать ошибки синтаксиса, такие как незакрытые скобки, кавычки и т.д...
У меня не получается записать полученный массив в файл. (Для начала просто в файл, потом планирую записывать в memcached),
В качестве имени файла делаю MD5 запроса к базе.
<?php
$file = $this->cache_path . $_SERVER['HTTP_HOST'] . "_" . md5( $this->cache_query ) . ".tmp";
$fc = fopen( $file, "wb" );
fwrite( $fc, serialize( $cache ) );
fclose( $fc );
?>
|
Проблема в том что если я записываю в файл, то в файле почему то ничего не записывается ((( Вернее там записывается последние 2 знака данных полученных после serialize().
Например если концовка ;s:1:\"2\";}N; то записывается только N;
Но если я делаю просто вывод в браузер, pritn_r( serialize( $cache ) ); то в браузере я вижу все данные как надо.
ПОЧЕМУ???
Если записывать без предварительного serialize(), то создается просто пустой файл без данных.
Как гарантированно записать массив в файл чтобы его можно было потом извлечь из файла и использовать?
Массивы выглядят примерно так (вывод print_r()):
Array
(
[id] => 207
[autor] => autor
[date] => 2008-03-04 17:59:58
[short_story] => Тут много много HTML данных....
[xfields] => author|Иан Сусаниин
[title] => Заголовок статьи
[descr] => Описание...
[keywords] => Ключевые фразы
[category] => 60
[alt_name] => article_1
[comm_num] => 0
[allow_comm] => 1
[allow_main] => 1
[allow_rate] => 1
[approve] => 1
[fixed] => 0
[rating] => 0
[allow_br] => 0
[vote_num] => 0
[news_read] => 1896
[votes] => 0
[access] =>
[symbol] => k
[flag] => 1
[editdate] => 1304866983
[editor] => Fox J
[reason] =>
[view_edit] => 0
[tags] => Теги статьи
[metatitle] =>
[prl_added] => 1
[prl_checked] => 1
[prl_linksto] => 5
[prl_linksfrom] => 5
)
Array
(
[id] => 207
[autor] => autor
[date] => 2008-03-04 17:59:58
[short_story] => Тут много много HTML данных....
[xfields] => author|Иан Сусаниин
[title] => Заголовок статьи
[descr] => Описание...
[keywords] => Ключевые фразы
[category] => 60
[alt_name] => article_1
[comm_num] => 0
[allow_comm] => 1
[allow_main] => 1
[allow_rate] => 1
[approve] => 1
[fixed] => 0
[rating] => 0
[allow_br] => 0
[vote_num] => 0
[news_read] => 1896
[votes] => 0
[access] =>
[symbol] => k
[flag] => 1
[editdate] => 1304866983
[editor] => Fox J
[reason] =>
[view_edit] => 0
[tags] => Теги статьи
[metatitle] =>
[prl_added] => 1
[prl_checked] => 1
[prl_linksto] => 5
[prl_linksfrom] => 5
)
Array
(
[id] => 207
[autor] => autor
[date] => 2008-03-04 17:59:58
[short_story] => Тут много много HTML данных....
[xfields] => author|Иан Сусаниин
[title] => Заголовок статьи
[descr] => Описание...
[keywords] => Ключевые фразы
[category] => 60
[alt_name] => article_1
[comm_num] => 0
[allow_comm] => 1
[allow_main] => 1
[allow_rate] => 1
[approve] => 1
[fixed] => 0
[rating] => 0
[allow_br] => 0
[vote_num] => 0
[news_read] => 1896
[votes] => 0
[access] =>
[symbol] => k
[flag] => 1
[editdate] => 1304866983
[editor] => Fox J
[reason] =>
[view_edit] => 0
[tags] => Теги статьи
[metatitle] =>
[prl_added] => 1
[prl_checked] => 1
[prl_linksto] => 5
[prl_linksfrom] => 5
)
и т.д....
|
| |
|
|
|
|
|
|
|
для: kodges
(22.10.2011 в 13:06)
| | serialize() плохо обрабатывает такие сложные данные, лучше использовать что-то другое.
PS Если сервер выделенный, лучше вообще не реализовывать такой кэша на уровне PHP, а настроить его на уровне MySQL (которая имеет много кэшей разного уровня, в том числе и кэш запросов). | |
|
|
|
|
|
|
|
для: cheops
(22.10.2011 в 23:11)
| | Что-то другое это что? Ведь если бы я знал я бы сюда не обратился...
PS: кеш в mysql уже настроен по максимуму возможного, но посещаемость ресурсов на сервере такова что необходимо дополнительное кеширование иначе mysql жрет непозволительно много процессора... А в моменты создания бекапов доходит до того что сервер не отвечает какое то время... | |
|
|
|
|
|
|
|
для: kodges
(23.10.2011 в 08:03)
| | >PS: кеш в mysql уже настроен по максимуму возможного, но посещаемость ресурсов на сервере
>такова что необходимо дополнительное кеширование иначе mysql жрет непозволительно много
>процессора... А в моменты создания бекапов доходит до того что сервер не отвечает какое то
>время...
А какие кэши настраивались и как (отслеживали эффективность по переменным состояния)?
PS Эффективнее MySQL построить кэши вряд ли получится, это займет время и будет работать медленнее, так как реализация будет на PHP. Другое дело, что управление кэшами MySQL зачастую не простое занятие - за ними нужно постоянно следить. | |
|
|
|
|
|
|
|
для: cheops
(23.10.2011 в 09:38)
| | Деталей я незнаю но у меня сервер администрирует хостер, и он переодически довольно длительное время что то там подстраивал в mysql, а потом сказал что сделано максимум возможного и лучшего уже не добиться...
Все же мне интересна реализация кеша на php. При нагруженном сервере, на деле, кеширование на php с хранением кеша в memcached я думаю все же должно дать положительный результат.
Еще интересно можно ли как то закешировать результат запроса в mysql еще до его дальнейшей обработки например:
$query = mysql_query("запрос....");
|
И вот то что содержит $query является объектом и никак не просматривается без обработки функциями типа mysql_fetch_array() и т.д... Можно ли закешировать данный объект в файл или в память както? Чтобы перед повторным запросом проверять есть ли такой объект и если есть отдавать его не обращаясь к mysql. | |
|
|
|