If you want to do it in PHP:
<?php
/**
  Read last N lines from file.
  @param $filename string  path to file. must support seeking
  @param $n        int     number of lines to get.
  @return array            up to $n lines of text
*/
function tail($filename, $n)
{
  $buffer_size = 1024;
  $fp = fopen($filename, 'r');
  if (!$fp) return array();
  fseek($fp, 0, SEEK_END);
  $pos = ftell($fp);
  $input = '';
  $line_count = 0;
  while ($line_count < $n + 1)
  {
    // read the previous block of input
    $read_size = $pos >= $buffer_size ? $buffer_size : $pos;
    fseek($fp, $pos - $read_size, SEEK_SET);
    // prepend the current block, and count the new lines
    $input = fread($fp, $read_size).$input;
    $line_count = substr_count(ltrim($input), "\n");
    // if $pos is == 0 we are at start of file
    $pos -= $read_size;
    if (!$pos) break;
  }
  fclose($fp);
  // return the last 50 lines found  
  return array_slice(explode("\n", rtrim($input)), -$n);
}
var_dump(tail('/var/log/syslog', 50));
This is largely untested, but should be enough for you to get a fully working solution.
The buffer size is 1024, but can be changed to be bigger or larger. (You could even dynamically set it based on $n * estimate of line length.) This should be better than seeking character by character, although it does mean we need to do substr_count() to look for new lines.