Перезапись информации в файле

dodger778

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

Скрипт простой и при каждом сохранении информация в файле очищается, данные я передаю по ссылке на переменную.

Код вызова скрипта:

PHP:
$data = array(1,2,3,4,5,6,7, "test"=>3); // то что нужно записать в файл
$cache = new cache2($data); // передаем то что нужно сохранить

$cache->save(); // сохраняем

$data = array('test'=>1,'test1'=>2); // Изменяем

$cache->save(); // Сохраняем снова
$cache->save(); // и еще
$cache->save(); // и еще раз
$cache->save(); // и опять

print_r($cache->read()); // читаем то что сохранили. Не читается:(
Код скрипта:

PHP:
class cache2{
 var $path = "/srv/xxx_html/cache/";
 var $data;
 var $file;
 var $key;
 
 function __construct(array &$data=null){
   if($data)
     $this->data = &$data;
   
   if(isset($_COOKIE['cache'])){
     $this->key = $_COOKIE['cache'];
     $this->path = $this->path.$this->key;
   } else {
     $this->generateKey();
   }  
   $this->open();
 }

 function printCache(){
   echo "<pre>";
   print_r($this->data);
   echo "</pre>";
 }
 
 function save(){
   file_put_contents($this->path,"");
   $data = json_encode($this->data);
   fwrite($this->file, $data);
 }
 //Прочитать данные и
 function read(){
   if($size=fileSize($this->path)){
     $data = fread($this->file, $size);

     $data = json_decode($data, true);
     return $data;
   }
 }
 
 function delete(){}
 
 //Генерировать имя файла
 function generateKey(){
   $time = time();
   $key = $time.$_SERVER['REMOTE_ADDR'];
   $this->key = $time."_".md5($key).".cache";
   setcookie("cache", $this->key, $time+3600*24*365, $_SERVER['REQUEST_URI'], $_SERVER['HTTP_HOST']);
   return $this->path = $this->path.$this->key;
 }
 
 //Создать файл
 function createCacheFile(){
  $this->file = fopen($this->path, "w+");
  chmod($this->path, 0755);
 }
 
 //Открыть файл
 function open(){
   if(is_file($this->path))
     $this->file = fopen($this->path, "r+");
   else
     $this->createCacheFile();
 }
 
 function __destruct(){
   clearstatcache();
 }

}
Версия PHP Version 5.3.10. Ребят я могу дополнить вопрос только скажите что нужно. А то я уже с ума схожу от такой простой задачи и сложности ее решения.
 

Beavis

Banned
1. зачем ты передаешь переменную по ссылке? объясни логику
2. зачем ты используешь fread и fwrite, а не file_get_contents и file_put_contents
3. что за гениальный алгоритм генерирования ключа? посмотри как это делается в других реализациях кеша
 

dodger778

Новичок
1. зачем ты передаешь переменную по ссылке? объясни логику
1. Мне так удобно. И я считаю это оптимизированным вариантом. Передавая переменную на прямую проблемы не решает.
2. зачем ты используешь fread и fwrite, а не file_get_contents и file_put_contents
2. Затем, что функции file_get_contents и file_put_contents работаю в теже три этапа fopen -> fwrite или fread -> fclose, но только на время выполнения функции. Мне удобно держать файл открытым и использовать функцию fread или fwrite столько раз сколько мне захочется.
3. что за гениальный алгоритм генерирования ключа? посмотри как это делается в других реализациях кеша
3. А с ним то что не так? Разве это важно?
 

Beavis

Banned
1. Мне так удобно. И я считаю это оптимизированным вариантом. Передавая переменную на прямую проблемы не решает.
Если ты считаешь это оптимизированным вариантом, значит ты не разбираешься в PHP, поздравляю..

2. Затем, что функции file_get_contents и file_put_contents работаю в теже три этапа fopen -> fwrite или fread -> fclose, но только на время выполнения функции. Мне удобно держать файл открытым и использовать функцию fread или fwrite столько раз сколько мне захочется.
И сколько времени файл у тебя держится открытым? А сколько раз используются за это время fread и fwrite? И если больше одного раза - то вопрос: зачем?
Ты не задумывался что если файл открыт на запись одним пользователем, то другой даже прочитать из файла ничего не сможет пока файл не закроется?

3. А с ним то что не так? Разве это важно?
Ну если тебе не важно, что ты делаешь свой класс кеша изначально неправильно, то и мне неважно.. Зато ты можешь гордиться что создал первый в мире класс для работы с кешем, который работает только тогда когда включены куки.
 

dodger778

Новичок
Beavis
Beavis вы не могли бы аргументировать свои ответы на первую цитату
Ты не задумывался что если файл открыт на запись одним пользователем, то другой даже прочитать из файла ничего не сможет пока файл не закроется?
Конечно задумывался, на это и рассчитано, чтобы у каждого пользователя был свой файлик.
 

Beavis

Banned
Beavis
Трололо. Мастер пыхи. Beavis вы не могли бы аргументировать свои ответы на первую цитату, а то у меня складывается впечатление что вам с 2006 года поговорить просто не с кем.
http://www.research.ibm.com/trl/people/mich/pub/200901_popl2009phpsem.pdf - если конечно хватит интеллекта понять о чем тут речь

Если ты не хочешь хоть немножко разобраться в php, а только хочешь решить данную проблему и дальше писать говнокод, тогда просто убери из кода file_put_contents (если ты уж хочешь использовать только fwrite), найди правильный способ очистить файл и поставить указатель в его начало и проблема исчезнет. А потом подумай почему так происходило.
 

Beavis

Banned
Ты сам то понял что отправил? Это аргумент типа? Блин, мне уже как то не смешно даже, а жалко тебя.
я так и знал что у тебя мозгов не хватит понять

Ну не разбираешься ты в пыхе, а строишь из себя кододрочера, брось заниматься кодоананизмом и вводить людей в заблуждение.
Мою проблему любезно помогли решить на phpforum.ru, проблема была в открытии файла с флагами "w+" и "r+", флаг "а+" спасает положение.
Дибил, проблема была в том, что ты обнулял содержимое файла функцией file_put_contents а указатель файла оставался на прежней позиции, поэтому следующая запись происходила не в начало файла.
Ты такой тупой, что даже после того как тебе помогли решить проблему на другом форуме, ты даже не понял в чем именно была проблема. Самому же сложно заглянуть в мануал и посмотреть хотя бы один пример как правильно использовать функцию http://ru2.php.net/ftruncate и http://ru2.php.net/manual/en/function.fopen.php
 

Beavis

Banned
Если ты пройдешь по моей, ты может тебя осенит что ты всё это время тупишь)
 

Redjik

Джедай-мастер
Beavis
что за книга - себе статью утащил - офигенская
 

Redjik

Джедай-мастер
dodger778
Он дело говорит, хотя я считаю, что можно и помягче было :D
 

Redjik

Джедай-мастер
dodger778
проблема была в том, что ты обнулял содержимое файла функцией file_put_contents а указатель файла оставался на прежней позиции, поэтому следующая запись происходила не в начало файла
 
Сверху