Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

file_put_contents() и блокировки. (Чучундер)
Author Message
Чучундер
Guest





Карма: 388
   поощрить/наказать


PostPosted: Mon Oct 31, 2005 11:18 am (написано за 1 минуту 23 секунды)
   Post subject: file_put_contents() & file_put_contents()
Reply with quote

Вы тут наверное занющий народ, объясните мне, пожалуйста.
Используются при вызове этих функций блокировки или лучше будет с fopen()?
file_get_contents() читает файл в бинарном режиме?

Еще раз заренее спасибо.
Back to top
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Mon Oct 31, 2005 11:37 am (спустя 18 минут; написано за 1 минуту 20 секунд)
   Post subject:
Reply with quote

Год назад я чмотрел исходники PHP. В то время - НЕ использовались, так что fopen() в случае обновления данных явно рулит.
Сейчас (по крайней мере, в PHP 5.0.5) ситуация вроде как не изменилась (ext/standard/file.c).
Если хотите, можете добавить wish в bugs.php.net.
Back to top
View user's profile Send private message Send e-mail
Advanced Guest
Guest





Карма: 388
   поощрить/наказать


PostPosted: Mon Nov 07, 2005 10:56 pm (спустя 7 дней 11 часов 19 минут; написано за 55 секунд)
   Post subject:
Reply with quote

Рулит ли rename в случае "обновления данных"? по сравнению с локом?
Мне очень нравится rename, везде использую. Вот теперь думаю что может быть не прав.
Back to top
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Tue Nov 08, 2005 12:31 pm (спустя 13 часов 34 минуты; написано за 1 минуту 51 секунду)
   Post subject:
Reply with quote

Rename опасен тем, что другой скрипт может "вклиниться" в момент, когда файл переименован на новое имя, а назад - еще нет. Либо же - возможна потеря данных при "переименовании поверх". Все эти ухищрения с rename, IMHO, из-за непонимания того, как работает flock, и неумения его использовать.
Back to top
View user's profile Send private message Send e-mail
Advanced Guest
Guest





Карма: 388
   поощрить/наказать


PostPosted: Tue Nov 08, 2005 12:46 pm (спустя 14 минут; написано за 7 минут 14 секунд)
   Post subject:
Reply with quote

Немного другое использование rename подразумевал. Извините что не пояснил сразу.
Вклиниться "в момент" не получится, так как исходный файл никогда не удаляю. Просто читаю содержимое, потом пишу во временный файл, потом переименовываю.
Потеря данных в смысле что оба скрипта делали rename "одновременно" и данные от одного потерялись? Это в данном случае не беспокоит. у меня в скриптах кто последний записал того и тапки.
Учитывая вышесказанное rename имеет право жить в данной ситуации?
С flock-ом как-то всё странно подглючивало, и после прочтения spectator.ru/technology/php/flock_workaround к rename-у и пришел.
flock изначально использовал, возможно действительно наступил на грабли. Но, естественно, плохо понимаю как его можно не уметь использовать (открыл файл/залочил/проперировал/разлочил/закрыл). Есть какие-либо грабли на которые обычно наступают с flock?
Back to top
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Tue Nov 08, 2005 11:19 pm (спустя 10 часов 33 минуты; написано за 1 минуту 38 секунд)
   Post subject:
Reply with quote

Advanced Guest wrote:
Вклиниться "в момент" не получится, так как исходный файл никогда не удаляю. Просто читаю содержимое, потом пишу во временный файл, потом переименовываю.
В том-то и дело. Если оба скрипта будут создавать временные файлы одновременно, то результат работы одного из них потеряется, как будто бы скрипт и не запускался вовсе.

Спектатор неграмотно пишет про flock.

Как его использовать, кто уж только ни писал...
Code (php): скопировать код в буфер обмена
<?php #
$file = "file.txt";

//
//
fclose (www.php.net/fclose)(fopen (www.php.net/fopen)($file, "a+b"));

//
$f = fopen (www.php.net/fopen)($file, "r+b") or die (www.php.net/die)("   !");
flock (www.php.net/flock)($f, LOCK_SH); //

  // . . .
  //
  //
  // . . .

//
fclose (www.php.net/fclose)($f);
?>
Code (php): скопировать код в буфер обмена
<?php ## Модель процесса-писателя.
$file = "file.txt";

// Вначале создаем пустой файл, ЕСЛИ ЕГО ЕЩЕ НЕТ.
// Если же файл существует, это его не разрушит.
fclose (www.php.net/fclose)(fopen (www.php.net/fopen)($file, "a+b"));

// Блокируем файл.
$f = fopen (www.php.net/fopen)($file, "r+b") or die (www.php.net/die)("Не могу открыть файл!");
flock (www.php.net/flock)($f, LOCK_EX); // ждем, пока мы не станем единственными

  // . . .
  // В этой точке мы можем быть уверены, что только эта
  // программа работает с файлом.
  // . . .

// Все сделано. Снимаем блокировку.
fclose (www.php.net/fclose)($f);
?>
Code (php): скопировать код в буфер обмена
<?php #
$file = "file.txt";

//
//
fclose (www.php.net/fclose)(fopen (www.php.net/fopen)($file, "a+b"));

//
$f = fopen (www.php.net/fopen)($file, "r+b") or die (www.php.net/die)("   !");

while (true) {
  flock (www.php.net/flock)($f, LOCK_EX); //
  // . . .
  //
  //
  // . . .
  fflush (www.php.net/fflush)($f);         //
  flock (www.php.net/flock)($f, LOCK_UN); //
  //
  sleep (www.php.net/sleep)(10);
}

fclose (www.php.net/fclose)($f);
?>
Делайте так, и проблем не будет.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Tue Nov 08, 2005 11:20 pm (спустя 1 минуту 1 секунду; написано за 44 секунды)
   Post subject:
Reply with quote

Самая распространенная ошибка при работе с flock - это открытие файла в режиме "w" или "w+". Если чуть подумать мозгом, становится понятно, что это абсолютно бессмысленно и подрывает само понятие "рекомендательная блокировка".
Back to top
View user's profile Send private message Send e-mail
Advanced Guest
Guest





Карма: 388
   поощрить/наказать


PostPosted: Wed Nov 09, 2005 3:24 am (спустя 4 часа 3 минуты; написано за 6 минут 46 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров, спасибо. Большое.
Если можно (наберусь наглости) ещё 2 вопроса.
1) Если файл залочен и скрипт "экстремально" прекращает выполнение (процесс допустим убивается), чем это чревато?
2) По поводу w и w+. Честно пытался включить мозг. Но понять до конца не получилось. Если я правильно понял, то суть сводится к тому, что _если_ fopen делается с w+ и файл на _тот_ момент залочен, то содержимое файла в момент открытия не обнуляется (файл залочен), однако указатель ставится на начало (так как указатель не связан с самим файлом). А если файл на тот момент _не_ залочен то всё ок. Но почему при "отпускании" лока предыдущим скриптом программа не догадывается обнулить содержимое файла автоматом, она же в курсе что его открывали с w+ и что лок _только что_ был отпущен предыдущим процессом, а _этим_ процессом ещё ничего туда _не_ писалось? Или я перенапряг мозг и он выдал чушь?
Back to top
Ant
Сотрудник «Лаборатории»



Joined: 17 Jun 2003
Posts: 6840
Карма: 132
   поощрить/наказать


PostPosted: Wed Nov 09, 2005 10:24 pm (спустя 19 часов 8 секунд; написано за 1 минуту 57 секунд)
   Post subject:
Reply with quote

Advanced Guest, вы понимаете, что такое "добровольная блокировка"? Если вы в одном скрипте будете использовать такую блокировку, это ещё не означает, что другой скрипт не сможет в файл ничего записать. Вы должны быть солидарны и в обоих скриптах "услужливо" проверять, не "заблокировал" ли кто файл (а точнее сказать, не попросил ли кто оставить файл на время в покое).

А вообще, тут термин блокировка, ИМХО, не подходит.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Thu Nov 10, 2005 12:04 pm (спустя 13 часов 39 минут; написано за 34 секунды)
   Post subject:
Reply with quote

Advanced Guest wrote:
Если файл залочен и скрипт "экстремально" прекращает выполнение (процесс допустим убивается), чем это чревато?
Ничем. При завершении скрипта он "отпускает" все открытые в нем файлы.
Advanced Guest wrote:
По поводу w и w+.
RTFM.
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML