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

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

1. Clover7 - 15 Июня, 2017 - 12:13:16 - перейти к сообщению
Здравствуйте, подскажите пожалуйста как вывести файл начиная с последней строки то есть в обратном порядке, что нужно добавить в этот код:
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.  
2. Vladimir Kheifets - 15 Июня, 2017 - 14:09:00 - перейти к сообщению
Здравствуйте! Попробуйте так:
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>";
3. Clover7 - 15 Июня, 2017 - 15:34:18 - перейти к сообщению
Спасибо, но не работает страница не открывается.
4. Строитель - 15 Июня, 2017 - 17:18:37 - перейти к сообщению
Clover7, а вам принципиально использовать построчное чтение файла? Или можно считать файл целиком? Файл не большой?
5. Clover7 - 15 Июня, 2017 - 18:37:05 - перейти к сообщению
В файле записан лог посещения сайта, один пользователь- одна строка, поэтому обязательно, размер файла небольшой до 200кб, видите мне нужно вывести это посредством smarty, который тоже наверное накладывает свои правила на синтаксис.

Мне нужно вывести файл на экран, начиная с последней строки, то есть в обратном порядке, а как он будет считываться по большому счету не важно.
6. Строитель - 15 Июня, 2017 - 18:39:47 - перейти к сообщению
Clover7, ок - позже зайду с ПК, напишу пример на пхп.
7. Vladimir Kheifets - 15 Июня, 2017 - 19:39:17 - перейти к сообщению
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.     }
8. Clover7 - 15 Июня, 2017 - 20:50:41 - перейти к сообщению
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);
9. Строитель - 16 Июня, 2017 - 00:28:40 - перейти к сообщению
Clover7 пишет:
скажите такая операция не будет постепенно загружать память сервера
Будет, т.к. файл читается и целиком сохраняется в массив. В итоге, в памяти вы получите массив, идентичный вашему файлу.

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


Что значит число 256, это максимальное количество строк или что-то другое ? Тут огромное количество кода по сравнению с прошлым вариантом, что делает этот скрипт, я так понимаю он уже не считывает файл целиком в память, а ищет последнюю строку и что дальше ?
То что вы написали в P.S , это касается первого варианта или и второго тоже, ну и интересно узнать почему не рекомендуется, посоветуйте пожалуйста какой вариант мне в итоге лучше использовать ?
11. Строитель - 16 Июня, 2017 - 08:50:28 - перейти к сообщению
Clover7 пишет:
Что значит число 256
Если не ошибаюсь, это количество байт, которые будут прочитаны за одну итерацию.
Clover7 пишет:
что делает этот скрипт
Читает файл построчно в обратном порядке, т.е., начиная с последней строки, и заканчивая первой.
Clover7 пишет:
То что вы написали в P.S , это касается первого варианта или и второго тоже, ну и интересно узнать почему не рекомендуется, посоветуйте пожалуйста какой вариант мне в итоге лучше использовать ?
Это касается второго варианта, где чтение файла идёт в цикле с конца. Почему? - честно говоря, я не вникал, там что-то связано со внутренней буферизацией. Ну а что использовать лучше? - лучше продумать алгоритм, при котором вам не понадобится чтение в обратном порядке.
12. Clover7 - 16 Июня, 2017 - 10:47:28 - перейти к сообщению
То есть в моем случае лучше считывать файл в массив как предложил Vladimir Kheifets, скажите в этом случае файл пишется в память один раз, а потом перезаписывается, так как изменяется содержимое я правильно понимаю то есть в памяти находится всего один файл state или нет ?

А где вы нашли второй вариант, можно ссылку на него ?
13. Строитель - 16 Июня, 2017 - 16:23:15 - перейти к сообщению
Clover7 в массив читать большой файл не вариант, т.к однажды если файл вырастет в объеме, то не хватит памяти. Ссылку позже скину, когда буду за ПК.
14. Clover7 - 16 Июня, 2017 - 18:32:25 - перейти к сообщению
Строитель, спасибо, мой файл статистики будет записывать только последние 200 посещений сайта и его обьем не будет превышать 100кб. Скажите а как то можно сделать что-бы файл при открытии страницы загружался в массив выводился на экран и автоматически после показа, удалялся из памяти ?
15. Строитель - 16 Июня, 2017 - 18:44:49 - перейти к сообщению
Clover7 пишет:
Строитель, спасибо, мой файл статистики будет записывать только последние 200 посещений сайта и его обьем не будет превышать 100кб. Скажите а как то можно сделать что-бы файл при открытии страницы загружался в массив выводился на экран и автоматически после показа, удалялся из памяти ?
По окончании работы скрипта переменные из памяти удаляются автоматически.

 

Powered by ExBB FM 1.0 RC1