У меня есть приложение 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);
?>
flock возвращает true в случае успеха или false в случае неудачи.
while(!flock($f, LOCK_EX)) {
sleep(5);
}
Это не решит проблему тайм-аута вашего скрипта, если другой процесс заблокировал его на долгое время. В этом случае вы можете закрыть файл и попробовать открыть другое имя файла.
Других решений пока нет …