Эта тема на forum.dklab.ru


berkut: flock()
При использовании flock() вылетает табличка примерно с таким содержанием: в приложении Apache.exe обнаружена ошибка, приложение будет закрыто.Извиняемся за потерю данных и т.д. +спрашивает,отправить-ли отчёт об ошибке. WinXP pro sp1
Но апач кстати не вырубаеться. Что это может быть?
Юрий Насретдинов:
berkut:
Хм... Денвер ?
Ant:
Приведите код.
Дмитрий Котеров:
Это может быть ошибка в PHP. Какая версия?
berkut:
Стоит Денвер(по-моему самый последний), ПХП 4.3.0
Код:
$hdl= fopen("$dirct/$ocenka", "w");
flock($hdl);
for ($i=0; $i<7; $i++)
{
$file[$i]=trim($file[$i]);
fwrite($hdl, "$file\n");
}
fclose($hdl);
Дмитрий Котеров:
Ну, хотя это к данной ошибке отношения не имеет, я Вам скажу, что этот код бессмысленный, и flock из него можно спокойно убрать — это ни на что не повлияет. Вы подумайте, что Вы делаете: сначала уничтожаете файл и создаете на его месте пустой, а потом эту пустышку блокируете. В этом нет смысла.

Надо так делать:

@fclose(fopen("$dirct/$ocenka", "a+"));
$hdl= fopen("$dirct/$ocenka", "r+");
flock($hdl, LOCK_EX);
...

berkut:
Не знаю, уместно-ли в этом форуме задавать вопросы по программированию, но не могли-бы вы объяснить что значит конструкция
fclose(fopen("$dirct/$ocenka", "a+")); - я так понимаю, что это получаеться вообще пустым оператором. А для чего он нужен?
Дмитрий Котеров:
Чтобы создать файл пустым, если его еще нет. А если есть — не трогать. Так что эта операция совершенно безопасна. Последующий r+ открывает файл на чтение и запись, но проваливается, если файла не существует. Можно, конечно, было прямо там написать a+, но в некоторых версиях FreeBSD в этом режиме огромные глюки с fseek().
Дмитрий Котеров:
Перенесено из форума: Денвер::Форум для начинающих.
Перенесено в форум: Программирование::PHP::Склад готовых решений.
berkut:
А что произойдёт, если один скрипт попытаеться открыть файл, заблокированный другим скриптом? Ошибка?
Дмитрий Эсс:
berkut:
Зависит от блокировки, но в любом случае одному процессу придётся подождать. Ошибки не будет.
Дмитрий Котеров:
berkut:
Вы так спрашиваете, как будто бы вообще не понимаете, что такое блокировка и зачем она нужна. (-;
Конечно же, не будет никаких ошибок.
Vition:
berkut:
Зависит от блокировки, но в любом случае одному процессу придётся подождать. Ошибки не будет.
berkut:
Вы так спрашиваете, как будто бы вообще не понимаете, что такое блокировка и зачем она нужна. (-;
Конечно же, не будет никаких ошибок.

Вменяемой информации по работе блокировок файлов flock мало и ее трудно найти.
Ранее не нужно было, а сейчас сам задался таким вопросом. Порыл и нашел кучу противоречивой информации.

Вот если процесс ждет, то почему по этой ссылке http://ua2.php.net/manual/ru/function.flock.php в комментариях видится такой вот код

// keep trying to get a lock as long as possible
do {
if ($retries > 0) {
usleep(rand(1, 10000));
}
$retries += 1;
} while (!flock($fp, LOCK_EX) and $retries <= $max_retries);

ссылку на пример нашел в теме про класс работы с файлами

Какой смысл в таком коде? Ведь процесс и так ждет, а в тех системах, где блокировка не поддерживается, нечего даже и пытаться повторно блокировать.

Далее интересует такой момент. Что будет, если при большом количестве блокировок файла на чтение, процессу надо заблокировать на запись? То есть читают файл, допустим, 3 потока и 4й хочет писать. Но пока он ждет, еще 2 потока открывают файл на чтение, а первые 3 еще не освободили. Что будет в этом случае? Блокировки на чтение станут в очередь за блокировкой на запись или новые блокировки на чтение будут лочить файл и блокировка на запись будет ждать всех их?
Юрий Насретдинов:
Приведенный Вами смысловой нагрузки не несет, разве что дескриптор открыт в неблокирующем режиме (по каким-то причинам).

По поводу блокировки на запись: скорее всего эксклюзивная блокировка будет иметь более высокий приоритет, и блокировки на чтение будут обслуживаться после эксклюзивных.
Александр Михалицын:
Не увидел тут никакого «готового решения», посему:

Перенесено из форума: Склад готовых решений :: PHP.
Перенесено в форум: Разное :: PHP.

Эта тема на forum.dklab.ru