1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
|
<?php
/** Real (wall-clock) time */
define('EXCIMER_REAL', 0);
/** CPU time (user and system) consumed by the thread during execution */
define('EXCIMER_CPU', 1);
/**
* A sampling profiler.
*
* Collects a stack trace every time a timer event fires.
*/
class ExcimerProfiler {
/**
* Set the period.
*
* This will take effect the next time start() is called.
*
* If this method is not called, the default period of 0.1 seconds
* will be used.
*
* @param float $period The period in seconds
*/
public function setPeriod($period) {
}
/**
* Set the event type. May be either EXCIMER_REAL, for real (wall-clock)
* time, or EXCIMER_CPU, for CPU time. The default is EXCIMER_REAL.
*
* This will take effect the next time start() is called.
*
* @param int $eventType
*/
public function setEventType($eventType) {
}
/**
* Set the maximum depth of stack trace collection. If this depth is
* exceeded, the traversal up the stack will be terminated, so the function
* will appear to have no caller.
*
* By default, there is no limit. If this is called with a depth of zero,
* the limit is disabled.
*
* This will take effect immediately.
*
* @param int $maxDepth
*/
public function setMaxDepth($maxDepth) {
}
/**
* Set a callback which will be called once the specified number of samples
* has been collected.
*
* When the ExcimerProfiler object is destroyed, the callback will also
* be called, unless no samples have been collected.
*
* The callback will be called with a single argument: the ExcimerLog
* object containing the samples. Before the callback is called, a new
* ExcimerLog object will be created and registered with the
* ExcimerProfiler. So ExcimerProfiler::getLog() should not be used from
* the callback, since it will not return the samples.
*
* @param callable $callback
* @param int $maxSamples
*/
public function setFlushCallback($callback, $maxSamples) {
}
/**
* Clear the flush callback. No callback will be called regardless of
* how many samples are collected.
*/
public function clearFlushCallback() {
}
/**
* Start the profiler. If the profiler was already running, it will be
* stopped and restarted with new options.
*/
public function start() {
}
/**
* Stop the profiler.
*/
public function stop() {
}
/**
* Get the current ExcimerLog object.
*
* Note that if the profiler is running, the object thus returned may be
* modified by a timer event at any time, potentially invalidating your
* analysis. Instead, the profiler should be stopped first, or flush()
* should be used.
*
* @return ExcimerLog
*/
public function getLog() {
}
/**
* Create and register a new ExcimerLog object, and return the old
* ExcimerLog object.
*
* This will return all accumulated events to this point, and reset the
* log with a new log of zero length.
*
* @return ExcimerLog
*/
public function flush() {
}
}
/**
* A collected series of stack traces and some utility methods to aggregate them.
*
* ExcimerLog acts as a container for ExcimerLogEntry objects. The Iterator or
* ArrayAccess interfaces may be used to access them. For example:
*
* foreach ( $profiler->getLog() as $entry ) {
* var_dump( $entry->getTrace() );
* }
*/
class ExcimerLog implements ArrayAccess, Iterator {
/**
* ExcimerLog is not constructible by user code. Objects of this type
* are available via:
* - ExcimerProfiler::getLog()
* - ExcimerProfiler::flush()
* - The callback to ExcimerProfiler::setFlushCallback()
*/
final private function __construct() {
}
/**
* Aggregate the stack traces and convert them to a line-based format
* understood by Brendan Gregg's FlameGraph utility. Each stack trace is
* represented as a series of function names, separated by semicolons.
* After this identifier, there is a single space character, then a number
* giving the number of times the stack appeared. Then there is a line
* break. This is repeated for each unique stack trace.
*
* @return string
*/
public function formatCollapsed() {
}
/**
* Produce an array with an element for every function which appears in
* the log. The key is a human-readable unique identifier for the function,
* method or closure. The value is an associative array with the following
* elements:
*
* - self: The number of events in which the function itself was running,
* no other userspace function was being called. This includes time
* spent in internal functions that this function called.
* - inclusive: The number of events in which this function appeared
* somewhere in the stack.
*
* And optionally the following elements, if they are relevant:
*
* - file: The filename in which the function appears
* - line: The exact line number at which the first relevant event
* occurred.
* - class: The class name in which the method is defined
* - function: The name of the function or method
* - closure_line: The line number at which the closure was defined
*
* The event counts in the "self" and "inclusive" fields are adjusted for
* overruns. They represent an estimate of the number of profiling periods
* in which those functions were present.
*
* @return array
*/
public function aggregateByFunction() {
}
/**
* Get an array which can be JSON encoded for import into speedscope
*
* @return array
*/
public function getSpeedscopeData() {
}
/**
* Get the total number of profiling periods represented by this log.
*
* @return int
*/
public function getEventCount() {
}
/**
* Get the current ExcimerLogEntry object. Part of the Iterator interface.
*
* @return ExcimerLogEntry|null
*/
public function current() {
}
/**
* Get the current integer key or null. Part of the Iterator interface.
*
* @return int|null
*/
public function key() {
}
/**
* Advance to the next log entry. Part of the Iterator interface.
*/
public function next() {
}
/**
* Rewind back to the first log entry. Part of the Iterator interface.
*/
public function rewind() {
}
/**
* Check if the current position is valid. Part of the Iterator interface.
*
* @return bool
*/
public function valid() {
}
/**
* Get the number of log entries contained in this log. This is always less
* than or equal to the number returned by getEventCount(), which includes
* overruns.
*
* @return int
*/
public function count() {
}
/**
* Determine whether a log entry exists at the specified array offset.
* Part of the ArrayAccess interface.
*
* @param int $offset
* @return bool
*/
public function offsetExists($offset) {
}
/**
* Get the ExcimerLogEntry object at the specified array offset.
*
* @param int $offset
* @return ExcimerLogEntry|null
*/
public function offsetGet($offset) {
}
/**
* This function is included for compliance with the ArrayAccess interface.
* It raises a warning and does nothing.
*
* @param int $offset
* @param mixed $value
*/
public function offsetSet($offset, $value) {
}
/**
* This function is included for compliance with the ArrayAccess interface.
* It raises a warning and does nothing.
*
* @param int $offset
*/
public function offsetUnset($offset) {
}
}
|