Измение файла в многопоточном режиме (Запросы асинхронные)

SPavel_74100

Новичок
С ajax (Запросы асинхронные) посылаются запросы к php файлу

в php файле изменяется файл (xml)
PHP:
$doc = @file_get_contents('../setting/ginst.xml');  
$SXE = new SimpleXMLElement($doc); 

//{ изменение в объекте }// $out_xml

$fp = fopen ('../setting/ginst.xml',"a");//открытие
flock ($fp,LOCK_EX);//блокировка файла    
ftruncate ($fp,0);//УДАЛЯЕМ СОДЕРЖИМОЕ ФАЙЛА
fputs($fp , $out_xml);//работа с файлом
fflush ($fp);//очищение файлового буфера и записьв файл
flock ($fp,LOCK_UN);//снятие блокировки
fclose ($fp);//закрытие
глючит редкосно. портит файл и тому подобное

Подскажите пожалуйста как наладить много поточное изменение файла. Или такой подход в корне не верен
 

fixxxer

К.О.
Партнер клуба
1) между file_get_contents и fopen файл мог измениться. Не то, чтобы это прямо файл могло попортить, конечно, просто потеря части изменений
2) не проверяется возврат flock, fputs итд - там везде может быть и false. По хорошему проверять надо даже fclose ;)
 

SPavel_74100

Новичок
1) между file_get_contents и fopen файл мог измениться. Не то, чтобы это прямо файл могло попортить, конечно, просто потеря части изменений
2) не проверяется возврат flock, fputs итд - там везде может быть и false. По хорошему проверять надо даже fclose ;)
скажите а как верно проверит, я понимаю что они вернут true , false
даже если будет false как дождаться пока будет true
не понимаю логику продемонстрируйте пожалуйста примером.

нашел код
PHP:
   $f2=fopen("counter.txt","r"); // чтобы файл заблокировать, его надо открыть
                                 // открыли файл на чтение
   flock($f2,2);                 // заблокировали файл
   
   $counter=file("counter.txt"); // прочитали файл в массив $counter
   $f=fopen("counter.txt","w+"); // открыли файл на запись
   fputs($f,$counter[0]+1);      // записали "число + 1"
   fclose($f);                   // закрыли файл
   echo $counter[0]+1;           // вывели число на экран

   flock($f2,3);                 // сняли блокировку (при закрытии снимается автоматически)
   fclose($f2);                  // и закрыли файл (при выходе закрывается автоматически)
понял логику. А работать не работает . file("counter.txt"); уже не получает данные
 

fixxxer

К.О.
Партнер клуба
если flock вернет false значит что-то совсем плохо, такое надо логировать и разбираться что за фигня.

может например файловая система экзотическая и не поддерживает блокировки.

так как в коде делать не надо. можно так например - открыть файл a+, залочить, прочитать из него все, обработать xml, потом fseek в начало, ftruncate и перезаписать.
 

SPavel_74100

Новичок
Вроде получилось! Спасибо.
PHP:
function GetRandomProxy()
{
        $f = fopen ('../setting/proxy.xml', 'r' );
        flock ( $f, LOCK_SH ); // ждем, пока не завершится писатель

        // ***************************************************** //
        // Здесь мы уверены, что в файл никто не пишет.
        // ***************************************************** //

        flock ( $f, LOCK_UN );
        fclose ( $f );

}

function Edit_Proxy($prox, $stat, $node)
{
        $f = fopen ('../setting/proxy.xml', 'a+' );
        flock ( $f, LOCK_EX ); // ждем, пока мы не станем единственными

          // ***************************************************** //
          // Здесь, только эта программа работает с файлом.
          // ***************************************************** //

        ftruncate ($f,0);//УДАЛЯЕМ СОДЕРЖИМОЕ ФАЙЛА
        fputs($f , $out_xml);//работа с файлом
        fflush ($f);//очищение файлового буфера и записьв файл

        flock ( $f, LOCK_UN );
        fclose ( $f );

}
 
Сверху