atomic — атомарное обновление общего конфигурационного файла (php)

[PHP 7 в Linux]

Я пытаюсь создать общий файл конфигурации между несколькими асинхронно работающими PHP-скриптами.

Один сценарий — «Писатель». Он будет знать, когда будут доступны новые данные конфигурации, и отвечает за запись этой конфигурации в общий файл конфигурации. Ни один другой сценарий не будет иметь разрешения на запись в файл. Конфигурация содержит строку JSON и должна быть записана в одном fwrite () или file_put_contents ().

Данные настолько малы, что кажется излишним вводить ядро ​​базы данных или другой слишком сложный механизм совместного использования.

Все остальные сценарии («Читатели») должны иметь возможность открывать файл в любое время и читать содержимое с уверенностью, что содержимое завершено (не в процессе написания).

Проблема с flock () заключается в том, что если какой-либо Reader открывает файл и использует LOCK_SH, то Writer не может получить LOCK_EX для файла и блокируется. Поскольку считыватели открывают файл в произвольные моменты времени, возможны совпадения и никогда не может быть времени, когда все считыватели выпускают файл, поэтому возможно, что Writer будет ждать бесконечно, не получая эксклюзивную блокировку файла.

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

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

Спасибо за любые предложения.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …