На это можно ответить, но я не могу найти здесь просьбы.
Рассмотрим пример php-скрипта, который удаляет строку по пользовательскому вводу
$DELETE_LINE = $_GET['line']; $out = array(); $data = @file("foo.txt"); if($data) { foreach($data as $line) if(trim($line) != $DELETE_LINE) $out[] = $line; } $fp = fopen("foo.txt", "w+"); flock($fp, LOCK_EX); foreach($out as $line) fwrite($fp, $line); flock($fp, LOCK_UN); fclose($fp);
Я хочу знать, если какой-либо пользователь в настоящее время выполняет этот скрипт, а файл «foo.txt» заблокирован в одно и то же время или до завершения его выполнения, если какой-либо другой пользователь вызывает этот скрипт, то что произойдет? Будет ли второй процесс пользователей ждать разблокировки файлов для первых пользователей? или удаление строки вторым вводом пользователей не удастся?
Если вы попытаетесь приобрести эксклюзивную блокировку, а другой процесс заблокирован, ваша попытка будет ждать, пока файл не будет разблокирован. Это и есть цель блокировки.
См. Документацию Linux о flock()
, в которой описывается, как она работает в целом в разных операционных системах. PHP использует fcntl () под капотом, поэтому общие ресурсы NFS поддерживаются.
Нет таймаута. Если вы хотите реализовать тайм-аут самостоятельно, вы можете сделать что-то вроде этого:
$count = 0; $timeout_secs = 10; //number of seconds of timeout $got_lock = true; while (!flock($fp, LOCK_EX | LOCK_NB, $wouldblock)) { if ($wouldblock && $count++ < $timeout_secs) { sleep(1); } else { $got_lock = false; break; } } if ($got_lock) { // Do stuff with file }