Intereting Posts
Доступ к переменным из родительской области в анонимной функции PHP Настройка php-меню для настроек языка Разрешить PHP выполнять скрипт bash с правами root Массовый импорт Laravel-Excel Что лучше требовать (dirname (__ FILE __). '/'. 'MyParent.php'), чем просто требовать ('myParent.php')? Существует ли стандартный скелет или инструкции для создания пакета Symfony2 с открытым исходным кодом в комплекте с travis-ci и композитором? Как получить BMP-изображение из двоичных данных blob с помощью php PDO Prepared Вставляет несколько строк в один запрос Проблема с глобальными переменными Как преобразовать несколько многобайтовых символов в его числовой объект html с помощью PHP? PHP и MySQL: mysqli_num_rows () ожидает, что параметр 1 будет mysqli_result, boolean given Когда следует использовать транзакции MySQL? Sublime Text 3 – PHP Build System UPDATE / DELETE в mysql и получить список уязвимых идентификаторов строк? Проверьте, находится ли Google Map Point в полигоне с PHP

Чтение и запись в файл при сохранении блокировки

Я делаю простой счетчик загрузки страницы, сохраняя текущий счет в файле. Вот как я хочу это сделать:

  1. Заблокировать файл (стадо)
  2. Чтение текущего счета (fread)
  3. Увеличить его (++)
  4. Напишите новый счетчик (fwrite)
  5. Разблокировать файл / закрыть его (flock / fclose)

Можно ли это сделать, не потеряв замок?

Насколько я понимаю, файл не может быть записан без потери блокировки. Единственный способ, с помощью которого я столкнулся, – написать символ, используя режим «r +», а затем подсчитать символы.

Solutions Collecting From Web of "Чтение и запись в файл при сохранении блокировки"

Как сказано, вы можете использовать FLock. Простой пример:

//Open the File Stream $handle = fopen("file.txt","r+"); //Lock File, error if unable to lock if(flock($handle, LOCK_EX)) { $count = fread($handle, filesize("file.txt")); //Get Current Hit Count $count = $count + 1; //Increment Hit Count by 1 ftruncate($handle, 0); //Truncate the file to 0 rewind($handle); //Set write pointer to beginning of file fwrite($handle, $count); //Write the new Hit Count flock($handle, LOCK_UN); //Unlock File } else { echo "Could not Lock File!"; } //Close Stream fclose($handle); 

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

http://php.net/flock

Да, вы должны использовать перемотку перед ftruncate . В противном случае старое содержимое файла заполняется только нулями.

Рабочая последовательность:

  fopen flock LOCK_EX fread filesize rewind ftruncate 0 fwrite flock LOCK_UN fclose