0
|
1 <?php
|
|
2
|
|
3 /**
|
|
4 * runlog
|
|
5 *
|
|
6 * @author Ziba Scott <ziba@umich.edu>
|
|
7 */
|
|
8 class runlog {
|
|
9
|
|
10 private $start_time = FALSE;
|
|
11 private $parent_stack = array();
|
|
12 private $file_handles = array();
|
|
13 private $indent = 0;
|
|
14 private $run_log = array();
|
|
15
|
|
16 public $print_to_console = FALSE;
|
|
17 public $threshold = 0;
|
|
18 public $tag_count = array();
|
|
19 public $timestamp = "d-M-Y H:i:s O";
|
|
20 public $max_line_size = 150;
|
|
21
|
|
22 function runlog()
|
|
23 {
|
|
24 $this->start_time = microtime(true);
|
|
25 }
|
|
26
|
|
27 public function start($name, $tag = false)
|
|
28 {
|
|
29 $this->run_log[] = array(
|
|
30 'type' => 'start',
|
|
31 'tag' => $tag,
|
|
32 'index' => count($this->run_log),
|
|
33 'value' => $name,
|
|
34 'time' => microtime(true),
|
|
35 'parents' => $this->parent_stack,
|
|
36 'ended' => false,
|
|
37 );
|
|
38
|
|
39 $this->parent_stack[] = $name;
|
|
40
|
|
41 $this->print_to_console("start: ".$name, $tag, 'start');
|
|
42 $this->print_to_file("start: ".$name, $tag, 'start');
|
|
43 $this->indent++;
|
|
44 }
|
|
45
|
|
46 public function end()
|
|
47 {
|
|
48 $name = array_pop($this->parent_stack);
|
|
49 foreach ($this->run_log as $k => $entry) {
|
|
50 if ($entry['value'] == $name && $entry['type'] == 'start' && !$entry['ended']) {
|
|
51 $lastk = $k;
|
|
52 }
|
|
53 }
|
|
54
|
|
55 $start = $this->run_log[$lastk]['time'];
|
|
56 $this->run_log[$lastk]['duration'] = microtime(true) - $start;
|
|
57 $this->run_log[$lastk]['ended'] = true;
|
|
58 $this->run_log[] = array(
|
|
59 'type' => 'end',
|
|
60 'tag' => $this->run_log[$lastk]['tag'],
|
|
61 'index' => $lastk,
|
|
62 'value' => $name,
|
|
63 'time' => microtime(true),
|
|
64 'duration' => microtime(true) - $start,
|
|
65 'parents' => $this->parent_stack,
|
|
66 );
|
|
67
|
|
68 $this->indent--;
|
|
69 if ($this->run_log[$lastk]['duration'] >= $this->threshold) {
|
|
70 $tag_report = "";
|
|
71 foreach ($this->tag_count as $tag => $count){
|
|
72 $tag_report .= "$tag: $count, ";
|
|
73 }
|
|
74 if (!empty($tag_report)) {
|
|
75 // $tag_report = "\n$tag_report\n";
|
|
76 }
|
|
77 $end_txt = sprintf("end: $name - %0.4f seconds $tag_report", $this->run_log[$lastk]['duration']);
|
|
78 $this->print_to_console($end_txt, $this->run_log[$lastk]['tag'], 'end');
|
|
79 $this->print_to_file($end_txt, $this->run_log[$lastk]['tag'], 'end');
|
|
80 }
|
|
81 }
|
|
82
|
|
83 public function increase_tag_count($tag)
|
|
84 {
|
|
85 if (!isset($this->tag_count[$tag])) {
|
|
86 $this->tag_count[$tag] = 0;
|
|
87 }
|
|
88
|
|
89 $this->tag_count[$tag]++;
|
|
90 }
|
|
91
|
|
92 public function get_text()
|
|
93 {
|
|
94 $text = "";
|
|
95 foreach ($this->run_log as $entry){
|
|
96 $text .= str_repeat(" ",count($entry['parents']));
|
|
97 if ($entry['tag'] != 'text'){
|
|
98 $text .= $entry['tag'].': ';
|
|
99 }
|
|
100 $text .= $entry['value'];
|
|
101
|
|
102 if ($entry['tag'] == 'end') {
|
|
103 $text .= sprintf(" - %0.4f seconds", $entry['duration']);
|
|
104 }
|
|
105
|
|
106 $text .= "\n";
|
|
107 }
|
|
108
|
|
109 return $text;
|
|
110 }
|
|
111
|
|
112 public function set_file($filename, $tag = 'master')
|
|
113 {
|
|
114 if (!isset($this->file_handle[$tag])) {
|
|
115 $this->file_handles[$tag] = fopen($filename, 'a');
|
|
116 if (!$this->file_handles[$tag]) {
|
|
117 trigger_error('Could not open file for writing: '.$filename);
|
|
118 }
|
|
119 }
|
|
120 }
|
|
121
|
|
122 public function note($msg, $tag = false)
|
|
123 {
|
|
124 if ($tag) {
|
|
125 $this->increase_tag_count($tag);
|
|
126 }
|
|
127 if (is_array($msg)) {
|
|
128 $msg = '<pre>' . print_r($msg, true) . '</pre>';
|
|
129 }
|
|
130 $this->debug_messages[] = $msg;
|
|
131 $this->run_log[] = array(
|
|
132 'type' => 'note',
|
|
133 'tag' => $tag ?: 'text',
|
|
134 'value' => htmlentities($msg),
|
|
135 'time' => microtime(true),
|
|
136 'parents' => $this->parent_stack,
|
|
137 );
|
|
138
|
|
139 $this->print_to_file($msg, $tag);
|
|
140 $this->print_to_console($msg, $tag);
|
|
141 }
|
|
142
|
|
143 public function print_to_file($msg, $tag = false, $type = false)
|
|
144 {
|
|
145 if (!$tag) {
|
|
146 $file_handle_tag = 'master';
|
|
147 }
|
|
148 else{
|
|
149 $file_handle_tag = $tag;
|
|
150 }
|
|
151
|
|
152 if ($file_handle_tag != 'master' && isset($this->file_handles[$file_handle_tag])) {
|
|
153 $buffer = $this->get_indent();
|
|
154 $buffer .= "$msg\n";
|
|
155 if (!empty($this->timestamp)) {
|
|
156 $buffer = sprintf("[%s] %s",date($this->timestamp, time()), $buffer);
|
|
157 }
|
|
158 fwrite($this->file_handles[$file_handle_tag], wordwrap($buffer, $this->max_line_size, "\n "));
|
|
159 }
|
|
160
|
|
161 if (isset($this->file_handles['master']) && $this->file_handles['master']) {
|
|
162 $buffer = $this->get_indent();
|
|
163 if ($tag) {
|
|
164 $buffer .= "$tag: ";
|
|
165 }
|
|
166 $msg = str_replace("\n","",$msg);
|
|
167 $buffer .= "$msg";
|
|
168 if (!empty($this->timestamp)) {
|
|
169 $buffer = sprintf("[%s] %s",date($this->timestamp, time()), $buffer);
|
|
170 }
|
|
171 if(strlen($buffer) > $this->max_line_size){
|
|
172 $buffer = substr($buffer,0,$this->max_line_size - 3) . "...";
|
|
173 }
|
|
174 fwrite($this->file_handles['master'], $buffer."\n");
|
|
175 }
|
|
176 }
|
|
177
|
|
178 public function print_to_console($msg, $tag = false)
|
|
179 {
|
|
180 if ($this->print_to_console) {
|
|
181 if (is_array($this->print_to_console)) {
|
|
182 if (in_array($tag, $this->print_to_console)) {
|
|
183 echo $this->get_indent();
|
|
184 if ($tag) {
|
|
185 echo "$tag: ";
|
|
186 }
|
|
187 echo "$msg\n";
|
|
188 }
|
|
189 }
|
|
190 else {
|
|
191 echo $this->get_indent();
|
|
192 if ($tag) {
|
|
193 echo "$tag: ";
|
|
194 }
|
|
195 echo "$msg\n";
|
|
196 }
|
|
197 }
|
|
198 }
|
|
199
|
|
200 public function print_totals()
|
|
201 {
|
|
202 $totals = array();
|
|
203 foreach ($this->run_log as $entry) {
|
|
204 if ($entry['type'] == 'start' && $entry['ended']) {
|
|
205 $totals[$entry['value']]['duration'] += $entry['duration'];
|
|
206 $totals[$entry['value']]['count'] += 1;
|
|
207 }
|
|
208 }
|
|
209
|
|
210 if ($this->file_handle) {
|
|
211 foreach ($totals as $name => $details) {
|
|
212 fwrite($this->file_handle,$name.": ".number_format($details['duration'],4)."sec, ".$details['count']." calls \n");
|
|
213 }
|
|
214 }
|
|
215 }
|
|
216
|
|
217 private function get_indent()
|
|
218 {
|
|
219 $buf = "";
|
|
220 for ($i = 0; $i < $this->indent; $i++) {
|
|
221 $buf .= " ";
|
|
222 }
|
|
223 return $buf;
|
|
224 }
|
|
225
|
|
226
|
|
227 function __destruct()
|
|
228 {
|
|
229 foreach ($this->file_handles as $handle) {
|
|
230 fclose($handle);
|
|
231 }
|
|
232 }
|
|
233 }
|