diff options
Diffstat (limited to 'lib/Webgrind/FileHandler.php')
-rw-r--r-- | lib/Webgrind/FileHandler.php | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/lib/Webgrind/FileHandler.php b/lib/Webgrind/FileHandler.php new file mode 100644 index 0000000..790ac6a --- /dev/null +++ b/lib/Webgrind/FileHandler.php @@ -0,0 +1,89 @@ +<?php +require 'Reader.php'; +require 'Preprocessor.php'; + +class Webgrind_FileHandler{ + private static $singleton = null; + + public static function getInstance(){ + if(self::$singleton==null) + self::$singleton = new self(); + return self::$singleton; + } + + private function __construct(){ + + $files = $this->getFiles(Config::$xdebugOutputFormat, Config::$xdebugOutputDir); + + $prepFiles = $this->getFiles('/\\'.Config::$preprocessedSuffix.'$/', Config::$storageDir); + foreach($prepFiles as $fileName=>$prepFile){ + $fileName = str_replace(Config::$preprocessedSuffix,'',$fileName); + + if(!isset($files[$fileName]) || $files[$fileName]['mtime']>$prepFile['mtime'] ) + unlink($prepFile['absoluteFilename']); + else + $files[$fileName]['preprocessed'] = true; + } + uasort($files,array($this,'mtimeCmp')); + $this->files = $files; + } + + + public function getInvokeUrl($file){ + # Grab name of invoked file + $fp = fopen($file, 'r'); + fgets($fp); + $invokeUrl = trim(substr(fgets($fp), 5)); + fclose($fp); + return $invokeUrl; + } + + + private function getFiles($format, $dir){ + $list = preg_grep($format,scandir($dir)); + $files = array(); + + $scriptFilename = $_SERVER['SCRIPT_FILENAME']; + + foreach($list as $file){ + $absoluteFilename = $dir.$file; + $invokeUrl = $this->getInvokeUrl($absoluteFilename); + + $files[$file] = array('absoluteFilename'=>$absoluteFilename, 'mtime'=>filemtime($absoluteFilename), 'preprocessed'=>false, 'invokeUrl'=>$invokeUrl, 'selftrace'=>false); + if($invokeUrl == $scriptFilename) + $files[$file]['selftrace'] = true; + + } + return $files; + } + + public function getTraceList($selftraces=false){ + $result = array(); + foreach($this->files as $fileName=>$file){ + if(!$file['selftrace'] || $selftraces) + $result[] = array('filename' => $fileName, 'invokeUrl' => str_replace($_SERVER['DOCUMENT_ROOT'].'/', '', $file['invokeUrl'])); + } + return $result; + } + + public function getTraceReader($file){ + $prepFile = Config::$storageDir.$file.Config::$preprocessedSuffix; + try{ + $r = new Webgrind_Reader($prepFile); + } catch (Exception $e){ + // Preprocessed file does not exist or other error + $cg = new Webgrind_Preprocessor(Config::$xdebugOutputDir.$file, $prepFile); + $cg->parse(); + $r = new Webgrind_Reader($prepFile); + } + return $r; + } + + private function mtimeCmp($a, $b){ + if ($a['mtime'] == $b['mtime']) + return 0; + + return ($a['mtime'] > $b['mtime']) ? -1 : 1; + } + +}
\ No newline at end of file |