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+" ничего не глючит.
netwind: а что у нас "энтерпрайзные коробки с винтами" уже научились изображать кластерные файловые системы и дублировать друг друга ?
ok.
какие именно устройства для хранения данных используемые в бизнесе, умеют объединяться в единую файловую систему и работать дублируя друг друга ?
То есть, купили ДВА ящика, набили винтами, воткнули в одну сеть, примонтировали общую файловую систему к каждому вебсерверу. И это все заработало легко и приятно.
Не требуя для эксплуатации специально обученного персонала.
Дублируя информацию друг на друге.
Не создавая недопустимых задержек.
Эти все требования к хранилищу вытекают из моего вольного определения "энтерпрайзная коробка с винтами" и требований ТС к системе хранения.
Ink-developer, а остальные 2 случая кто будет читать? да мало ли по какой причине ему захочется вернуть меньше байт. В документации так же не написано, что есть гарантия на то что файл полностью считается за один вызов.
Raistlin, ну это уж каждому по возможностям. ты же не напишешь это бесплатно и специально для ТС. memcache к тому очищается при перезапуске и его размер ограничен
так еще вызвав fopen с a+, делаем после этого кучу ненужных и непонятных действий
таки да. действия ТС не похожи на семантику a=append. зачем лишний раз запутывать библиотеку php ? обещал добавлять данные - вот и добавляй.
я сейчас проверил "c+" - отлично работает. а "a+" действительно необъяснимо глючит. где-то у них еще внутри буферизируется что-то.
еще вот интересно, что в комментах к функции flock в документации некто pentek_imre at mailbox dot hu http://ru.php.net/manual/en/function.flock.php описывает сценарий race condition, но по-моему он гонит. он тоже сделал открытие файла в "a+" и точно так же его проглючило.
мой вариант по выполняемым операция идентичен оригинальной логике и ТС и Пентека того, но в режиме "c+" ничего не глючит.
Andreyka,
а что у нас "энтерпрайзные коробки с винтами" уже научились изображать кластерные файловые системы и дублировать друг друга ?
ok.
какие именно устройства для хранения данных используемые в бизнесе, умеют объединяться в единую файловую систему и работать дублируя друг друга ?
То есть, купили ДВА ящика, набили винтами, воткнули в одну сеть, примонтировали общую файловую систему к каждому вебсерверу. И это все заработало легко и приятно.
Не требуя для эксплуатации специально обученного персонала.
Дублируя информацию друг на друге.
Не создавая недопустимых задержек.
Эти все требования к хранилищу вытекают из моего вольного определения "энтерпрайзная коробка с винтами" и требований ТС к системе хранения.
Ink-developer, а остальные 2 случая кто будет читать? да мало ли по какой причине ему захочется вернуть меньше байт. В документации так же не написано, что есть гарантия на то что файл полностью считается за один вызов.
http://php.net/manual/en/function.fread.php
не ровно length bytes, а именно ДО. так же и с fwrite.
обычно код с использованием fread/fwrite оборачивается в цикл. тут и разбираться не нужно - сразу видно потенциальную ошибку.
И эта ошибка может быть причиной наблюдаемого эффекта. А может и не быть.
Это ты думаешь, что я так думаю, но ты ошибаешся, там вообще и 10 мб не пахнет.
я абсолютно точно знаю, что такое использование fread и fwrite неправильное. это становится очевидно после прочтения документации.
влияет ли это или нет на описанную тобой проблему - мне думать лень.
ну это ты так думаешь, что 50 мб. на самом деле читаем не более 50 мб. формально даже для большого файла функция в праве вернуть 1 байт.
та же фигня и с fwrite(). он может не захотеть и не записать указанный размер.
используй базу данных и все будет хорошо.
landan, какой-то вопрос не по сути.
Ну да, если у тебя на рабочем ПК скорость отдачи высокая, то тебе будет легче заливать видео на свой сервер.
И что дальше?
Andreyka, я уже давно подозреваю, что вы - бот : на знакомые слова реагируете рекламой, а сути вопроса не улавливаете.
Andreyka, мне то зачем ? просто ссылку дай на конкретные модели оборудования в подтверждение своих слов.
Raistlin, ну это уж каждому по возможностям. ты же не напишешь это бесплатно и специально для ТС. memcache к тому очищается при перезапуске и его размер ограничен