Как использовать стайку в PHP?

В моем php-коде я хочу создать код чтения / записи. Таким образом, будет файл, который читает или записывает php-код. Может быть только 1 писатель, или может быть много читателей, но вы можете писать и читать одновременно.

Как это можно сделать в PHP? Я считаю, вам нужно использовать код flock ?

Я с комментарием Данэка – php-документация flock() содержит очень хороший пример:

 $fp = fopen("/tmp/lock.txt", "r+"); if (flock($fp, LOCK_EX)) { // exclusive lock will blocking wait until obtained fwrite($fp, "Write something here\n"); // or ... execute_code_that_shouldnt_run_twice_at_the_same_time(); flock($fp, LOCK_UN); // unlock } else { echo "failed to obtain lock"; } fclose($fp); 

Обратите внимание, что flock() в режиме по умолчанию блокирует ожидание, пока он не сможет получить блокировку. Это регулярно, если другой процесс получает блокировку в настоящее время.


Но не ожидайте слишком многого от функции flock() . Он использует так называемые консультативные блокировки , которые могут быть проигнорированы другими процессами. В Linux, например, flock() PHP использует функцию ядра flock() , man 2 flock объясняет, как это работает:

flock () помещает только защитные блокировки; при наличии соответствующих разрешений на файл, процесс может игнорировать использование flock () и выполнять ввод / вывод в файле.

Значение flock() будет просто давать советы другим процессам. Если им все равно, они могут читать или даже писать независимо от блокировки (или типа блокировки). Однако справочные страницы о другой системе Linux могут обрабатывать это по-разному. (Это не так)

Но, тем не менее, поскольку вы являетесь кодовым процессом, вы можете / и должны заботиться о блокировке с помощью flock() каждом обращении к файлу. Но вы не можете быть уверены, что другой процесс – как текстовый редактор – не перезапишет ваш файл

Если вы хотите читать и писать в одно и то же время, вы не можете. Это небезопасное поведение. Просто используйте эксклюзивную запись для записи, и ваши читатели (используя совместную блокировку) будут блокироваться, ожидая, когда сможете ее прочитать. Таким образом, они никогда не смогут читать из неполного файла, но всегда смогут прочитать в конце концов.

Ох, и не блокируйте файл дольше, чем нужно. Если вы делаете длительные изменения (например, ожидание активности сети), блокируйте его, обновляйте, разблокируйте, ждите, пока не получите больше данных, не заблокируйте его, не обновите, не разблокируйте. Или еще лучше, буферизуйте данные внутри и запишите их за один раз.