flock (посмертно)

  • Автор темы Автор темы SiMM
  • Дата начала Дата начала

SiMM

Новичок
flock (посмертно)

Написал скрипт следующего вида:
PHP:
$fp=fopen($filename,$option);
flock($fp,LOCK_EX);
// длительные операции
flock($fp,LOCK_UN);
fclose($fp);
Хотя и предусматривал set_time_limit в процессе работы скрипта на (возможно) длительных участках, но случилось так, что скрипт "умер" раньше, чем произошла разлочка (про register_shutdown_function подумал только сейчас - да и даёт ли это 100%-ю гарантию?). В итоге файл теперь залочен насмерть и встала проблема его разлочки. Может, чего посоветуете?
 
IntenT, а в чём? Честно говоря, насколько я понял перевод приведённого текста, ничего по теме там нет. Лочка осуществляется одинаково (запускается один и тот же скрипт), с правами всё в порядке (некоторое время назад всё работало как надо), проблема в том, что PHP не сделал унлок залоченного файла в момент, когда скрипт был убит (каюсь, register_shutdown_function не предусмотрел).
PS: я опустил в приведённом коде проверки на то, что файл открылся и лочка прошла успешно. Но дело именно в лочке.
 
Popoff, я тоже думаю, что это логично, но он у меня не снялся - помогла либо перезагрузка сервака (связался с админом и рассказал о своей проблеме), либо скрипт
PHP:
$fp=fopen($filename,$option); 
flock($fp,LOCK_UN); 
fclose($fp);
- просто я полагал (и ещё полагаю), что раз функция flock работает с хэндлом, то это сработать не должно.
На всякий случай добавлю, что PHP был установлен как модуль Апача, возможно лок всё же не снимается автоматически (в описании, насколько я успел заметить, этому моменту внимания не уделяется).
2IntenT, как я уже говорил, я не силён в аглицком, но смысл этой фразы от выделения её части для сократа ничуть не изменился. В русском же мануале Пирамидина эта фраза звучит как
PHP поддерживает перенос блокированных файлов advisory-способом (что означает, что все программы, выполняющие доступ, должны использовать тот же способ блокирования, или блокировка работать не будет).
О том, что все программы, выполняющие доступ, лочат его той же самой функцией flock и тем же самым методом, я уже упомянул (да и вообще, с файлом работает лишь один скрипт).
Удалять файл не пробовал (да и сурово это как то - разве что только после резервного копирования ;) ), переименовать/переместить - тоже не догадался/не успел.
Собственно, пока проблема решена - лишь бы она не успела повториться до доработки скриптов.
 
На всякий случай добавлю, что PHP был установлен как модуль Апача, возможно лок всё же не снимается автоматически (в описании, насколько я успел заметить, этому моменту внимания не уделяется).
Ну, так никто не мешает попробовать :)
Например, таким скриптом:
PHP:
$fp=fopen($filename,$option); 
if(flock($fp,LOCK_EX)) echo "да"; else echo "нет";
a_call_to_an_unexisting_function();
Если бы лок не снимался автоматически, то при втором запуске скрипт завис бы в ожидании блокировки :)
 
Popoff, именно это у меня и происходило (зависание скрипта) - я же не с потолка взял, что дело в лочке :)
 
Сверху