Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
yii2
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Rotua Panjaitan
yii2
Commits
5095401a
Commit
5095401a
authored
Dec 31, 2013
by
Alexander Makarov
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1698 from Ragazzo/debug_module_profile_panel_improvements
improved debug module profile panel
parents
9e66e08b
9a416f3c
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
197 additions
and
68 deletions
+197
-68
Db.php
extensions/yii/debug/models/search/Db.php
+1
-1
Log.php
extensions/yii/debug/models/search/Log.php
+2
-2
Profile.php
extensions/yii/debug/models/search/Profile.php
+75
-0
DbPanel.php
extensions/yii/debug/panels/DbPanel.php
+3
-3
LogPanel.php
extensions/yii/debug/panels/LogPanel.php
+2
-2
ProfilingPanel.php
extensions/yii/debug/panels/ProfilingPanel.php
+64
-43
detail.php
extensions/yii/debug/views/default/panels/db/detail.php
+4
-7
summary.php
extensions/yii/debug/views/default/panels/db/summary.php
+1
-1
detail.php
extensions/yii/debug/views/default/panels/log/detail.php
+5
-9
detail.php
extensions/yii/debug/views/default/panels/profile/detail.php
+33
-0
summary.php
...nsions/yii/debug/views/default/panels/profile/summary.php
+7
-0
No files found.
extensions/yii/debug/models/search/Db.php
View file @
5095401a
...
...
@@ -53,7 +53,7 @@ class Db extends Base
'pageSize'
=>
10
,
],
'sort'
=>
[
'attributes'
=>
[
'duration'
,
'type'
,
'query'
],
'attributes'
=>
[
'duration'
,
'type'
,
'query'
],
'defaultOrder'
=>
[
'duration'
=>
SORT_DESC
,
],
...
...
extensions/yii/debug/models/search/Log.php
View file @
5095401a
...
...
@@ -22,7 +22,7 @@ class Log extends Base
public
$category
;
/**
* @var integer
ajax
attribute input search value
* @var integer
message
attribute input search value
*/
public
$message
;
...
...
@@ -59,7 +59,7 @@ class Log extends Base
'pageSize'
=>
10
,
],
'sort'
=>
[
'attributes'
=>
[
'time'
,
'level'
,
'category'
,
'message'
],
'attributes'
=>
[
'time'
,
'level'
,
'category'
,
'message'
],
],
]);
...
...
extensions/yii/debug/models/search/Profile.php
0 → 100644
View file @
5095401a
<?php
namespace
yii\debug\models\search
;
use
yii\data\ArrayDataProvider
;
use
yii\debug\components\search\Filter
;
/**
* Profile represents the model behind the search form about current request profiling log.
*/
class
Profile
extends
Base
{
/**
* @var string method attribute input search value
*/
public
$category
;
/**
* @var integer info attribute input search value
*/
public
$info
;
public
function
rules
()
{
return
[
[[
'category'
,
'info'
],
'safe'
],
];
}
/**
* @inheritdoc
*/
public
function
attributeLabels
()
{
return
[
'category'
=>
'Category'
,
'info'
=>
'Info'
,
];
}
/**
* Returns data provider with filled models. Filter applied if needed.
* @param array $params
* @param array $models
* @return \yii\data\ArrayDataProvider
*/
public
function
search
(
$params
,
$models
)
{
$dataProvider
=
new
ArrayDataProvider
([
'allModels'
=>
$models
,
'pagination'
=>
[
'pageSize'
=>
10
,
],
'sort'
=>
[
'attributes'
=>
[
'category'
,
'info'
,
'duration'
],
'defaultOrder'
=>
[
'duration'
=>
SORT_DESC
,
],
],
]);
if
(
!
(
$this
->
load
(
$params
)
&&
$this
->
validate
()))
{
return
$dataProvider
;
}
$filter
=
new
Filter
();
$this
->
addCondition
(
$filter
,
'category'
,
true
);
$this
->
addCondition
(
$filter
,
'info'
,
true
);
$dataProvider
->
allModels
=
$filter
->
filter
(
$models
);
return
$dataProvider
;
}
}
extensions/yii/debug/panels/DbPanel.php
View file @
5095401a
...
...
@@ -53,9 +53,9 @@ class DbPanel extends Panel
public
function
getDetail
()
{
$searchModel
=
new
Db
();
$dataProvider
=
$searchModel
->
search
(
$_GET
,
$this
->
getModels
());
$dataProvider
=
$searchModel
->
search
(
Yii
::
$app
->
request
->
get
()
,
$this
->
getModels
());
return
Yii
::
$app
->
view
->
render
(
'panels/db/detail'
,[
return
Yii
::
$app
->
view
->
render
(
'panels/db/detail'
,
[
'panel'
=>
$this
,
'dataProvider'
=>
$dataProvider
,
'searchModel'
=>
$searchModel
,
...
...
@@ -121,7 +121,7 @@ class DbPanel extends Panel
*/
protected
function
getModels
()
{
if
(
$this
->
_models
===
null
||
$refresh
)
{
if
(
$this
->
_models
===
null
)
{
$this
->
_models
=
[];
$timings
=
$this
->
calculateTimings
();
...
...
extensions/yii/debug/panels/LogPanel.php
View file @
5095401a
...
...
@@ -33,13 +33,13 @@ class LogPanel extends Panel
public
function
getSummary
()
{
return
Yii
::
$app
->
view
->
render
(
'panels/log/summary'
,[
'data'
=>
$this
->
data
,
'panel'
=>
$this
]);
return
Yii
::
$app
->
view
->
render
(
'panels/log/summary'
,
[
'data'
=>
$this
->
data
,
'panel'
=>
$this
]);
}
public
function
getDetail
()
{
$searchModel
=
new
Log
();
$dataProvider
=
$searchModel
->
search
(
$_GET
,
$this
->
getModels
());
$dataProvider
=
$searchModel
->
search
(
Yii
::
$app
->
request
->
get
()
,
$this
->
getModels
());
return
Yii
::
$app
->
view
->
render
(
'panels/log/detail'
,[
'dataProvider'
=>
$dataProvider
,
...
...
extensions/yii/debug/panels/ProfilingPanel.php
View file @
5095401a
...
...
@@ -9,8 +9,8 @@ namespace yii\debug\panels;
use
Yii
;
use
yii\debug\Panel
;
use
yii\helpers\Html
;
use
yii\log\Logger
;
use
yii\debug\models\search\Profile
;
/**
* Debugger panel that collects and displays performance profiling info.
...
...
@@ -20,6 +20,17 @@ use yii\log\Logger;
*/
class
ProfilingPanel
extends
Panel
{
/**
* @var array profile messages timings
*/
private
$_timings
;
/**
* @var array current request profile timings
*/
private
$_models
;
public
function
getName
()
{
return
'Profiling'
;
...
...
@@ -27,25 +38,41 @@ class ProfilingPanel extends Panel
public
function
getSummary
()
{
$memory
=
sprintf
(
'%.1f MB'
,
$this
->
data
[
'memory'
]
/
1048576
);
$time
=
number_format
(
$this
->
data
[
'time'
]
*
1000
)
.
' ms'
;
$url
=
$this
->
getUrl
();
return
<<<EOD
<div class="yii-debug-toolbar-block">
<a href="$url" title="Total request processing time was $time">Time <span class="label">$time</span></a>
</div>
<div class="yii-debug-toolbar-block">
<a href="$url" title="Peak memory consumption">Memory <span class="label">$memory</span></a>
</div>
EOD;
return
Yii
::
$app
->
view
->
render
(
'panels/profile/summary'
,
[
'memory'
=>
sprintf
(
'%.1f MB'
,
$this
->
data
[
'memory'
]
/
1048576
),
'time'
=>
number_format
(
$this
->
data
[
'time'
]
*
1000
)
.
' ms'
,
'panel'
=>
$this
]);
}
public
function
getDetail
()
{
$searchModel
=
new
Profile
();
$dataProvider
=
$searchModel
->
search
(
Yii
::
$app
->
request
->
get
(),
$this
->
getModels
());
return
Yii
::
$app
->
view
->
render
(
'panels/profile/detail'
,
[
'panel'
=>
$this
,
'dataProvider'
=>
$dataProvider
,
'searchModel'
=>
$searchModel
,
'memory'
=>
sprintf
(
'%.1f MB'
,
$this
->
data
[
'memory'
]
/
1048576
),
'time'
=>
number_format
(
$this
->
data
[
'time'
]
*
1000
)
.
' ms'
,
]);
}
/**
* Calculates given request profile messages timings.
* @return array timings
*/
protected
function
calculateTimings
()
{
if
(
$this
->
_timings
!==
null
)
{
return
$this
->
_timings
;
}
$messages
=
$this
->
data
[
'messages'
];
$timings
=
[];
$stack
=
[];
foreach
(
$messages
as
$i
=>
$log
)
{
list
(
$token
,
$level
,
$category
,
$timestamp
,
$traces
)
=
$log
;
if
(
$level
==
Logger
::
LEVEL_PROFILE_BEGIN
)
{
...
...
@@ -62,36 +89,7 @@ EOD;
$timings
[]
=
[
count
(
$stack
),
$last
[
0
],
$last
[
2
],
$now
-
$last
[
3
],
$last
[
4
]];
}
$rows
=
[];
foreach
(
$timings
as
$timing
)
{
$time
=
sprintf
(
'%.1f ms'
,
$timing
[
3
]
*
1000
);
$procedure
=
str_repeat
(
'<span class="indent">→</span>'
,
$timing
[
0
])
.
Html
::
encode
(
$timing
[
1
]);
$category
=
Html
::
encode
(
$timing
[
2
]);
$rows
[]
=
"<tr><td style=
\"
width: 80px;
\"
>
$time
</td><td style=
\"
width: 220px;
\"
>
$category
</td><td>
$procedure
</td>"
;
}
$rows
=
implode
(
"
\n
"
,
$rows
);
$memory
=
sprintf
(
'%.1f MB'
,
$this
->
data
[
'memory'
]
/
1048576
);
$time
=
number_format
(
$this
->
data
[
'time'
]
*
1000
)
.
' ms'
;
return
<<<EOD
<h2>Performance Profiling</h2>
<p>Total processing time: <b>$time</b>; Peak memory: <b>$memory</b>.</p>
<table class="table table-condensed table-bordered table-striped table-hover" style="table-layout: fixed;">
<thead>
<tr>
<th style="width: 80px;">Time</th>
<th style="width: 220px;">Category</th>
<th>Procedure</th>
</tr>
</thead>
<tbody>
$rows
</tbody>
</table>
EOD;
return
$this
->
_timings
=
$timings
;
}
public
function
save
()
...
...
@@ -104,4 +102,27 @@ EOD;
'messages'
=>
$messages
,
];
}
/**
* Returns array of profiling models that can be used in data provider.
* @return array models
*/
protected
function
getModels
()
{
if
(
$this
->
_models
===
null
)
{
$this
->
_models
=
[];
$timings
=
$this
->
calculateTimings
();
foreach
(
$timings
as
$profileTiming
)
{
$this
->
_models
[]
=
[
'duration'
=>
$profileTiming
[
3
]
*
1000
,
#in milliseconds
'category'
=>
$profileTiming
[
2
],
'info'
=>
$profileTiming
[
1
],
'level'
=>
$profileTiming
[
0
],
];
}
}
return
$this
->
_models
;
}
}
extensions/yii/debug/views/default/panels/db/detail.php
View file @
5095401a
...
...
@@ -15,29 +15,26 @@ echo GridView::widget([
[
'class'
=>
'yii\grid\SerialColumn'
],
[
'attribute'
=>
'duration'
,
'value'
=>
function
(
$data
)
{
'value'
=>
function
(
$data
)
{
return
sprintf
(
'%.1f ms'
,
$data
[
'duration'
]);
},
],
[
'attribute'
=>
'type'
,
'value'
=>
function
(
$data
)
{
'value'
=>
function
(
$data
)
{
return
Html
::
encode
(
mb_strtoupper
(
$data
[
'type'
],
'utf8'
));
},
],
[
'attribute'
=>
'query'
,
'value'
=>
function
(
$data
)
{
'value'
=>
function
(
$data
)
{
$query
=
Html
::
encode
(
$data
[
'query'
]);
if
(
!
empty
(
$data
[
'trace'
]))
{
$query
.=
Html
::
ul
(
$data
[
'trace'
],
[
'class'
=>
'trace'
,
'item'
=>
function
(
$trace
)
{
return
"<li>
{
$trace
[
'file'
]
}
(
{
$trace
[
'line'
]
}
)</li>"
;
return
"<li>
{
$trace
[
'file'
]
}
(
{
$trace
[
'line'
]
}
)</li>"
;
},
]);
}
...
...
extensions/yii/debug/views/default/panels/db/summary.php
View file @
5095401a
<?php
if
(
$queryCount
)
:
?>
<div
class=
"yii-debug-toolbar-block"
>
<a
href=
"
$url
"
title=
"Executed
<?php
echo
$queryCount
;
?>
database queries which took
<?php
echo
$queryTime
;
?>
."
>
<a
href=
"
<?php
echo
$panel
->
getUrl
();
?>
"
title=
"Executed
<?php
echo
$queryCount
;
?>
database queries which took
<?php
echo
$queryTime
;
?>
."
>
DB
<span
class=
"label"
>
<?php
echo
$queryCount
;
?>
</span>
<span
class=
"label"
>
<?php
echo
$queryTime
;
?>
</span>
</a>
</div>
...
...
extensions/yii/debug/views/default/panels/log/detail.php
View file @
5095401a
...
...
@@ -12,7 +12,7 @@ echo GridView::widget([
'id'
=>
'log-panel-detailed-grid'
,
'filterModel'
=>
$searchModel
,
'filterUrl'
=>
$panel
->
getUrl
(),
'rowOptions'
=>
function
(
$model
,
$key
,
$index
,
$grid
){
'rowOptions'
=>
function
(
$model
,
$key
,
$index
,
$grid
)
{
switch
(
$model
[
'level'
])
{
case
Logger
::
LEVEL_ERROR
:
return
[
'class'
=>
'danger'
];
case
Logger
::
LEVEL_WARNING
:
return
[
'class'
=>
'warning'
];
...
...
@@ -24,8 +24,7 @@ echo GridView::widget([
[
'class'
=>
'yii\grid\SerialColumn'
],
[
'attribute'
=>
'time'
,
'value'
=>
function
(
$data
)
{
'value'
=>
function
(
$data
)
{
$timeInSeconds
=
$data
[
'time'
]
/
1000
;
$millisecondsDiff
=
(
int
)((
$timeInSeconds
-
(
int
)
$timeInSeconds
)
*
1000
);
return
date
(
'H:i:s.'
,
$timeInSeconds
)
.
sprintf
(
'%03d'
,
$millisecondsDiff
);
...
...
@@ -33,8 +32,7 @@ echo GridView::widget([
],
[
'attribute'
=>
'level'
,
'value'
=>
function
(
$data
)
{
'value'
=>
function
(
$data
)
{
return
Logger
::
getLevelName
(
$data
[
'level'
]);
},
'filter'
=>
[
...
...
@@ -47,15 +45,13 @@ echo GridView::widget([
'category'
,
[
'attribute'
=>
'message'
,
'value'
=>
function
(
$data
)
{
'value'
=>
function
(
$data
)
{
$message
=
nl2br
(
Html
::
encode
(
$data
[
'message'
]));
if
(
!
empty
(
$data
[
'trace'
]))
{
$message
.=
Html
::
ul
(
$data
[
'trace'
],
[
'class'
=>
'trace'
,
'item'
=>
function
(
$trace
)
{
'item'
=>
function
(
$trace
)
{
return
"<li>
{
$trace
[
'file'
]
}
(
{
$trace
[
'line'
]
}
)</li>"
;
}
]);
...
...
extensions/yii/debug/views/default/panels/profile/detail.php
0 → 100644
View file @
5095401a
<?php
use
yii\grid\GridView
;
?>
<h1>
Performance Profiling
</h1>
<p>
Total processing time:
<b>
<?php
echo
$time
;
?>
</b>
; Peak memory:
<b>
<?php
echo
$memory
;
?>
</b>
.
</p>
<?php
echo
GridView
::
widget
([
'dataProvider'
=>
$dataProvider
,
'id'
=>
'profile-panel-detailed-grid'
,
'filterModel'
=>
$searchModel
,
'filterUrl'
=>
$panel
->
getUrl
(),
'columns'
=>
[
[
'class'
=>
'yii\grid\SerialColumn'
],
[
'attribute'
=>
'duration'
,
'value'
=>
function
(
$data
)
{
return
sprintf
(
'%.1f ms'
,
$data
[
'duration'
]);
},
],
'category'
,
[
'attribute'
=>
'info'
,
'value'
=>
function
(
$data
)
{
return
str_repeat
(
'<span class="indent">→</span>'
,
$data
[
'level'
])
.
$data
[
'info'
];
},
'options'
=>
[
'width'
=>
'60%'
,
],
],
],
]);
?>
\ No newline at end of file
extensions/yii/debug/views/default/panels/profile/summary.php
0 → 100644
View file @
5095401a
<div
class=
"yii-debug-toolbar-block"
>
<a
href=
"
<?php
echo
$panel
->
getUrl
();
?>
"
title=
"Total request processing time was
<?php
echo
$time
;
?>
"
>
Time
<span
class=
"label"
>
<?php
echo
$time
;
?>
</span></a>
</div>
<div
class=
"yii-debug-toolbar-block"
>
<a
href=
"
<?php
echo
$panel
->
getUrl
();
?>
"
title=
"Peak memory consumption"
>
Memory
<span
class=
"label"
>
<?php
echo
$memory
;
?>
</span></a>
</div>
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment