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

123 4
BredoGen.
На сайте с 19.10.2009
Offline
98
#11

Укажите еще ОС и точную версию PHP (ts/nts). Попробую воспроизвести.

Ink-developer
На сайте с 31.01.2009
Offline
138
#12
dkameleon:
Не ваш ли это случай?

Склоняюсь к тому что, нет, т.к. в этом случае flock бы вообще не работал, а он работает и это проверено на практике, второй скрипт ждет выполнения 1го и только потом выполняется, из чего следует что flock работает.

N
На сайте с 06.05.2007
Offline
419
#13
$file=fread($fopen,50000000); /* Читаем 50 Mb из файла */

ну это ты так думаешь, что 50 мб. на самом деле читаем не более 50 мб. формально даже для большого файла функция в праве вернуть 1 байт.

та же фигня и с fwrite(). он может не захотеть и не записать указанный размер.

используй базу данных и все будет хорошо.

Кнопка вызова админа ()
Ink-developer
На сайте с 31.01.2009
Offline
138
#14
BredoGen.:
Укажите еще ОС и точную версию PHP (ts/nts). Попробую воспроизвести.

В локалке

Windows 7 PHP 5.3.2

Хостинг

Линукс какойто PHP 5.2

Тут такое дело что получилось без ошибок выполнить код, но крайне странным способом:

после блокировки файла базы, я отвлекаю процесс от данного файла и немного работаю с другим, что угодно хоть содаю левый файл хоть что, и ошибка пропадает, в файл записывается ровно 2000 строк.

netwind:
ну это ты так думаешь, что 50 мб.

Это ты думаешь, что я так думаю, но ты ошибаешся, там вообще и 10 мб не пахнет, не поверишь хватило ума написать с прозапасом.

N
На сайте с 06.05.2007
Offline
419
#15
Ink-developer:
Это ты думаешь, что я так думаю, но ты ошибаешся, там вообще и 10 мб не пахнет.

я абсолютно точно знаю, что такое использование fread и fwrite неправильное. это становится очевидно после прочтения документации.

влияет ли это или нет на описанную тобой проблему - мне думать лень.

Ink-developer
На сайте с 31.01.2009
Offline
138
#16
netwind:
я абсолютно точно знаю, что такое использование fread и fwrite неправильное. это становится очевидно после прочтения документации.
влияет ли это или нет на описанную тобой проблему - мне думать лень.

Было бы более внушительно если бы вы показали строку из мануала которая доказывает неправильное использование fread и fwrite в данном скрипте, т.к. я абсолютно точно знаю что все правильно и мои слова такие же пустые как и ваши без подтверждения фактами.

netwind:
используй базу данных и все будет хорошо.

Если бы я хотел уйти от проблемы я бы это сделал, но я хочу ее решить.

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

http://php.net/manual/en/function.fread.php

fread() reads up to length bytes from the file pointer referenced by handle.

не ровно length bytes, а именно ДО. так же и с fwrite.

обычно код с использованием fread/fwrite оборачивается в цикл. тут и разбираться не нужно - сразу видно потенциальную ошибку.

И эта ошибка может быть причиной наблюдаемого эффекта. А может и не быть.

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

netwind, И вы как бы не замечаете что написано далее:

fread() reads up to length bytes from the file pointer referenced by handle. Reading stops as soon as one of the following conditions is met:

1) length bytes have been read

2) EOF (end of file) is reached

Явно описано что второй вариант окончание чтения по окончании файла, тоесть если указано больше чем на самом деле чтение прекращается в момент когда заканчиваются данные, что подтверждает приемлимость использования того варианта который у меня в скрипте.

Но несмотря на это я использовал до этого $file=fread($fopen,filesize($fname)); что ситуацию ни как не меняет, подумал что он глючит и попробовал так как есть сейчас, разницы нет.

netwind:
не ровно length bytes, а именно ДО. так же и с fwrite.

Да именно так и надо ДО, т.к. я знаю что более не будет исходя их этого и выбрал данное число, исходя из чего все ваши аргументы сработали получается только в подтверждение правильности моего метода.

Вы зацепились за комментарий который там вписан /* Читаем 50 Mb из файла */, но он написан от балды исключительно, чтобы не забыть что там до 50 а не до 5 или 500. Смысла другого я в него не вкладывал, а то что до 50 так тут ни кто не спорит, коммент неправильный, но вы то писали про сам метод использования fwrite fread которые применяются полностью в соответствии с мануалом.

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

Ink-developer, а остальные 2 случая кто будет читать? да мало ли по какой причине ему захочется вернуть меньше байт. В документации так же не написано, что есть гарантия на то что файл полностью считается за один вызов.

F
На сайте с 24.04.2009
Offline
45
#20
netwind:
http://php.net/manual/en/function.fread.php

не ровно length bytes, а именно ДО. так же и с fwrite.
обычно код с использованием fread/fwrite оборачивается в цикл. тут и разбираться не нужно - сразу видно потенциальную ошибку.
И эта ошибка может быть причиной наблюдаемого эффекта. А может и не быть.

Кстати, заметил странную закономерность, что если запускать скрипт на запись в фал из двух вкладок браузера практически одновременно (запускал не его скрипт, а свой) то пишет в файл так, как будто запущен скрипт всего один раз. Причем пофиг что на платном хостинге, что на локальном компе.

Ради теста решил проверить какой результат выдает функция time(), получилось что даже при разнице в 2-3 секунды во времени запуска, время выдает одинаковое.

Тут же решил запустить тот же код но из разных файлов, и вот тут оказалось что работает все.

Странно как-то получается. А у него похоже к этому еще и накладываются ошибки его кода.

123 4

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