|
|
|
|
|
для: goodwill
(24.10.2004 в 21:36)
| | Ну хорошо, я бы модифицировал скрипт записи следующим образом:
<?php
function work_with_file($file, $string, $open)
{
// Открываем файл
if($open_file=@fopen($file, $open))
{
// В течении 10 секунд пытаемся получить
// эксклюзивный доступ к файлу
for($i = 0; $i<10; ++$i)
{
// Как только доступ получен покидаем цикл
if(flock($open_file, LOCK_EX)) break();
// Задерживаем время выполнения программы на 1 секунду
// Если доступ получить не удалось
else sleep(1);
}
// Записываем строку в файл
fwrite($open_file, $string);
// Очищаем буфер записи
flush($open_file);
// Переводим файл из лочённого состояния
// в обычное
flock($open_file, LOCK_UN);
// Закрываем файл
fclose($open_file);
// Покидаем функцию
return true;
}
else
{
error("Нет доступа к файлу или он не существует!", $file);
return false;
}
}
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(24.10.2004 в 21:32)
| | хотелось подробней | |
|
|
|
|
|
|
|
для: goodwill
(24.10.2004 в 21:08)
| | Здесь приведён скрипт не полностью, а лишь способы обработки лочения - если функция flock() при эксклюзивном доступе к файлу не может получить доступ (в него пишет другой поток) возвращается false, при этом сам скрипт выполняется дальше - так теряются данные. Двумя постами выше фрагменты, которые следует вставить в исходный скрипт записи. | |
|
|
|
|
|
|
|
для: cheops
(24.10.2004 в 18:05)
| | даже открытия файла нет! Как же ты будешь записывать, по какому указателю??? | |
|
|
|
|
|
|
|
для: goodwill
(24.10.2004 в 17:28)
| | Хм... а симптомы какие, и как выражается падение топиков? Дело в том, что лочение файлов эксклюзивное и пока один поток пишет, другой не получит доступа и просто пройдёт мимо. Попробуйте проверять успешность лочения
<?php
if(flock($open_file, LOCK_EX))
{
fwrite($open_file, $string);
flush($open_file);
flock($open_file, LOCK_UN);
}
else
{
echo "Ваш топик пропал, так как кто-то другой занял файл форума";
exit();
}
?>
|
Можно так же рискнуть осуществлять попытки залочить файл в цикле:
<?php
for($i = 0; $i<10; ++$i)
{
if(flock($open_file, LOCK_EX)) break();
// Задерживаем время выполнения программы на 1 секунду
else sleep(1);
}
?>
|
| |
|
|
|
|
|
|
| Форум на PHP без MySQL
падают топики что-то с flock
Код:
function work_with_file($file, $string, $open){
if($open_file=@fopen($file, $open)){
flock($open_file, LOCK_EX);
fwrite($open_file, $string);
flush($open_file);
flock($open_file, LOCK_UN);
fclose($open_file);
return true;
}else{
error("Нет доступа к файлу или он не существует!", $file);
return false;
}
}
это функция, и этот параметр передается через переменную $open | |
|
|
|
|