Да, LOCK_EX
Поддержка была добавлена в file_put_contents
в PHP 5.1, которая будет ждать, пока какая-либо другая блокировка файла не будет выпущена до ее написания. Вы можете легко проверить это самостоятельно.
lock.php
#!/usr/bin/env php
<?php
$h = fopen(__DIR__ . DIRECTORY_SEPARATOR . "lock.txt", "c");
register_shutdown_function(function() use ($h) {
fclose($h);
});
flock($h, LOCK_EX);
while (true);
put.php
#!/usr/bin/env php
<?php
$f = __DIR__ . DIRECTORY_SEPARATOR . "lock.txt";
file_put_contents($f, "foo", LOCK_EX);
echo file_get_contents($f) , PHP_EOL;
Тест
Поместите оба скрипта в том же каталоге и открытых двух оболочек. Выполните команду lock.php
в оболочке и держите ее открытой, запустите put.php
в оболочке два, и вы увидите, что она ждет, потому что для этого скрипта была создана уникальная блокировка записи. Теперь вернитесь к shell one и нажмите Ctrl + c, чтобы прервать выполнение (вы можете закрыть оболочку) и вернуться к своей второй оболочке. Он должен вывести foo
, и скрипт должен завершиться.
Важно
Чтение файла не заблокирован для этого файла, если это использование требование flock
, поскольку он поддерживает все операции (LOCK_SH | LOCK_EX
).
SQLite
PDO SQLite даст вам возможность работать с простыми текстовыми файлами в качестве базы данных и заботиться о проблемах, как замок для вас. Если вам нужно работать с большим количеством файлов, и данные рассматривают его использование, поскольку оно содержит все, что вам нужно из коробки.
Из любопытства почему бы не использовать базу данных? На ваш вопрос я думаю, что эта функция может помочь вам 'filectime()' – Daan
То, что вы хотите, безусловно, возможно, но серьезно использовать базу данных. – PeeHaa
вы можете использовать 'flock' для блокировки файла. – vaso123