Аналог tail в PHP

Статус
В этой теме нельзя размещать новые ответы.

Страшный Злодей

Бывший член клуба (достало хамство).
Существует ли в PHP функция аналогичная tail? Или какие ещё есть возможности для чтения больших логов, без использования системных команд?
 

Страшный Злодей

Бывший член клуба (достало хамство).
Благодарю!
Правильно ли я понимаю, что для вывода последней строки, мне придётся проделать следующие операции:
1. открыть файл, с помощью fopen
2. через fseek(), c параметром SEEK_END, установить курсор в конец файла
3. перебрать в обратном порядке каждый символ, пока не встречу символа новой строки
4. считать кусок от найденного символа новой строки до конца файла

Или я что-то недопонял с этой функцией?

Ожидал, наличия более лаконичного решения, чего-нибудь похожего на " tail -n 1 file". Удивительно, если для такой востребованной операции, нет встроенного механизма в самом пхп.
 

AnrDaemon

Продвинутый новичок
А как, вы думаете, работает tail ? Из астрала узнаёт, где начинается последняя строка?…

Удивительно, если для такой востребованной операции, нет встроенного механизма в самом пхп.
За 18 лет ни разу не понадобилась. При этом веб для меня не основное применение PHP, чаще это утилиты для работы с данными. В том числе логами.
 

Фанат

oncle terrible
Команда форума
Правильно ли я понимаю,
я бы читал сразу блок такого размера, который заведомо больше этой строки.
Ну или хотя бы читал блоками большего размера чем 1 символ, чтобы не сикаться постоянно.
Ожидал, наличия более лаконичного решения,
а где тут не лаконичное-то?
три строчки кода
меньше писанины, чем на форуме жаловаться на несовершенство мироздания
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
@Фанат в контексте темы это значения не имеет, но вообще пишут, что с ssd по тестам имеет смысл читать страницы размером 2 или 4 кб, раньше обычно использовали страницы по 8 кб для оптимизации случайного поиска позиции на диске
 

weregod

unserializer
не знаю, как там в других файловых системах, но в FAT16/32 читалось кластерами по несколько секторов, но, как сейчас помню, размером кластера можно было порулить, так что 8кб блок скорее эмпирически выведенная константа
 

Фанат

oncle terrible
Команда форума
Ну с другой стороны все равно даже при чтении одного байта весь кластер попадёт в кэш и там все равно на копейку накладных расходов.
Так что тут скорее всего чисто эстетиеские соображения - сикаться постоянно как-то неаккуратненько :)
 
Последнее редактирование:

Страшный Злодей

Бывший член клуба (достало хамство).
а где тут не лаконичное-то?
три строчки кода
меньше писанины, чем на форуме жаловаться на несовершенство мироздания
Как лаконично я написал выше - " tail -n 1 file".
При должном уровне невминяемости, можно поместить код и в одну строку, от этого он не станет более лаконичным.
вы где-то обнаружили жалобу? 🤔 Собственно, к чему в техническом топике, своими заведомо необоснованными замечаниями, поднимать градус эмоций? Любитель извращенного утонченного троллинга?
 

Страшный Злодей

Бывший член клуба (достало хамство).
не знаю, как там в других файловых системах, но в FAT16/32 читалось кластерами по несколько секторов, но, как сейчас помню, размером кластера можно было порулить, так что 8кб блок скорее эмпирически выведенная константа
Благодарю!
В данном случае, речь не о файловых системах FAT16/32. Насколько себя представляю, в реальных проектах, эти системы в связке с PHP используются не часто, там скорее ASP будет работать.
 

Фанат

oncle terrible
Команда форума
При должном уровне вменяемости три строчки пишутся в одну функцию, которая потом вызывается. Вот тебе и лаконично. Тут реально разговоров уже больше чем кода.
Ожидал, наличия более лаконичного решения,
Функции, реализующие синтаксический сахар, в РНР появляются так: кому-то надоедает писать постоянно fopen fread fclose и он делает функцию-враппер.
Поскольку в отличие от file_get_contents, функции для чтения куска файла с конца в РНР нет, то можно сделать вывод что такой функционал требуется довольно редко. И это логично - РНР либо работает с БД, либо читает файлы с начала.
Поэтому никто и не собрался написать отдельный враппер для этих трех строчек кода.

Как осознание этого факта, так и реализация данной функциональности самостоятельно, обычно не вызывает проблем у разработчика. Поэтому вопрос был воспринят с некоторым удивлением.

к чему в техническом топике, своими заведомо необоснованными замечаниями,
Здесь в общем соглашусь.
Почему-то "Удивительно" воспринимается как претензия, и в ответ идет негатив. Хотя казалось бы, где тут претензия и зачем негатив. Но это профессиональная деформация уже, увы.
 
Последнее редактирование:

Страшный Злодей

Бывший член клуба (достало хамство).
А как, вы думаете, работает tail ? Из астрала узнаёт, где начинается последняя строка?…
tail мощная команда, принцип её работы, при наличии базовых знаний Cи, вы сможете подсмотреть открыв капот и заглянув в исходник.

Я уважаю мнение тех, кто любит самостоятельно копаться в двигателе собственного автомобиля и привержен механической коробке передач. Но для себя я выбираю автомобиль с АКПП и обслуживанием в дилерском центре. Надеюсь, что вы не станете меня осуждать за то, что я давно отказался от педали сцепления и не ползаю с гаечным ключом под днищем авто? Вот так же, мне по большому счёту, не хочется ковыряться и в исходниках. Конкретную задачу из темы топика я решил. Уж извините, за то что попытался найти удобный инструмент в виде готовой функции.

За 18 лет ни разу не понадобилась. При этом веб для меня не основное применение PHP, чаще это утилиты для работы с данными. В том числе логами.
Похоже, что в некотором роде, вы уникальны. 18 лет использовать PHP для работами с данными в утилитах не для вэба, это мощно! Искренне восхищаюсь такой приверженностью! Вы его в CLI версии используете? Всегда считал, что Personal Home Page / Hypertext Preprocessor создан именно для вэба.
 
Последнее редактирование:

WMix

герр M:)ller
Партнер клуба
ты уже скажи что хочешь " Print the last 10 lines of each FILE to standard output. " ?
https://stackoverflow.com/questions/1510141/read-last-line-from-file вот скрипт, оберни в function и пользуй.
Но для себя я выбираю автомобиль с АКПП и обслуживанием в дилерском центре.
тогда нафига взял отвертку в руки? озвучь цену, найдется механик
 

Страшный Злодей

Бывший член клуба (достало хамство).
ты уже скажи что хочешь
Да решил уже давно. Вопрос простой был, нечего там добавить.

тогда нафига взял отвертку в руки? озвучь цену, найдется механик
В том-то и дело, не брал я в руки отвёртку. Я попытался нажать кнопку старт/стоп, а оказалось, что нужно ключ искать где-то и код иммобилайзера чекать. Это не смертельно и не страшно. Вставил завёл-поехал. Но глупо как-то постоянно с ключом возиться, когда возможно есть чудо кнопка, о которой я не знал. Вот и задал вопрос. Да, собственно, как и писал выше, все решилось давно. Так-что механика, увы, придётся оставить без ужина 😉
 

Фанат

oncle terrible
Команда форума
18 лет использовать PHP для работами с данными в утилитах не для вэба, это мощно!
Странный сарказм.
Ну вот у меня сроки похожие, и я тоже, именно для веба, практически никогда не сталкивался с такой задачей
В моем вебе данные либо берутся из базы, либо, если из файла, то он читается сверху вниз.
Если же ковырять логи - то это как раз таки cli, но в этом случае я вообще не думая использую нативный tail
 

Страшный Злодей

Бывший член клуба (достало хамство).
Странный сарказм.
Ну вот у меня сроки похожие, и я тоже, именно для веба, практически никогда не сталкивался с такой задачей
В моем вебе данные либо берутся из базы, либо, если из файла, то он читается сверху вниз.
Если же ковырять логи - то это как раз таки cli, но в этом случае я вообще не думая использую нативный tail
Ну так вы именно для вэба, а AnrDaemon, пишет, что веб для него НЕ основное применение PHP. Вот это и удивляет немного.
P/S: Сарказм мой добрый 😉
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху