Version: 0.5
Type: Function
Category: Other
License: BSD License
Description: Here's an include file that gives your scripts the mystical powers of the tail command. I give it a version of 0.5 because even though it works fine I'm sure someone will find a way to make it better. :)
tail.inc<?PHP
/******************************************************************************
* tail.inc - A PHP rough analogue of the *nix tail command
* written by Tim Thorpe (Majik Sheff)
* this code is distributed under the terms of the FreeBSD license, for details refer to www.freebsd.org
* questions, comments, compliments, donations, ridicule, rants, threats, flames, and friendly hellos can
* be directed to: majik-sheff@home.com
* Hope it's useful to you! (if it is, let me know)
*
* syntax:
* bool tail (string FileName, boolean Follow, string CallOut, string LockFile, int RollBack, int SleepTime, int BufferSize)
*
* Example usage:
*
* include("tail.inc");
* tail("/var/log/logfile", TRUE, 'echo_something($buffer);', "/var/tmp/tail.lock", 1024, 5, 1024);
* function echo_something($text) {
* echo $text;
* }
*
* Will cause the script to follow and echo /var/log/logfile using the default rollback, buffer, and sleep values
* (note the extra commas at the end and the single quotes around the third argument).
******************************************************************************/
function tail($inputFile, $followFlag, $callOut, $lockFile, $rollBack, $sleepTime, $bufferSize) {
if (!file_exists($inputFile)) return(FALSE); //first see if there's a point in running
if ($followFlag) touch($lockFile); //set the lock file if you want to continue tailing (delete this file to kill a tail in progress)
$fileInputFile = fopen($inputFile, "r"); //open the file to tail
clearstatcache(); //flush the filesystem stat cache
$inputFileSize = filesize($inputFile); //get the size of the file
if ($inputFileSize > $rollBack) fseek($fileInputFile, $inputFileSize - $rollBack); //see if the file has grown since the last check
while (!feof ($fileInputFile)) { //if it has, roll out the new lines one at a time
$buffer = fgets($fileInputFile, $bufferSize); //get a line
eval($callOut); //send the line to the callout function (your callout function will need to reference $buffer for the data)
}
while (file_exists($lockFile)) { //keep looping as long as the lock file exists
$oldFileSize = $inputFileSize; //note the current size value
$oldFilePosition = ftell($fileInputFile); //note the current pointer position
clearstatcache(); //flush the cache again
$inputFileSize = filesize($inputFile); //get the current file size
if ($inputFileSize != $oldFileSize) { //see if it's different
if ($inputFileSize < $oldFileSize) { //see if it shrank (or was blanked)
fclose($fileInputFile); //close the file and...
$fileInputFile = fopen($inputFile, "r"); //reopen it just in case it was rotated out (log files, etc)
fseek($fileInputFile, $inputFileSize); //move to the end of the file and carry on...
} else { //if it didn't shrink, then it grew and...
fseek($fileInputFile, $oldFilePosition); //we need to jump to where we left off
}
while (!feof ($fileInputFile)) { //roll through the new lines
$buffer = fgets($fileInputFile, $bufferSize); //get a line
eval($callOut); //send it to the callout
}
}
sleep($sleepTime); //sleep
}
fclose($fileInputFile); //clean up
}
?>