invalidateOPCache($filename); $f = fopen($filename, "rb"); // Jump to last character fseek($f, 0, SEEK_END); // If we don't have a line at end, deduct 1 from $lines to get if("\n" !== fread($f, 1)) $lines -= 1; // Start reading $output = ""; $chunk = ""; // While we would like more while(0 < ftell($f) && 0 < $chars && 0 < $lines) { // Figure out how far back we should jump $seek = min($chars, $buffer); // Do the jump (backwards, relative to where we are) fseek($f, -$seek, SEEK_CUR); // Read a chunk and prepend it to our output $output = ($chunk = fread($f, $seek)) . $output; // Jump back to where we started reading fseek($f, -mb_strlen($chunk, '8bit'), SEEK_CUR); // Take this seek chunk off the number of chars $chars -= $seek; // Deduct new lines found in this chunk from $lines $lines -= substr_count($chunk, "\n"); } // Close file fclose($f); // OK, now we have bug lines to output, save to our file $output = rtrim(str_replace("\r\n", "\n", $output)); $output = explode("\n", $output); $output = array_slice($output, -$maxLines); $output = $t['Found in'] . " " . $filename . "...\n" . implode("\n", $output); if ($filesWithNewBugs==1) { file_put_contents("../data/bug-report.log", $output); } else { file_put_contents("../data/bug-report.log", "\n\n" . $output, FILE_APPEND); } } } } // Get dir name tmp dir's parent $dataLoc = dirname(__FILE__); $dataLoc = explode(DIRECTORY_SEPARATOR, $dataLoc); $dataLoc = $dataLoc[count($dataLoc) - 2]; // Output result and status array $status = array( "files" => $files, "filesSizesSeen" => $filesSizesSeen, "maxLines" => $maxLines, "bugReportPath" => "|" . $dataLoc . "|data|bug-report.log", "result" => $result ); // Include our process once our bug checking work is done $extraProcessesClass = new ExtraProcesses(); $doNext = $extraProcessesClass->onBugCheckResult($result, $status); // Finally, display our status in JSON format as the XHR response text echo json_encode($status);