PHP кто профи чтения записи в файл? найдите ошибку

1 234
Ink-developer
На сайте с 31.01.2009
Offline
138
#21
Fearful:
накладываются ошибки его кода.

Ждем от вас чтобы вы их нам указали.

[umka]
На сайте с 25.05.2008
Offline
456
#22

Ещё, по-моему, flock не лочит файлы на сетевых файловых системах.

Может, на хостинге используется внешнее хранилище?

Как вариант, можно использовать '.lock' файлы

Лог в помощь!
F
На сайте с 24.04.2009
Offline
45
#23
Ink-developer:
Ждем от вас чтобы вы их нам указали.

А что указывать, мало того что нет проверки на залочили файл или нет, и обработки события если вдруг файл не залочился

так еще вызвав fopen с a+, делаем после этого кучу ненужных и непонятных действий

Ink-developer
На сайте с 31.01.2009
Offline
138
#24

Ей богу лучше бы молчали 🤣

Fearful:
А что указывать, мало того что нет проверки на залочили файл или нет, и обработки события если вдруг файл не залочился

либо всегда да либо всегда нет, другого не бывает, претензия не принята.

Fearful:
так еще вызвав fopen с a+, делаем после этого кучу ненужных и непонятных действий

То что вы не понимаете смысла этих действий не означает что они не нужны, а лишь, что вы слабы в php

Скиньте ваш скрипт записи данных в файл и я думаю, что он будет гавном. Почему так уверен в этом? Потому что 99% скриптов записи в файл в сети фиктивные и вероятность что вы покажете что-то путевое равна 1%. Только акцентирую внимание, что я имею ввиду скрипт чтения из файла и записи в него же в первую строку.

.

dkameleon
На сайте с 09.12.2005
Offline
386
#25

если ещё учесть этот момент из документации:

'a+' Open for reading and writing; place the file pointer at the end of the file. If the file does not exist, attempt to create it.

то первая операция чтения не должна вообще ничего считывать.

Дизайн интерьера (http://balabukha.com/)
N
На сайте с 06.05.2007
Offline
419
#26
Fearful:
так еще вызвав fopen с a+, делаем после этого кучу ненужных и непонятных действий

таки да. действия ТС не похожи на семантику a=append. зачем лишний раз запутывать библиотеку php ? обещал добавлять данные - вот и добавляй.

я сейчас проверил "c+" - отлично работает. а "a+" действительно необъяснимо глючит. где-то у них еще внутри буферизируется что-то.


<?php
function write($dat){
$fopen=fopen("111.dat","c+");
flock($fopen,LOCK_EX); # Блокируем файл
$file=fread($fopen,50000000); /* Читаем 50 Mb из файла */
if(strlen($file)>=1){ $file=explode("\n",$file); }else{ $file[0]=""; } # Если денные есть превращаем их в массив
$count=count($file);
if($count!="0"){ array_unshift($file,$dat); }else{ $file[0]=$dat; } # Если массив пустой создаем первый элемент иначе цепляем элемент в начало массива
$file=trim(implode("\n",$file)); # Массив превращаем в строку
ftruncate($fopen,0); # Очищаем файл
fseek($fopen, 0);
fwrite($fopen,$file); # Записываем в файл
fflush($fopen);
flock($fopen,LOCK_UN); # Разблокируем
fclose($fopen); # Закрываем
}
for($kr=0;$kr<1000;$kr++){
write(time());
}
?>

еще вот интересно, что в комментах к функции flock в документации некто pentek_imre at mailbox dot hu http://ru.php.net/manual/en/function.flock.php описывает сценарий race condition, но по-моему он гонит. он тоже сделал открытие файла в "a+" и точно так же его проглючило.

мой вариант по выполняемым операция идентичен оригинальной логике и ТС и Пентека того, но в режиме "c+" ничего не глючит.

Кнопка вызова админа ()
edogs software
На сайте с 15.12.2005
Offline
775
#27

Топик лишнее подтверждение того, что локи в php лучше не использовать.

Старый добрый tempnam + rename рулят не по детски.

Даже если сделать всё правильно, всё равно в результате что-нибудь где-нибудь у кого-нибудь пойдет не так, или потом кто-нибудь где-нибудь почему-нибудь в чем-нибудь не разберется и все испортит:)

p.s.: если что - ТС, про tempnam и rename - это совет.

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
F
На сайте с 24.04.2009
Offline
45
#28
netwind:

еще вот интересно, что в комментах к функции flock в документации некто pentek_imre at mailbox dot hu http://ru.php.net/manual/en/function.flock.php описывает сценарий race condition, но по-моему он гонит. он тоже сделал открытие файла в "a+" и точно так же его проглючило.

Вот у меня та же фигня что и у пентека получалась


Then generate a race situation with two php processes:
1: open file ok, no file found, create
2: open file ok, file found seek to the end (0lenght file so to the beginning)
1: lock file ok
2: flock waits since file is already locked.
1: write ok
1: unlock ok
2: flock ok this process now continues
1: fclose ok
2: write something, but due to prebuffering the file is now empty, so content written by 1 is now unconsidered, forgotten.
2: unlock ok
2: fclose ok
file will have only the content from process 2

И почему то этот глюк происходил только если процессы обращались к одному и тому же скрипту, если к разным, то глюка не было.

N
На сайте с 06.05.2007
Offline
419
#29

Fearful, ну вот разве я не написал такой же наивный код, который Пентек критикует?

вот его якобы неправильный вариант


<?php
$f=fopen($filename,"a+") or die();
flock($f,LOCK_EX) or die();
//here write some lines to the file -- not included
//then close:
flock($f,LOCK_UN) or die();
fclose($f) or die();
?>

дальше он упускает важный момент


2: flock ok this process now continues
1: fclose ok
2: должен сделать перемотку в конец файла, потому что с момента открытия в "a+" файл изменился
2: write something, but due to prebuffering the file is now empty, so content written by 1 is now unconsidered, forgotten.
2: unlock ok

"but due to prebuffering the file is now empty" - какой еще prebuffering? при открытии файла через fopen происходит его считывание ? Глючит его.

Ink-developer
На сайте с 31.01.2009
Offline
138
#30

Да все работает, но это все равно не объясняет мне почему не пашет a+ это что тупо глюк php? Где вы вообще этот режим с+ откопали я не могу вообще найти его описание.

1 234

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий