<slide title="" section="phpspy">

<blurb fontsize="20em" align="center">phpspy</blurb>
<blurb fontsize="1.1em" align="center">Low-overhead sampling profiler</blurb>
<link fontsize="1em" align="center" href="https://github.com/adsr/phpspy">https://github.com/adsr/phpspy</link>

<break lines="1" section="spy1"/>
<blurb fontsize="1.1em" align="left">Sample frequency in nanoseconds (or Hz)</blurb>

<example fontsize="0.9em" result='0' title="" type="shell nohighlight"><![CDATA[
$ phpspy -s 200000000 -- php -r 'sleep(1);' 
0 sleep <internal>:-1
1 <main> <internal>:-1

0 sleep <internal>:-1
1 <main> <internal>:-1

0 sleep <internal>:-1
1 <main> <internal>:-1

0 sleep <internal>:-1
1 <main> <internal>:-1

0 sleep <internal>:-1
1 <main> <internal>:-1

process_vm_readv: No such process
]]></example>

<break lines="1" section="spy2"/>
<blurb fontsize="1.1em" align="left">Attach to a running process</blurb>
<example fontsize="0.9em" result='0' title="" type="shell nohighlight"><![CDATA[
$ sudo phpspy -r -p $(pgrep -n php-fpm)

0 wp_installing /var/www/wordpress/wp-includes/load.php:944
1 wp_load_alloptions /var/www/wordpress/wp-includes/option.php:189
2 get_option /var/www/wordpress/wp-includes/option.php:90
3 create_initial_taxonomies /var/www/wordpress/wp-includes/taxonomy.php:43
4 WP_Hook::apply_filters /var/www/wordpress/wp-includes/class-wp-hook.php:286
5 WP_Hook::do_action /var/www/wordpress/wp-includes/class-wp-hook.php:310
6 do_action /var/www/wordpress/wp-includes/plugin.php:453
7 <main> /var/www/wordpress/wp-settings.php:450
8 <main> /var/www/wordpress/wp-config.php:89
9 <main> /var/www/wordpress/wp-load.php:37
10 <main> /var/www/wordpress/wp-blog-header.php:13
11 <main> /var/www/wordpress/index.php:17
# 1537119612.459615 /index.php p=1 /var/www/wordpress/index.php -

0 mysqli_query <internal>:-1
1 wpdb::_do_query /var/www/wordpress/wp-includes/wp-db.php:1924
2 wpdb::query /var/www/wordpress/wp-includes/wp-db.php:1813
3 wpdb::get_results /var/www/wordpress/wp-includes/wp-db.php:2488
4 _prime_comment_caches /var/www/wordpress/wp-includes/comment.php:2871
5 WP_Comment_Query::get_comments /var/www/wordpress/wp-includes/class-wp-comment-query.php:427
6 WP_Comment_Query::query /var/www/wordpress/wp-includes/class-wp-comment-query.php:346
7 get_comments /var/www/wordpress/wp-includes/comment.php:226
8 WP_Widget_Recent_Comments::widget /var/www/wordpress/wp-includes/widgets/class-wp-widget-recent-comments.php:99
9 WP_Widget::display_callback /var/www/wordpress/wp-includes/class-wp-widget.php:372
10 dynamic_sidebar /var/www/wordpress/wp-includes/widgets.php:743
11 <main> /var/www/wordpress/wp-content/themes/twentyfifteen/sidebar.php:41
12 load_template /var/www/wordpress/wp-includes/template.php:688
13 locate_template /var/www/wordpress/wp-includes/template.php:647
14 get_sidebar /var/www/wordpress/wp-includes/general-template.php:110
15 <main> /var/www/wordpress/wp-content/themes/twentyfifteen/header.php:49
16 load_template /var/www/wordpress/wp-includes/template.php:688
17 locate_template /var/www/wordpress/wp-includes/template.php:647
18 get_header /var/www/wordpress/wp-includes/general-template.php:41
19 <main> /var/www/wordpress/wp-content/themes/twentyfifteen/single.php:10
20 <main> /var/www/wordpress/wp-includes/template-loader.php:74
21 <main> /var/www/wordpress/wp-blog-header.php:19
22 <main> /var/www/wordpress/index.php:17
# 1537119612.459615 /index.php p=1 /var/www/wordpress/index.php -
]]></example>

<break lines="1" section="spy3"/>
<blurb fontsize="1.1em" align="left">Memory usage on stack frames</blurb>
<example fontsize="0.9em" result='0' title="" type="shell nohighlight"><![CDATA[
$ sudo phpspy -m php src/phan.php

0 Phan\Analysis::parseNodeInContext /home/rasmus/phan/src/Phan/Analysis.php:176
1 Phan\Analysis::parseNodeInContext /home/rasmus/phan/src/Phan/Analysis.php:176
2 Phan\Analysis::parseNodeInContext /home/rasmus/phan/src/Phan/Analysis.php:176
3 Phan\Analysis::parseNodeInContext /home/rasmus/phan/src/Phan/Analysis.php:176
4 Phan\Analysis::parseFile /home/rasmus/phan/src/Phan/Analysis.php:63
5 Phan\Phan::analyzeFileList /home/rasmus/phan/src/Phan/Phan.php:94
6 <main> /home/rasmus/phan/src/phan.php:1
# mem 119159776 123721960

0 ast\parse_code <internal>:-1
1 Phan\AST\Parser::parseCode /home/rasmus/phan/src/Phan/AST/Parser.php:42
2 Phan\Analysis::parseFile /home/rasmus/phan/src/Phan/Analysis.php:63
3 Phan\Phan::analyzeFileList /home/rasmus/phan/src/Phan/Phan.php:94
4 <main> /home/rasmus/phan/src/phan.php:1
# mem 82471616 123721960
]]></example>

<break lines="1" section="spytop"/>

<blurb fontsize="1.1em" align="center">Top-like output mode </blurb>
<image width="772" height="452" filename="phpspy_top.gif" align="center"/>
<notes>
sudo ptop
cd ~/phan
phan
</notes>

<break lines="1" section="spy4"/>
<blurb fontsize="1.1em" align="left">Generate a flame graph</blurb>
<example fontsize="0.9em" result='0' title="" type="shell nohighlight"><![CDATA[
$ phpspy phan > /tmp/output
$ cat /tmp/output | stackcollapse-phpspy.pl | flamegraph.pl > flame.svg
]]></example>
<break lines="1" section="spy5"/>
<object filename="phan.svg" type="image/svg+xml" width="80%" height="80%" align="center"/>

</slide>
