Автор Тема: Внесение изменений в текстовый файл  (Прочитано 14660 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн UltraMax

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 98
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.dinamo-minsk.org
Внесение изменений в текстовый файл
« Ответ #15 : 10 Декабря 2004, 13:17:52 »
Alexey333 никакого самомнения тут нет и в помине.
Я пришел сюда за советом, а не лажать блокировку.

Это раз - а во вторых - у тебя открывается файл на добавление, а не на обнуление. С таким открытием у меня тоже проблем нет.
Попробуй открывать файл с параметром "w" и дать ему нагрузку
Посмотрим что ты потом скажешь

Ничего личного...

Оффлайн Alexey333

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 107
  • +0/-0
  • 0
    • Просмотр профиля
Внесение изменений в текстовый файл
« Ответ #16 : 10 Декабря 2004, 17:53:55 »
А я и с w открываю. Проблем никаких нет.

Оффлайн Alexey333

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 107
  • +0/-0
  • 0
    • Просмотр профиля
Внесение изменений в текстовый файл
« Ответ #17 : 10 Декабря 2004, 17:59:58 »
Да, что ты хотел сказать этим "дать ему нагрузку"? Есть специальные проги для искусственной нагрузки скриптов для проверки? Если да, то дай ссылку.

Оффлайн UltraMax

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 98
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.dinamo-minsk.org
Внесение изменений в текстовый файл
« Ответ #18 : 10 Декабря 2004, 18:51:49 »
Тут описано как парень тестировал flock
http://php.spb.ru/php/flock2.html
можешь посмотреть

Оффлайн Alexey333

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 107
  • +0/-0
  • 0
    • Просмотр профиля
Внесение изменений в текстовый файл
« Ответ #19 : 10 Декабря 2004, 19:59:48 »
Цитировать
UltraMax:
Тут описано как парень тестировал flock
http://php.spb.ru/php/flock2.html
можешь посмотреть

Я слышал, что есть специальные проги для проверки.
Кстати, в данной статье этот парень совершил серьезную ошибку:

$f=fopen("flock2_test.txt","r") or die(system("echo fopen_read >> /tmp/11qq"));
   
flock($f,2);
   
$s=trim(fgets($f,100));
   
$md=trim(fgets($f,100));


При чтении файла он использовал не ту блокировку flock($f,2);. А надо при чтении использовать  flock($f,1);!

Оффлайн UltraMax

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 98
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.dinamo-minsk.org
Внесение изменений в текстовый файл
« Ответ #20 : 10 Декабря 2004, 20:10:12 »
В чем серьезность ошибки?
В том что этим локом он не дал больше никому доступиться до файла?
Не вижу тут страшного ничего...

Оффлайн Alexey333

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 107
  • +0/-0
  • 0
    • Просмотр профиля
Внесение изменений в текстовый файл
« Ответ #21 : 11 Декабря 2004, 08:06:32 »
Цитировать
UltraMax:
В чем серьезность ошибки?
В том что этим локом он не дал больше никому доступиться до файла?
Не вижу тут страшного ничего...

Как это ты не видишь разницы?!
Вот тут хорошо написано (хоть и не из PHP):
http://www.itfond.ru/cache/41summary.html
"Усовершенствованная команда LOCK - Команда LOCK была усовершенствована для поддержки разделяемых блокировок (против эксклюзивных) и обеспечивает высокую производительность при частом применении блокировок."

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

Оффлайн UltraMax

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 98
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.dinamo-minsk.org
Внесение изменений в текстовый файл
« Ответ #22 : 13 Декабря 2004, 13:07:22 »
Alexey333, ты не объяснишь мне, при чем тут СУБД Cache (и ее описание) - к функции flock на PHP?

Оффлайн Alexey333

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 107
  • +0/-0
  • 0
    • Просмотр профиля
Внесение изменений в текстовый файл
« Ответ #23 : 13 Декабря 2004, 16:22:12 »
Цитировать
UltraMax:
Alexey333, ты не объяснишь мне, при чем тут СУБД Cache (и ее описание) - к функции flock на PHP?

Я же ясно написал "хоть и не из PHP". Сам принцип важен!
Ну раз тебе не понятно, то напечатаю отрывок из книги Д. Котерова "Самоучитель PHP 4":
"Мы решили ровно половину нашей задачи. Действительно, теперь данные из нескольких процессов-писателей не будут перемешиваться, но как быть с читателями?........................
........
Существуют два метода обхода этой проблемы. Первый - это использовать все ту же исключительную блокировку. Действительно, кто сказал, что исключительную блокировку можно применять только в процессах, изменяющих файл? Ведь функция flock() не знает, что будет выполнено с файлом, для которого она вызвана." Однако этот метод довольно-таки неудачен, и вот по какой причине. Представьте, что процессов-читателей много, а писателей - мало, и к тому же писатели еще и вызываются, скажем, раз в пару минут, а не постоянно как читатели. В случае использования исключительной блокировки для процессов-читателей, довольно интенсивно обращающихся к файлу, мы очень скоро получим целый их рой, висящий, недовольно гудя, в очереди, пока очередному процессу разрешат читать. Но ведь никакой аварии не случится, если один и тот же файл будут читать и сразу все процессы этого роя, правда? Ведь чтение из файла его не изменяет.  
Итак, предоставив исключительную блокировку для читателей, мы потенциально получаем проблемы с производительностью, перерастающие в КАТАСТРОФУ, когда процессов-читателей становится больше некоторого определенного порога.

Оффлайн UltraMax

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 98
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.dinamo-minsk.org
Внесение изменений в текстовый файл
« Ответ #24 : 13 Декабря 2004, 20:31:52 »
ладно
мы скатились не в ту тему
вопрос то остается
что у меня неправильного
я делаю 3 операции с файлом в котором хранятся данные

первая - чтение
$handle fopen("/home/dmnorg/results.txt""r");
$contents fread($handlefilesize("/home/dmnorg/results.txt"));
fclose($handle);


вторая - добавление
    $handle fopen ("/home/dmnorg/results.txt""a");
    if (
flock($handleLOCK_EX)) { // do an exclusive lock
    
fwrite($handle$string);
    
fflush($handle);
    
flock($handleLOCK_UN); // release the lock


третья - изменение
 
    $handle 
fopen ("/home/dmnorg/results.txt""r+");
    if (
flock($handleLOCK_EX)) { // do an exclusive lock
    
ftruncate($handle,0);
    
fwrite($handle$contents_replaced);
    
fflush($handle);
    
flock($handleLOCK_UN); // release the lock


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

Оффлайн Alexey333

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 107
  • +0/-0
  • 0
    • Просмотр профиля
Внесение изменений в текстовый файл
« Ответ #25 : 13 Декабря 2004, 20:42:23 »
А в $contents_replaced и $string что?

Оффлайн UltraMax

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 98
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.dinamo-minsk.org
Внесение изменений в текстовый файл
« Ответ #26 : 13 Декабря 2004, 21:17:36 »
Вот что - но помоему это не так и важно?

$posit strpos(strtolower($contents), strtolower($str));
if (
$posit === false) {
    echo 
"Внимание, ссылка активации неправильная. Вернитесь в вашу почту, и попытайтесь еще раз!";
    } else {
    
$contents_replaced=substr_replace($contents$str_y$posit);
//    echo $contents_replaced;
    
$handle fopen ("/home/dmnorg/results.txt""r+");
    if (
flock($handleLOCK_EX)) { // do an exclusive lock
    
ftruncate($handle,0);
    
fwrite($handle$contents_replaced);
    
fflush($handle);
    
flock($handleLOCK_UN); // release the lock
    
} else {
    echo 
"Couldn\'t lock the file !";
    }
    
fclose($handle);


а $string у меня - большой большой текст
строчки 3 :)

да еще забыл - есть еще одно чтение

$handle 
fopen("/home/dmnorg/results.txt""r");
    if (
flock($handleLOCK_SH)) { // do an exclusive lock
    
$handle fopen("/home/dmnorg/results.txt""r");
    
$contents urldecode(fread($handlefilesize("/home/dmnorg/results.txt")));
    
flock($handleLOCK_UN); // release the lock
    
}
fclose($handle);

Оффлайн UltraMax

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 98
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.dinamo-minsk.org
Внесение изменений в текстовый файл
« Ответ #27 : 22 Декабря 2004, 12:34:34 »
короче никто ответа по СУЩЕСТВУ не дал... :(
увы

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Внесение изменений в текстовый файл
« Ответ #28 : 23 Декабря 2004, 00:08:58 »
почему бы тебе при перезаписи не делать все в рамках одного лока? и чтение и запись

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28