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

Форум PHP

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

 

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

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

тема: Запись массивов в файл
 
 автор: kodges   (22.10.2011 в 13:06)   письмо автору
 
 

Здравствуйте!
Решил сделать кеширование результатов запросов в mysql.
Результаты запросов как правило массивы полей и значений с html данными (например части исходного кода веб страницы). Одномерные, двумерные... Но бывает и просто данные, а не массив.
Причем html данные могут содержать ошибки синтаксиса, такие как незакрытые скобки, кавычки и т.д...
У меня не получается записать полученный массив в файл. (Для начала просто в файл, потом планирую записывать в memcached),
В качестве имени файла делаю MD5 запроса к базе.

<?php

$file 
$this->cache_path $_SERVER['HTTP_HOST'] . "_" md5$this->cache_query ) . ".tmp";
$fc fopen$file"wb" );
fwrite$fcserialize$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
)
и т.д....

  Ответить  
 
 автор: cheops   (22.10.2011 в 23:11)   письмо автору
 
   для: kodges   (22.10.2011 в 13:06)
 

serialize() плохо обрабатывает такие сложные данные, лучше использовать что-то другое.

PS Если сервер выделенный, лучше вообще не реализовывать такой кэша на уровне PHP, а настроить его на уровне MySQL (которая имеет много кэшей разного уровня, в том числе и кэш запросов).

  Ответить  
 
 автор: kodges   (23.10.2011 в 08:03)   письмо автору
 
   для: cheops   (22.10.2011 в 23:11)
 

Что-то другое это что? Ведь если бы я знал я бы сюда не обратился...

PS: кеш в mysql уже настроен по максимуму возможного, но посещаемость ресурсов на сервере такова что необходимо дополнительное кеширование иначе mysql жрет непозволительно много процессора... А в моменты создания бекапов доходит до того что сервер не отвечает какое то время...

  Ответить  
 
 автор: cheops   (23.10.2011 в 09:38)   письмо автору
 
   для: kodges   (23.10.2011 в 08:03)
 

>PS: кеш в mysql уже настроен по максимуму возможного, но посещаемость ресурсов на сервере
>такова что необходимо дополнительное кеширование иначе mysql жрет непозволительно много
>процессора... А в моменты создания бекапов доходит до того что сервер не отвечает какое то
>время...
А какие кэши настраивались и как (отслеживали эффективность по переменным состояния)?

PS Эффективнее MySQL построить кэши вряд ли получится, это займет время и будет работать медленнее, так как реализация будет на PHP. Другое дело, что управление кэшами MySQL зачастую не простое занятие - за ними нужно постоянно следить.

  Ответить  
 
 автор: kodges   (23.10.2011 в 10:27)   письмо автору
 
   для: cheops   (23.10.2011 в 09:38)
 

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

Все же мне интересна реализация кеша на php. При нагруженном сервере, на деле, кеширование на php с хранением кеша в memcached я думаю все же должно дать положительный результат.

Еще интересно можно ли как то закешировать результат запроса в mysql еще до его дальнейшей обработки например:

$query = mysql_query("запрос....");

И вот то что содержит $query является объектом и никак не просматривается без обработки функциями типа mysql_fetch_array() и т.д... Можно ли закешировать данный объект в файл или в память както? Чтобы перед повторным запросом проверять есть ли такой объект и если есть отдавать его не обращаясь к mysql.

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

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