I've been bumping into a problem. I have a log on a Linux box in which is written the output from several running processes. This file can get really big sometimes and I need to read the last line from that file.
The problem is this action will be called via an AJAX request pretty often and when the file size of that log gets over 5-6MB it's rather not good for the server. So I'm thinking I have to read the last line but not to read the whole file and pass through it or load it in RAM because that would just load to death my box.
Is there any optimization for this operation so that it run smooth and not harm the server or kill Apache?
Other option that I have is to exec('tail -n 1 /path/to/log')
but it doesn't sound so good.
Later edit: I DO NOT want to put the file in RAM because it might get huge. fopen()
is not an option.
This should work:
this the code of Ionuț G. Stan
i modified your code a little and made it a function for reuseability
you will get that last line
Here is a compilation of the answers here wrapped into a function which can specify how many lines should be returned.
Untested code from the comments of http://php.net/manual/en/function.fseek.php
If you know the upper bound of line length you could do something like this.
In response to the edit: fopen just acquires a handle to the file (i.e. make sure it exists, process has permission, lets os know a process is using the file, etc...). In this example only 1024 characters from the file will be read into memory.
Use fseek. You seek to the last position and seek it backward (use ftell to tell the current position) until you find a "\n".
NOTE: I've not tested. You may need some adjustment.
UPDATE: Thanks
Syntax Error
for pointing out about empty file.:-D
UPDATE2: Fixxed another Syntax Error, missing semicolon at
$LastLine = ""