Как сделать блокировку flock, если другой процесс заблокировал файл?

У меня есть приложение JavaScript, которое отправляет сообщения на сервер. Я должен собрать эти сообщения на стороне сервера и проанализировать их позже, поэтому я просто записываю их в файл. Проблема в том, когда я открываю файл для чтения, т.е. в блокноте сообщения не пишутся. Поскольку flock () блокирует и блокировки должны быть обязательными в Windows, я ожидал, что скрипт просто подождет, пока я закрою файл, а затем сохраню все ожидающие сообщения, но, похоже, это не сработает. Есть ли способ убедиться, что все сообщения будут наконец сохранены в файл, даже если другой процесс получил к нему эксклюзивный доступ? Я не могу потерять ни одно сообщение, даже если кто-то откроет файл для чтения или скопирует его. Могу ли я добиться этого с помощью PHP или, может быть, вместо этого мне лучше отправлять сообщения в базу данных? Версия PHP 7.0.4, мой скрипт выглядит так:

$f = fopen('log.csv', 'a+');
flock($f, LOCK_EX);

$text = date('Y-m-d H:i:s'). ";" .htmlspecialchars($_POST["message"]). PHP_EOL;
clearstatcache();

fwrite($f, $text);
fflush($f);

flock($f, LOCK_UN);
fclose($f);

?>

0

Решение

flock возвращает true в случае успеха или false в случае неудачи.

while(!flock($f, LOCK_EX)) {
sleep(5);
}

Это не решит проблему тайм-аута вашего скрипта, если другой процесс заблокировал его на долгое время. В этом случае вы можете закрыть файл и попробовать открыть другое имя файла.

0

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

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

По вопросам рекламы [email protected]