X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fprofiler%2FProfilerXhprof.php;h=5f7fc0028a0bd4e9bb51b87015c9b7b4f073a995;hb=09cc5e1e42ad827eef8f8db7b16fbaa7ca238a9f;hp=7a504979bca31410e0898a5992c6769fdf226b09;hpb=79557c5fb351c92c657e2ed6d03ff6b8a3bd55a0;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/profiler/ProfilerXhprof.php b/includes/profiler/ProfilerXhprof.php index 7a504979bc..5f7fc0028a 100644 --- a/includes/profiler/ProfilerXhprof.php +++ b/includes/profiler/ProfilerXhprof.php @@ -40,12 +40,8 @@ * * To restrict the functions for which profiling data is collected, you can * use either a whitelist ($wgProfiler['include']) or a blacklist - * ($wgProfiler['exclude']) containing an array of function names. The - * blacklist functionality is built into HHVM and will completely exclude the - * named functions from profiling collection. The whitelist is implemented by - * Xhprof class which will filter the data collected by XHProf before reporting. - * See documentation for the Xhprof class and the XHProf extension for - * additional information. + * ($wgProfiler['exclude']) containing an array of function names. + * Shell-style patterns are also accepted. * * @author Bryan Davis * @copyright © 2014 Bryan Davis and Wikimedia Foundation. @@ -77,7 +73,8 @@ class ProfilerXhprof extends Profiler { } public function scopedProfileIn( $section ) { - return $this->sprofiler->scopedProfileIn( $section ); + $key = 'section.' . ltrim( $section, '.' ); + return $this->sprofiler->scopedProfileIn( $key ); } /** @@ -86,12 +83,43 @@ class ProfilerXhprof extends Profiler { public function close() { } + /** + * Check if a function or section should be excluded from the output. + * + * @param string $name Function or section name. + * @return bool + */ + private function shouldExclude( $name ) { + if ( $name === '-total' ) { + return true; + } + if ( !empty( $this->params['include'] ) ) { + foreach ( $this->params['include'] as $pattern ) { + if ( fnmatch( $pattern, $name, FNM_NOESCAPE ) ) { + return false; + } + } + return true; + } + if ( !empty( $this->params['exclude'] ) ) { + foreach ( $this->params['exclude'] as $pattern ) { + if ( fnmatch( $pattern, $name, FNM_NOESCAPE ) ) { + return true; + } + } + } + return false; + } + public function getFunctionStats() { $metrics = $this->xhprof->getCompleteMetrics(); $profile = array(); $main = null; // units in ms foreach ( $metrics as $fname => $stats ) { + if ( $this->shouldExclude( $fname ) ) { + continue; + } // Convert elapsed times from μs to ms to match interface $entry = array( 'name' => $fname, @@ -113,8 +141,7 @@ class ProfilerXhprof extends Profiler { // Merge in all of the custom profile sections foreach ( $this->sprofiler->getFunctionStats() as $stats ) { - if ( $stats['name'] === '-total' ) { - // Discard section profiler running totals + if ( $this->shouldExclude( $stats['name'] ) ) { continue; } @@ -183,4 +210,12 @@ class ProfilerXhprof extends Profiler { } return implode( "\n", $out ); } + + /** + * Retrieve raw data from xhprof + * @return array + */ + public function getRawData() { + return $this->xhprof->getRawData(); + } }