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

SiMM

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

Написал скрипт следующего вида:
PHP:
$fp=fopen($filename,$option);
flock($fp,LOCK_EX);
// длительные операции
flock($fp,LOCK_UN);
fclose($fp);
Хотя и предусматривал set_time_limit в процессе работы скрипта на (возможно) длительных участках, но случилось так, что скрипт "умер" раньше, чем произошла разлочка (про register_shutdown_function подумал только сейчас - да и даёт ли это 100%-ю гарантию?). В итоге файл теперь залочен насмерть и встала проблема его разлочки. Может, чего посоветуете?
 

SiMM

Новичок
IntenT, а в чём? Честно говоря, насколько я понял перевод приведённого текста, ничего по теме там нет. Лочка осуществляется одинаково (запускается один и тот же скрипт), с правами всё в порядке (некоторое время назад всё работало как надо), проблема в том, что PHP не сделал унлок залоченного файла в момент, когда скрипт был убит (каюсь, register_shutdown_function не предусмотрел).
PS: я опустил в приведённом коде проверки на то, что файл открылся и лочка прошла успешно. Но дело именно в лочке.
 

SiMM

Новичок
Popoff, я тоже думаю, что это логично, но он у меня не снялся - помогла либо перезагрузка сервака (связался с админом и рассказал о своей проблеме), либо скрипт
PHP:
$fp=fopen($filename,$option); 
flock($fp,LOCK_UN); 
fclose($fp);
- просто я полагал (и ещё полагаю), что раз функция flock работает с хэндлом, то это сработать не должно.
На всякий случай добавлю, что PHP был установлен как модуль Апача, возможно лок всё же не снимается автоматически (в описании, насколько я успел заметить, этому моменту внимания не уделяется).
2IntenT, как я уже говорил, я не силён в аглицком, но смысл этой фразы от выделения её части для сократа ничуть не изменился. В русском же мануале Пирамидина эта фраза звучит как
PHP поддерживает перенос блокированных файлов advisory-способом (что означает, что все программы, выполняющие доступ, должны использовать тот же способ блокирования, или блокировка работать не будет).
О том, что все программы, выполняющие доступ, лочат его той же самой функцией flock и тем же самым методом, я уже упомянул (да и вообще, с файлом работает лишь один скрипт).
Удалять файл не пробовал (да и сурово это как то - разве что только после резервного копирования ;) ), переименовать/переместить - тоже не догадался/не успел.
Собственно, пока проблема решена - лишь бы она не успела повториться до доработки скриптов.
 

Popoff

popoff.donetsk.ua
На всякий случай добавлю, что PHP был установлен как модуль Апача, возможно лок всё же не снимается автоматически (в описании, насколько я успел заметить, этому моменту внимания не уделяется).
Ну, так никто не мешает попробовать :)
Например, таким скриптом:
PHP:
$fp=fopen($filename,$option); 
if(flock($fp,LOCK_EX)) echo "да"; else echo "нет";
a_call_to_an_unexisting_function();
Если бы лок не снимался автоматически, то при втором запуске скрипт завис бы в ожидании блокировки :)
 

SiMM

Новичок
Popoff, именно это у меня и происходило (зависание скрипта) - я же не с потолка взял, что дело в лочке :)
 
Сверху