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 :: Вывод файла начиная с последней строки

 PHP.SU

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


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

> Без описания
Clover7
Отправлено: 15 Июня, 2017 - 12:13:16
Post Id


Новичок


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


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




Здравствуйте, подскажите пожалуйста как вывести файл начиная с последней строки то есть в обратном порядке, что нужно добавить в этот код:
PHP:
скопировать код в буфер обмена
  1. if (file_exists("state.dat")) {
  2.     @chmod("state.dat", 0600);
  3.     $logg = "";
  4.     if ($fp = fopen("state.dat", "r")) {
  5.         while (!feof($fp)) {
  6.             $logg .= fgets($fp);
  7.             $logg .= "<br>";
  8.         }
  9.         fclose($fp);
  10.     }
  11.     $smarty->assign('logs', $logg);
  12. }
  13.  
 
 Top
Vladimir Kheifets
Отправлено: 15 Июня, 2017 - 14:09:00
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


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




Здравствуйте! Попробуйте так:
PHP:
скопировать код в буфер обмена
  1. $buf=array();
  2. if ($fp = fopen("state.dat", "r"))
  3.         {
  4.         while (!feof($fp)) {
  5.             $buf[] = fgets($fp);          
  6.         }
  7.         fclose($fp);
  8. }    
  9. $logg = "";
  10. foreach (array_reverse($buf) as $v) $logg .= $v."<br>";
 
 Top
Clover7
Отправлено: 15 Июня, 2017 - 15:34:18
Post Id


Новичок


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


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




Спасибо, но не работает страница не открывается.
 
 Top
Строитель Модератор
Отправлено: 15 Июня, 2017 - 17:18:37
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


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




Clover7, а вам принципиально использовать построчное чтение файла? Или можно считать файл целиком? Файл не большой?
 
 Top
Clover7
Отправлено: 15 Июня, 2017 - 18:37:05
Post Id


Новичок


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


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




В файле записан лог посещения сайта, один пользователь- одна строка, поэтому обязательно, размер файла небольшой до 200кб, видите мне нужно вывести это посредством smarty, который тоже наверное накладывает свои правила на синтаксис.

Мне нужно вывести файл на экран, начиная с последней строки, то есть в обратном порядке, а как он будет считываться по большому счету не важно.

(Отредактировано автором: 15 Июня, 2017 - 18:41:26)

 
 Top
Строитель Модератор
Отправлено: 15 Июня, 2017 - 18:39:47
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


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




Clover7, ок - позже зайду с ПК, напишу пример на пхп.
 
 Top
Vladimir Kheifets
Отправлено: 15 Июня, 2017 - 19:39:17
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 879
Дата рег-ции: Март 2017  
Откуда: Германия, Бавария


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




Clover7 пишет:
Спасибо, но не работает страница не открывается.

Нужно прежде всего понять прочитались ли данные в массив $buf
и что получилось после array_reverse($buf).
Для этого нужно распечатать $buf и переменную $v:
PHP:
скопировать код в буфер обмена
  1. $buf=array();
  2.     if ($fp = fopen("state.dat", "r"))
  3.             {
  4.             while (!feof($fp)) {
  5.                 $buf[] = fgets($fp);          
  6.             }
  7.             fclose($fp);
  8.     }
  9.    print_r($buf) ;
  10.    print "<hr>";  
  11.     $logg = "";
  12.     foreach (array_reverse($buf) as $v)
  13.     {        
  14.         print  $v."<br>";
  15.         $logg .= $v."<br>";
  16.     }
 
 Top
Clover7
Отправлено: 15 Июня, 2017 - 20:50:41
Post Id


Новичок


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


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




Vladimir Kheifets Прошу прощения видимо я был невнимателен, первый вариант который вы дали, все таки работает и выводит список начиная с последних посетителей сайта, то есть начиная с последней строки файла , скажите такая операция не будет постепенно загружать память сервера (ограничение на файл в 500 строк) и можно ли как нибудь в этом скрипте запретить доступ к файлу из браузера ? Я оставил вот такой вариант:

PHP:
скопировать код в буфер обмена
  1. if (file_exists("state.dat")) {
  2. @chmod("state.dat", 0600); }
  3.    $buf=array();
  4. if ($fp = fopen("state.dat", "r"))
  5.         {
  6.         while (!feof($fp)) {
  7.             $buf[] = fgets($fp);          
  8.         }
  9.         fclose($fp);
  10. }    
  11. $logg = "";
  12. foreach (array_reverse($buf) as $v) $logg .= $v."<br>";
  13.        
  14.  
  15. $smarty->assign('logs', $logg);

(Отредактировано автором: 15 Июня, 2017 - 22:18:21)

 
 Top
Строитель Модератор
Отправлено: 16 Июня, 2017 - 00:28:40
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


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




Clover7 пишет:
скажите такая операция не будет постепенно загружать память сервера
Будет, т.к. файл читается и целиком сохраняется в массив. В итоге, в памяти вы получите массив, идентичный вашему файлу.

Попробуйте этот вариант (нашёл в гугле):
Спойлер (Отобразить)
PS: Вроде бы не рекомендуется использовать чтение "задом наперёд".
 
 Top
Clover7
Отправлено: 16 Июня, 2017 - 02:27:35
Post Id


Новичок


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


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




Строитель большое спасибо, это тоже работает но с небольшим изменением, я не могу использовать никакие echo в коде, так как это выводит данные вверху экрана, а не на странице шаблона (smarty), вот так работает:
Спойлер (Отобразить)


Что значит число 256, это максимальное количество строк или что-то другое ? Тут огромное количество кода по сравнению с прошлым вариантом, что делает этот скрипт, я так понимаю он уже не считывает файл целиком в память, а ищет последнюю строку и что дальше ?
То что вы написали в P.S , это касается первого варианта или и второго тоже, ну и интересно узнать почему не рекомендуется, посоветуйте пожалуйста какой вариант мне в итоге лучше использовать ?

(Отредактировано автором: 16 Июня, 2017 - 02:43:31)

 
 Top
Строитель Модератор
Отправлено: 16 Июня, 2017 - 08:50:28
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


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




Clover7 пишет:
Что значит число 256
Если не ошибаюсь, это количество байт, которые будут прочитаны за одну итерацию.
Clover7 пишет:
что делает этот скрипт
Читает файл построчно в обратном порядке, т.е., начиная с последней строки, и заканчивая первой.
Clover7 пишет:
То что вы написали в P.S , это касается первого варианта или и второго тоже, ну и интересно узнать почему не рекомендуется, посоветуйте пожалуйста какой вариант мне в итоге лучше использовать ?
Это касается второго варианта, где чтение файла идёт в цикле с конца. Почему? - честно говоря, я не вникал, там что-то связано со внутренней буферизацией. Ну а что использовать лучше? - лучше продумать алгоритм, при котором вам не понадобится чтение в обратном порядке.
 
 Top
Clover7
Отправлено: 16 Июня, 2017 - 10:47:28
Post Id


Новичок


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


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




То есть в моем случае лучше считывать файл в массив как предложил Vladimir Kheifets, скажите в этом случае файл пишется в память один раз, а потом перезаписывается, так как изменяется содержимое я правильно понимаю то есть в памяти находится всего один файл state или нет ?

А где вы нашли второй вариант, можно ссылку на него ?

(Отредактировано автором: 16 Июня, 2017 - 10:52:38)

 
 Top
Строитель Модератор
Отправлено: 16 Июня, 2017 - 16:23:15
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


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




Clover7 в массив читать большой файл не вариант, т.к однажды если файл вырастет в объеме, то не хватит памяти. Ссылку позже скину, когда буду за ПК.
 
 Top
Clover7
Отправлено: 16 Июня, 2017 - 18:32:25
Post Id


Новичок


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


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




Строитель, спасибо, мой файл статистики будет записывать только последние 200 посещений сайта и его обьем не будет превышать 100кб. Скажите а как то можно сделать что-бы файл при открытии страницы загружался в массив выводился на экран и автоматически после показа, удалялся из памяти ?
 
 Top
Строитель Модератор
Отправлено: 16 Июня, 2017 - 18:44:49
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


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




Clover7 пишет:
Строитель, спасибо, мой файл статистики будет записывать только последние 200 посещений сайта и его обьем не будет превышать 100кб. Скажите а как то можно сделать что-бы файл при открытии страницы загружался в массив выводился на экран и автоматически после показа, удалялся из памяти ?
По окончании работы скрипта переменные из памяти удаляются автоматически.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB