Я делаю простой счетчик загрузки страницы, сохраняя текущий счет в файле. Вот как я хочу это сделать:
Можно ли это сделать, не потеряв замок?
Насколько я понимаю, файл не может быть записан без потери блокировки. Единственный способ, с помощью которого я столкнулся, – написать символ, используя режим «r +», а затем подсчитать символы.
Как сказано, вы можете использовать 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
его, прочитайте данные, напишите данные, затем закройте (закрыть автоматически разблокируется).
Да, вы должны использовать перемотку перед ftruncate
. В противном случае старое содержимое файла заполняется только нулями.
Рабочая последовательность:
fopen flock LOCK_EX fread filesize rewind ftruncate 0 fwrite flock LOCK_UN fclose