PDA

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


Demian
02.04.2010, 14:30
Всем привет.. кратко о проблеме:
открываем файл в r+, в файле есть строка "1111111111", необходимо заменить её на "234" и чтобы в файле в итоге было записано "234", но после записи получаем "2341111111", забивает только первые байты, а всё что дальше - не трогает, а то что дальше нафиг не нужно.. пример скрипта:
<?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 из этого файла нормально будет работать, проигнорит всё лишнее, но вот в итоге вес файла может неплохо вырости по такой постанове... как можно затиреть всё то лишнее, заново не обращаясь к файлу?

попугай
02.04.2010, 14:37
w+

Demian
02.04.2010, 14:40
ну да, пробывал, записывается, но при таком открытии он читать файл отказывается O.o

попугай
02.04.2010, 14:41
ну да, пробывал, записывается, но при таком открытии он читать файл отказывается O.o


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

Demian
02.04.2010, 14:46
надо след сделать, попорядку:
1.Открыть файл
2.Закрыть доступ к нему всем, кроме текущего сеанса
3.Прочитать данные
4.Произвести с ними манипуляции
5.Записать данные
всё.
Как ты предлогаеш?2 раза файл открыть, первый раз прочитать, второй раз открыть на запись?так не канает, данные могут уже перезаписаться, пока ты будеш читать и закрывать файл, и потеряют актуальность

попугай
02.04.2010, 14:51
ну смотря сколько времени занимают "манипуляции". Если неск минут и больше, то да, могут потерять актуальность. Выход - работать с копиями файлов.

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

Demian
02.04.2010, 14:55
ну естественно не 111 на 23 заменить, это то ясно=) манипуляции занимают немного, шансов тоже мало, но всё же, надо почеловечески сделать и понять как можно избавиться от этого хвоста

mailbrush
02.04.2010, 14:59
a+ пробуй

JnK
02.04.2010, 15:51
Выполняет поставленую задачу:
0. Проверяет сущ. файла, если нет создает.
1. Читает,выводит
2. Записывает.
<?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. Если все же свой скрипт, то вот команды:

ftruncate ($file_save,0); // команда очищает содержимое файла
flock ($file_save,LOCK_EX);//блокировка файла
flock ($file_save,LOCK_UN);//снятие блокировки

Статья по работе с файлами (http://svdpro.info/page.php?id=59)

Demian
02.04.2010, 17:43
Выполняет поставленую задачу:
0. Проверяет сущ. файла, если нет создает.
1. Читает,выводит
2. Записывает.
<?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. Если все же свой скрипт, то вот команды:

ftruncate ($file_save,0); // команда очищает содержимое файла
flock ($file_save,LOCK_EX);//блокировка файла
flock ($file_save,LOCK_UN);//снятие блокировки

Статья по работе с файлами (http://svdpro.info/page.php?id=59)

спс=) ftruncate ($file_save,0); - помогло=)