See Release Notes
Long Term Support Release
Differences Between: [Versions 310 and 401] [Versions 311 and 401] [Versions 39 and 401]
1 <?php 2 // 3 // Copyright (c) 2009 Facebook 4 // 5 // Licensed under the Apache License, Version 2.0 (the "License"); 6 // you may not use this file except in compliance with the License. 7 // You may obtain a copy of the License at 8 // 9 // http://www.apache.org/licenses/LICENSE-2.0 10 // 11 // Unless required by applicable law or agreed to in writing, software 12 // distributed under the License is distributed on an "AS IS" BASIS, 13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 // See the License for the specific language governing permissions and 15 // limitations under the License. 16 // 17 18 // 19 // This file defines the interface iXHProfRuns and also provides a default 20 // implementation of the interface (class XHProfRuns). 21 // 22 23 /** 24 * iXHProfRuns interface for getting/saving a XHProf run. 25 * 26 * Clients can either use the default implementation, 27 * namely XHProfRuns_Default, of this interface or define 28 * their own implementation. 29 * 30 * @author Kannan 31 */ 32 interface iXHProfRuns { 33 34 /** 35 * Returns XHProf data given a run id ($run) of a given 36 * type ($type). 37 * 38 * Also, a brief description of the run is returned via the 39 * $run_desc out parameter. 40 */ 41 public function get_run($run_id, $type, &$run_desc); 42 43 /** 44 * Save XHProf data for a profiler run of specified type 45 * ($type). 46 * 47 * The caller may optionally pass in run_id (which they 48 * promise to be unique). If a run_id is not passed in, 49 * the implementation of this method must generated a 50 * unique run id for this saved XHProf run. 51 * 52 * Returns the run id for the saved XHProf run. 53 * 54 */ 55 public function save_run($xhprof_data, $type, $run_id = null); 56 } 57 58 59 /** 60 * XHProfRuns_Default is the default implementation of the 61 * iXHProfRuns interface for saving/fetching XHProf runs. 62 * 63 * It stores/retrieves runs to/from a filesystem directory 64 * specified by the "xhprof.output_dir" ini parameter. 65 * 66 * @author Kannan 67 */ 68 class XHProfRuns_Default implements iXHProfRuns { 69 70 private $dir = ''; 71 private $suffix = 'xhprof'; 72 73 private function gen_run_id($type) { 74 return uniqid(); 75 } 76 77 private function file_name($run_id, $type) { 78 79 $file = "$run_id.$type." . $this->suffix; 80 81 if (!empty($this->dir)) { 82 $file = $this->dir . "/" . $file; 83 } 84 return $file; 85 } 86 87 public function __construct($dir = null) { 88 89 // if user hasn't passed a directory location, 90 // we use the xhprof.output_dir ini setting 91 // if specified, else we default to the directory 92 // in which the error_log file resides. 93 94 if (empty($dir) && !($dir = getenv('XHPROF_OUTPUT_DIR'))) { 95 $dir = ini_get("xhprof.output_dir"); 96 if (empty($dir)) { 97 98 $dir = sys_get_temp_dir(); 99 100 xhprof_error("Warning: Must specify directory location for XHProf runs. ". 101 "Trying {$dir} as default. You can either pass the " . 102 "directory location as an argument to the constructor ". 103 "for XHProfRuns_Default() or set xhprof.output_dir ". 104 "ini param, or set XHPROF_OUTPUT_DIR environment variable."); 105 } 106 } 107 $this->dir = $dir; 108 } 109 110 public function get_run($run_id, $type, &$run_desc) { 111 $file_name = $this->file_name($run_id, $type); 112 113 if (!file_exists($file_name)) { 114 xhprof_error("Could not find file $file_name"); 115 $run_desc = "Invalid Run Id = $run_id"; 116 return null; 117 } 118 119 $contents = file_get_contents($file_name); 120 $run_desc = "XHProf Run (Namespace=$type)"; 121 return unserialize($contents); 122 } 123 124 public function save_run($xhprof_data, $type, $run_id = null) { 125 126 // Use PHP serialize function to store the XHProf's 127 // raw profiler data. 128 $xhprof_data = serialize($xhprof_data); 129 130 if ($run_id === null) { 131 $run_id = $this->gen_run_id($type); 132 } 133 134 $file_name = $this->file_name($run_id, $type); 135 $file = fopen($file_name, 'w'); 136 137 if ($file) { 138 fwrite($file, $xhprof_data); 139 fclose($file); 140 } else { 141 xhprof_error("Could not open $file_name\n"); 142 } 143 144 // echo "Saved run in {$file_name}.\nRun id = {$run_id}.\n"; 145 return $run_id; 146 } 147 148 function list_runs() { 149 if (is_dir($this->dir)) { 150 echo "<hr/>Existing runs:\n<ul>\n"; 151 $files = glob("{$this->dir}/*.{$this->suffix}"); 152 usort($files, function($a, $b) {return filemtime($b) - filemtime($a);}); 153 foreach ($files as $file) { 154 list($run,$source) = explode('.', basename($file)); 155 echo '<li><a href="' . htmlentities($_SERVER['SCRIPT_NAME']) 156 . '?run=' . htmlentities($run) . '&source=' 157 . htmlentities($source) . '">' 158 . htmlentities(basename($file)) . "</a><small> " 159 . date("Y-m-d H:i:s", filemtime($file)) . "</small></li>\n"; 160 } 161 echo "</ul>\n"; 162 } 163 } 164 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body