|
|
|
| Здравствуйте.
Сталкнулся с проблемой, не знаю, как быть. Вот код:
<?
$chat = fopen("./dat/chat.dat","w+")
or die ("Сбой программы.");
flock ($chat,LOCK_EX);
fputs($chat, $text);
flock ($chat,LOCK_UN);
fclose($chat);
@chmod($chat, 0777);
|
ничего необычного, и все работает. Только недолго. В определенный момент страница, которая запускает этот скрипт начинает показывать
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request
| пока не презапишешь файл chat.dat Проблема скорее всего в совместном доступе, так как это происходит в чате. Пробовал эксперементировать с правами, результат один. Пробовал LOCK_SH, совсем перестает работать. Подскажите, где искать дырку? Логи пустые.
Спасибо. | |
|
|
|
|
|
|
|
для: Николай2357
(30.08.2008 в 23:08)
| | > @chmod($chat, 0777);
chmod() принимает путь к файлу в качестве параметра, и не принимает дескриптор файла, который ещё и уже закрыт.
просто для перезаписи достаточно режима открытия файла "w" вместо "w+"
каким образом вызывается из другого файла этот файл?
находятся-ли оба эти файла в одной дирректории? | |
|
|
|
|
|
|
|
для: xx77
(30.08.2008 в 23:33)
| | >каким образом вызывается из другого файла этот файл?
находятся-ли оба эти файла в одной дирректории?
не совсем понял, кто что вызывает... Есть PHP скрипт, который выполняет эту операцию. находится он в корневой дерриктории, записываемый файл в поддерриктории. Это неправильно?
может нужно убрать этот кмод от греха подальше? | |
|
|
|
|
|
|
|
для: Николай2357
(30.08.2008 в 23:08)
| | Посмотрите тут
Обратите внимание на
// ни в коем случае не используем w или w+
|
и на блокировку для записи и для чтения.. они различны. | |
|
|
|
|
|
|
|
для: Valick
(30.08.2008 в 23:44)
| | Ух ты! Так подробно! Я в поиске почему то не нашел...
Огромное спасибо, пойду пробовать. | |
|
|
|
|
|
|
|
для: Николай2357
(30.08.2008 в 23:50)
| | За подробность не меня а Д.Котерова благодарите, половину кода я из его книги срисовывал. | |
|
|
|
|
|
|
|
для: Николай2357
(30.08.2008 в 23:50)
| | > страница, которая запускает этот скрипт
было мной непонято.
>может нужно убрать этот кмод от греха подальше?
я-бы убрал-бы, иногда только применяю сразу после создания файла
> // Создаём файл если он не существует
> // ни в коем случае не используем w или w+
в оном скрипте понятно почему не "w(+?)" там файл читается
а в данном случае применить "w" мне кажется вполне логичным. с момента открытия до момента закрытия файл только перезаписывается | |
|
|
|
|
|
|
|
для: xx77
(31.08.2008 в 00:28)
| | С момента открытия до момента блокировки может много чего произойти....
Вам расписать подробнее или поверите, что юзать w в данном случае нельзя (тем более, что это чат) | |
|
|
|
|
|
|
|
для: Valick
(31.08.2008 в 00:37)
| | Не ссорьтесь, отлично работает, просто супер. Только я, обжегшись на молоке, буду дуть на воду. а+ тоже штука нехорошая?
Спасибо еще раз! | |
|
|
|
|
|
|
|
для: Николай2357
(31.08.2008 в 00:49)
| | а+ тоже штука нехорошая?
При правильном использовании все штуки хорошие)))
И мы не ссоримся, а дискутируем) | |
|
|
|
|
|
|
|
для: Valick
(31.08.2008 в 00:54)
| | >И мы не ссоримся, а дискутируем)
Я пошутил, но в случае, когда мне нужно не перезаписать файл, a добавить запись...
Суть совместного доступа не меняется, как тут быть? | |
|
|
|
|
|
|
|
для: Valick
(31.08.2008 в 00:54)
| | похоже что-то есть нехорошее с этим "w"
>Замечание: Из-за того, что функции flock() необходим указатель на файл, вам может понадобиться воспользоваться специальным запирающим файлом для того, чтобы ограничить доступ к файлу, который вы намерены очищать путём открытыя его в режиме записи (используя "w" или "w+" в качестве аргумента функции fopen()).
из описания функции flock() | |
|
|
|
|
|
|
|
для: xx77
(31.08.2008 в 01:05)
| |
<?
fseek($f,0,SEEK_SET); // переводим указатель в начало файла
|
подскажите, а как в конец файла, не могу найти. Или он туда поумолчанию встает, когда "r+t"? | |
|
|
|
|
|
|
|
для: Николай2357
(31.08.2008 в 01:08)
| |
нашел. Всех еще раз благодарю. | |
|
|
|