Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ошибка записи файла
 
 автор: Николай2357   (30.08.2008 в 23:08)   письмо автору
 
 

Здравствуйте.
Сталкнулся с проблемой, не знаю, как быть. Вот код:
<? 
$chat 
fopen("./dat/chat.dat","w+")
    or die (
"Сбой программы.");
 
flock ($chat,LOCK_EX);
 
fputs($chat$text);
 
flock ($chat,LOCK_UN);
 
fclose($chat);               
 @
chmod($chat0777);

ничего необычного, и все работает. Только недолго. В определенный момент страница, которая запускает этот скрипт начинает показывать
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request
пока не презапишешь файл chat.dat Проблема скорее всего в совместном доступе, так как это происходит в чате. Пробовал эксперементировать с правами, результат один. Пробовал LOCK_SH, совсем перестает работать. Подскажите, где искать дырку? Логи пустые.
Спасибо.

  Ответить  
 
 автор: xx77   (30.08.2008 в 23:33)   письмо автору
 
   для: Николай2357   (30.08.2008 в 23:08)
 

> @chmod($chat, 0777);
chmod() принимает путь к файлу в качестве параметра, и не принимает дескриптор файла, который ещё и уже закрыт.
просто для перезаписи достаточно режима открытия файла "w" вместо "w+"

каким образом вызывается из другого файла этот файл?
находятся-ли оба эти файла в одной дирректории?

  Ответить  
 
 автор: Николай2357   (30.08.2008 в 23:43)   письмо автору
 
   для: xx77   (30.08.2008 в 23:33)
 

>каким образом вызывается из другого файла этот файл?
находятся-ли оба эти файла в одной дирректории?
не совсем понял, кто что вызывает... Есть PHP скрипт, который выполняет эту операцию. находится он в корневой дерриктории, записываемый файл в поддерриктории. Это неправильно?
может нужно убрать этот кмод от греха подальше?

  Ответить  
 
 автор: Valick   (30.08.2008 в 23:44)   письмо автору
 
   для: Николай2357   (30.08.2008 в 23:08)
 

Посмотрите тут
Обратите внимание на
// ни в коем случае не используем w или w+

и на блокировку для записи и для чтения.. они различны.

  Ответить  
 
 автор: Николай2357   (30.08.2008 в 23:50)   письмо автору
 
   для: Valick   (30.08.2008 в 23:44)
 

Ух ты! Так подробно! Я в поиске почему то не нашел...
Огромное спасибо, пойду пробовать.

  Ответить  
 
 автор: Valick   (31.08.2008 в 00:01)   письмо автору
 
   для: Николай2357   (30.08.2008 в 23:50)
 

За подробность не меня а Д.Котерова благодарите, половину кода я из его книги срисовывал.

  Ответить  
 
 автор: xx77   (31.08.2008 в 00:28)   письмо автору
 
   для: Николай2357   (30.08.2008 в 23:50)
 

> страница, которая запускает этот скрипт

было мной непонято.


>может нужно убрать этот кмод от греха подальше?
я-бы убрал-бы, иногда только применяю сразу после создания файла


> // Создаём файл если он не существует
> // ни в коем случае не используем w или w+
в оном скрипте понятно почему не "w(+?)" там файл читается

а в данном случае применить "w" мне кажется вполне логичным. с момента открытия до момента закрытия файл только перезаписывается

  Ответить  
 
 автор: Valick   (31.08.2008 в 00:37)   письмо автору
 
   для: xx77   (31.08.2008 в 00:28)
 

С момента открытия до момента блокировки может много чего произойти....
Вам расписать подробнее или поверите, что юзать w в данном случае нельзя (тем более, что это чат)

  Ответить  
 
 автор: Николай2357   (31.08.2008 в 00:49)   письмо автору
 
   для: Valick   (31.08.2008 в 00:37)
 

Не ссорьтесь, отлично работает, просто супер. Только я, обжегшись на молоке, буду дуть на воду. а+ тоже штука нехорошая?
Спасибо еще раз!

  Ответить  
 
 автор: Valick   (31.08.2008 в 00:54)   письмо автору
 
   для: Николай2357   (31.08.2008 в 00:49)
 

а+ тоже штука нехорошая?
При правильном использовании все штуки хорошие)))
И мы не ссоримся, а дискутируем)

  Ответить  
 
 автор: Николай2357   (31.08.2008 в 00:59)   письмо автору
 
   для: Valick   (31.08.2008 в 00:54)
 

>И мы не ссоримся, а дискутируем)
Я пошутил, но в случае, когда мне нужно не перезаписать файл, a добавить запись...
Суть совместного доступа не меняется, как тут быть?

  Ответить  
 
 автор: xx77   (31.08.2008 в 01:05)   письмо автору
 
   для: Valick   (31.08.2008 в 00:54)
 

похоже что-то есть нехорошее с этим "w"

>Замечание: Из-за того, что функции flock() необходим указатель на файл, вам может понадобиться воспользоваться специальным запирающим файлом для того, чтобы ограничить доступ к файлу, который вы намерены очищать путём открытыя его в режиме записи (используя "w" или "w+" в качестве аргумента функции fopen()).

из описания функции flock()

  Ответить  
 
 автор: Николай2357   (31.08.2008 в 01:08)   письмо автору
 
   для: xx77   (31.08.2008 в 01:05)
 


<?
fseek
($f,0,SEEK_SET);    // переводим указатель в начало файла 

подскажите, а как в конец файла, не могу найти. Или он туда поумолчанию встает, когда "r+t"?

  Ответить  
 
 автор: Николай2357   (31.08.2008 в 01:14)   письмо автору
 
   для: Николай2357   (31.08.2008 в 01:08)
 

<?
fseek
($f,0,SEEK_END);  

нашел. Всех еще раз благодарю.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования