Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Проблемка с fopen()

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Arch-Web
Отправлено: 27 Июля, 2010 - 16:36:10
Post Id



Частый гость


Покинул форум
Сообщений всего: 177
Дата рег-ции: Июль 2010  
Откуда: Ukraine::Kiev


Помог: 1 раз(а)




Есть такой код
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4. //Игнорировать обрыв связи с браузером
  5. //Время работы скрипта неограничено
  6. //Пауза между действиями, в секундах
  7. $interval=60;
  8. do{
  9.                 $handler = @fopen("forum.txt", "w");
  10.  
  11.                 if($handler){
  12.                         $getForum = fopen("http://localhost/forum_html/forum_html.php", "r");
  13.                         if($getForum){
  14.                                 while (!feof($getForum)) {
  15.                                         $buffer .= fgets($getForum, 4096);
  16.                                 }
  17.  
  18.                                 fwrite($handler,$buffer);
  19.                                 @fclose($getForum);
  20.                         }
  21.                         @fclose($handler);
  22.  
  23.                 }
  24.         //Остановка скрипта, работающего в фоновом режиме
  25.         if (file_exists("stop.txt")) break;
  26.         //Пауза
  27.         sleep($interval);
  28. }while(true);
  29. ?>


при каждом обновлении старницы все что в http://localhost/forum_html/forum_html.php дописует в файл forum.txt а должен удалить все с файла и записать сново.
(Добавление)
up

(Отредактировано автором: 27 Июля, 2010 - 17:02:28)

 
 Top
Реф
Отправлено: 27 Июля, 2010 - 20:14:41
Post Id



Частый гость


Покинул форум
Сообщений всего: 159
Дата рег-ции: Июль 2010  
Откуда: Реутов, Россия


Помог: 0 раз(а)




Странная штука. Вроде в режиме "w" файл очищаться должен. В бинарном пробовал?


-----
Думать надо головой, а не головкой!
 
 Top
Arch-Web
Отправлено: 27 Июля, 2010 - 20:36:20
Post Id



Частый гость


Покинул форум
Сообщений всего: 177
Дата рег-ции: Июль 2010  
Откуда: Ukraine::Kiev


Помог: 1 раз(а)




Реф нет ,а как в бинарном сделать ?
 
 Top
Реф
Отправлено: 27 Июля, 2010 - 21:14:08
Post Id



Частый гость


Покинул форум
Сообщений всего: 159
Дата рег-ции: Июль 2010  
Откуда: Реутов, Россия


Помог: 0 раз(а)




Режим "wb" при открытии файла.
Кстати в описании функции fwrite() нашёл следующее замечание:
Цитата:
В системах, различающих двоичные и текстовые файлы (к примеру, Windows), файл должен быть открыт используя флаг 'b' в конце аргумента mode функции fopen().


-----
Думать надо головой, а не головкой!
 
 Top
Реф
Отправлено: 30 Июля, 2010 - 01:35:15
Post Id



Частый гость


Покинул форум
Сообщений всего: 159
Дата рег-ции: Июль 2010  
Откуда: Реутов, Россия


Помог: 0 раз(а)




Arch-Web пишет:
$handler = @fopen("forum.txt", "w");

Не поясните зачем здесь операцию подавления ошибки использовали?


-----
Думать надо головой, а не головкой!
 
 Top
JustUserR
Отправлено: 30 Июля, 2010 - 12:39:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Arch-Web пишет:
$buffer .= fgets($getForum, 4096)
В своем PHP-скрипте вы используете возможность PHP по автоматическому приведению значения неинициализированной переменной - при первой итерации переменная $buffer не существует и приводится к пустой строке в результате чего с каждой последующей конкатенацией она начинает равномерно заполняться - но при последующих итерациях данная переменная уже не является пустой и новые данные дописываются к уже существующим В качестве решения можно до начала или в конце итерации явно установить переменную $buffer в пустую строку - в таком случае конкатенация будет выполняться только внутрни одной итерации Кстати если бы вы использовали высокий уровень вывода ошибок то увидили бы соответствующее предупреждение - по которому можно было бы понять что с вашим PHP-скриптом не так К тому же не рекоммендуется использовать url-fopen-оболочки для доступа к удаленным web-ресурсам - правильнее использовать функции CURL/fsockopen


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Реф
Отправлено: 01 Августа, 2010 - 05:46:03
Post Id



Частый гость


Покинул форум
Сообщений всего: 159
Дата рег-ции: Июль 2010  
Откуда: Реутов, Россия


Помог: 0 раз(а)




JustUserR
Но ведь режим "w" функции fopen() чистит файл (в идеале), да и присвоения содержимого файла переменной $buffer я не увидел. А всё накопление происходит с указателя $getForum, который опять же с тем что лежало в файле "forum.txt" никак не связан.


-----
Думать надо головой, а не головкой!
 
 Top
Champion Супермодератор
Отправлено: 01 Августа, 2010 - 09:19:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Реф пишет:
в описании функции fwrite() нашёл следующее замечание:
Эти режимы различаются тем, во что превращается символ конца строки. В текстовом режиме в считанной строке все переводы строки преобразуются в \n в любой ОС. А в бинарном всё остается без изменений, т.е. в Виндоусе \r\n. Поэтому в Юниксах нет разницы между этими режимами.

А по коду - так задумано, что значение $buffer не сбрасывается в начале каждой внешней итерации? Глянь само значение этой переменной на каждом повторе. JustUserR правильно сказал - ты считал один раз страницу в $buffer, записал. Считал страницу еще раз в $buffer - там она уже 2 раза. И записал это...
 
 Top
JustUserR
Отправлено: 01 Августа, 2010 - 13:29:41
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Реф В данном случае решение проблемы очевидно и заключается в очистки буферной переменной в начале или конце итерации - для того чтобы в нее происходило накопление данных только одного файла а не всех последовательно Другое дело что причиной такой ошибки является лояльность интерпретатора PHP - он позволяет использовать неинициилированную переменную и трактует ее значение в контексте конкатенации как пустую строку и даже не выводит никакого предупреждения В другом языке в котором локальные переменные имеют область видимости в каждом функциональном блоке - вы увидили бы ошибку о том что переменная $buffer попросту не объявлена в заданном контексте
К счастью в Perl для решения аналогичных проблем предусмотрена целая pragma с названием use strict которая заставляет фиксировать для переменных области видимости - но в PHP видимо такой возможности нет


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB