|
|
|
| Хочеся иметь типовой код, который бы записывал числовую и текстовую информацию в файлы, причем делал бы это таким образом, что информация не искажалась бы даже тогда, когда к скрипту одновременно обращается несколько посетителей. То есть, с использованием эксклюзивной блокировки текстового файла.
Компиллиуя из того, что представлено на Форуме, я сделал вот такой код:
$adr = "vopros.txt" ;
if(!file_exists($adr)) fclose(fopen($adr, "a+t")); // Создаём файл если он не существует
$f=fopen($adr, "r+t") ; // Открываем файл для чтения и записи в режиме r+t
flock($f, LOCK_EX); // Блокируем файл эксклюзивно
// Файл заблокирован, можно читать и записывать
$filesize = (filesize ($adr) +10);
echo $filesize ;
$text = fread($f, $filesize); // Чтение содержимого файла
$text .= "-xxххх"; // Операция с текстом (или с числом)
// Сохраняем информацию
ftruncate($f,0); // очищаем файл
rewind ($f); // переводим указатель в начало файла
fwrite($f,$text); // записываем новое значение
fclose($f); // закрываем файл
flock($f, LOCK_UN); // отпираем файл
|
В той связи два вопроса к гуру:
1. Правильно ли здесь сделана блкировка файла? Обеспечивается ли достоверность информации?
2. Что не так в последней строке? При ее работе возникает вот такое диагностическое сообщение: "Warning: flock(): 5 is not a valid stream resource...". | |
|
|
|
|
|
|
|
для: Владимир55
(06.11.2008 в 15:07)
| | Вы освободили ресурс (закрыли файл), а потом пытаетесь изменить доступ к нему, поэтому и ошибка. | |
|
|
|
|
|
|
|
для: sim5
(06.11.2008 в 15:10)
| | То есть, после выполнения fclose($f) блокировка доступа к текстовому файлу снимается автоматически и оператор flock($f, LOCK_UN) является лишним? | |
|
|
|
|
|
|
|
для: Владимир55
(06.11.2008 в 15:14)
| | Надо так:
flock($f, LOCK_UN); // отпираем файл
fclose($f); // закрываем файл | |
|
|
|
|
|
|
|
для: sim5
(06.11.2008 в 15:32)
| | Вот оно как сложно!
Спасибо! | |
|
|
|
|
|
|
|
для: Владимир55
(06.11.2008 в 15:58)
| | Опоздал... зря отписывался в прошлой теме, Вы и сами уже все поняли )))) | |
|
|
|