PHP, запись в фаил данных, помогите решить проблему

Discussion in 'PHP' started by Demian, 2 Apr 2010.

  1. Demian

    Demian New Member

    Joined:
    8 Mar 2010
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Всем привет.. кратко о проблеме:
    открываем файл в r+, в файле есть строка "1111111111", необходимо заменить её на "234" и чтобы в файле в итоге было записано "234", но после записи получаем "2341111111", забивает только первые байты, а всё что дальше - не трогает, а то что дальше нафиг не нужно.. пример скрипта:
    PHP:
    <?PHP
        $file_save 
    fopen('cat_id_db2.txt',"r+"); 
     if (!
    $file_save)
     {
    usleep(100000); 
    $file_save fopen('cat_id_db2.txt','r+');
    }  
    $read=fread($file_save,filesize('cat_id_db2.txt')); 
     echo 
    $read
     
    rewind($file_save); 
     
    fwrite($file_save,'22');
      
    fflush($file_save);
      
    fclose($file_save);        
    ?>
    суть в том что файл открывается в начале скрипта, блокируется, выполняются некоторые манипуляции, результат записывается с сериализацией, файл закрывается, unserialize из этого файла нормально будет работать, проигнорит всё лишнее, но вот в итоге вес файла может неплохо вырости по такой постанове... как можно затиреть всё то лишнее, заново не обращаясь к файлу?
     
  2. попугай

    попугай Elder - Старейшина

    Joined:
    15 Jan 2008
    Messages:
    1,520
    Likes Received:
    401
    Reputations:
    196
  3. Demian

    Demian New Member

    Joined:
    8 Mar 2010
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    ну да, пробывал, записывается, но при таком открытии он читать файл отказывается o_O
     
  4. попугай

    попугай Elder - Старейшина

    Joined:
    15 Jan 2008
    Messages:
    1,520
    Likes Received:
    401
    Reputations:
    196

    ну значит сначала читай, потом записывай
     
  5. Demian

    Demian New Member

    Joined:
    8 Mar 2010
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    надо след сделать, попорядку:
    1.Открыть файл
    2.Закрыть доступ к нему всем, кроме текущего сеанса
    3.Прочитать данные
    4.Произвести с ними манипуляции
    5.Записать данные
    всё.
    Как ты предлогаеш?2 раза файл открыть, первый раз прочитать, второй раз открыть на запись?так не канает, данные могут уже перезаписаться, пока ты будеш читать и закрывать файл, и потеряют актуальность
     
  6. попугай

    попугай Elder - Старейшина

    Joined:
    15 Jan 2008
    Messages:
    1,520
    Likes Received:
    401
    Reputations:
    196
    ну смотря сколько времени занимают "манипуляции". Если неск минут и больше, то да, могут потерять актуальность. Выход - работать с копиями файлов.

    А если манипуляции вроде замены "11111" на "23" - то это длится менее секунды
     
  7. Demian

    Demian New Member

    Joined:
    8 Mar 2010
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    ну естественно не 111 на 23 заменить, это то ясно=) манипуляции занимают немного, шансов тоже мало, но всё же, надо почеловечески сделать и понять как можно избавиться от этого хвоста
     
  8. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    a+ пробуй
     
  9. JnK

    JnK Elder - Старейшина

    Joined:
    30 Mar 2007
    Messages:
    125
    Likes Received:
    21
    Reputations:
    0
    Выполняет поставленую задачу:
    0. Проверяет сущ. файла, если нет создает.
    1. Читает,выводит
    2. Записывает.
    PHP:
    <?PHP 
      $text_replacement
    =$_GET['text'];
      
    $file "count.txt";
      
      echo 
    "text_replacement: ".$_GET['text']."<br>";
      If (
    is_file($file)) // является обычным файлом и сущ. ли он.
      
    {
        
    $cnt=file_get_contents($file); // Получаем содержимое в виде одной строки
        
    echo "Read: ".$cnt."<br>";
      }
      
    file_put_contents($file$text_replacement); //Записать строку в файл
      
    echo "Write: ".$text_replacement;
    ?>
    P.s. Если все же свой скрипт, то вот команды:
    PHP:
    ftruncate ($file_save,0); // команда очищает содержимое файла
    flock ($file_save,LOCK_EX);//блокировка файла
    flock ($file_save,LOCK_UN);//снятие блокировки
    Статья по работе с файлами
     
    #9 JnK, 2 Apr 2010
    Last edited: 2 Apr 2010
  10. Demian

    Demian New Member

    Joined:
    8 Mar 2010
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    спс=) ftruncate ($file_save,0); - помогло=)