netwind

Рейтинг
419
Регистрация
06.05.2007
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+" ничего не глючит.

Andreyka,

netwind:
а что у нас "энтерпрайзные коробки с винтами" уже научились изображать кластерные файловые системы и дублировать друг друга ?

ok.

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

То есть, купили ДВА ящика, набили винтами, воткнули в одну сеть, примонтировали общую файловую систему к каждому вебсерверу. И это все заработало легко и приятно.

Не требуя для эксплуатации специально обученного персонала.

Дублируя информацию друг на друге.

Не создавая недопустимых задержек.

Эти все требования к хранилищу вытекают из моего вольного определения "энтерпрайзная коробка с винтами" и требований ТС к системе хранения.

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

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:
Это ты думаешь, что я так думаю, но ты ошибаешся, там вообще и 10 мб не пахнет.

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

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

$file=fread($fopen,50000000); /* Читаем 50 Mb из файла */

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

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

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

landan, какой-то вопрос не по сути.

Ну да, если у тебя на рабочем ПК скорость отдачи высокая, то тебе будет легче заливать видео на свой сервер.

И что дальше?

Andreyka, я уже давно подозреваю, что вы - бот : на знакомые слова реагируете рекламой, а сути вопроса не улавливаете.

Andreyka, мне то зачем ? просто ссылку дай на конкретные модели оборудования в подтверждение своих слов.

Raistlin, ну это уж каждому по возможностям. ты же не напишешь это бесплатно и специально для ТС. memcache к тому очищается при перезапуске и его размер ограничен

Всего: 6293