Blank Slide
This one too
One for the road
Anatomy of a PHP
    Request
             Joseph Scott
              7 Oct 2010
                 UTOSC
Rules of Engagement
Lifespan
.php



Read   Parse   Compile   Execute   Output
Lifespan
.php



Read   Parse    Compile   Execute   Output


       Apache      /      mod_php
Lifespan
.php



Read   Parse   Compile   Execute   Output


               FastCGI


                Nginx
Reading
Open    Read     Close
Reading
Open            Read        Close


   Avoid   co$tly services like NFS
Parse
 hello.php

         <?php
         echo "Hello, World!n"


Parse error: syntax error, unexpected $end,
expecting ',...
Tokens
              <?php echo
$tokens = token_get_all( '

  "Hello, World!";' );
foreach ( $tokens as $token ) {
    if ...
Tokens

T_OPEN_TAG ( 1 ) - <?php
T_ECHO ( 1 ) - echo
T_WHITESPACE ( 1 ) -
T_CONSTANT_ENCAPSED_STRING ( 1 ) - "Hello,
  Wor...
Compile
Branch analysis from position: 0
Return found
filename:     /tmp/hello.php
function name: (null)
number of ops: 3
c...
Execute
Deceptively Simple Term

•Includes all sorts of activity
•Database / remote requests
Output
•PHP can buffer output
•Don’t forget about compression
Making Things Faster
Making Things Faster

Less work, for the same result =
           awesome
Making Things Faster
.php



Read   Parse   Compile   Execute   Output
Making Things Faster
.php



Read   APC
       Parse   Compile   Execute   Output
Making Things Faster
.php



Read   APC
       Parse   Compile   Execute   Output




        opcode cache
HipHop for PHP
• Open source code translator from Facebook
• Converts PHP into c++
• Single binary with built in web serve...
HipHop for PHP

 How much faster?
HipHop for PHP

 How much faster?

Depends (of course)
Measuring Tape for
  Programmers
Measuring Tape for
      Programmers
Xdebug can provide TONS of information

           http://xdebug.org/
Xdebug Profiler
•Generates cachegrind output
 ➡KCachegrind
 ➡webgrind
 ➡MacCallGrind
 ➡WinCacheGrind
 ➡Valgrind
Kcachegrind
webgrind
XHProf
XHProf Call Graph
XHProf Diff
The PHP Point of View
      opcodes

VLD - Vulcan Logic Dumper
Example PHP

$html = file_get_contents( 'http://www.google.com/' );
$regex_pattern = '!<a href="[^>]*">(.*?)</a>!';
preg_ma...
Example PHP - VLD
Branch analysis from position: 0
Return found
filename:     /drive/home/joseph/vld/parse-links.php
functi...
Example PHP - VLD
line # op                              fetch         ext return operands
-------------------------------...
PHP - strace

• System calls, expect LOTS of data
• strace -o out php parse-links.php
PHP - strace

• System calls, expect LOTS of data
• strace -o out php parse-links.php

       1,500+ lines of output!
1.
                          PHP - strace
   socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3
2. fcntl64(3, F_GETFL) = 0x2 (fla...
Live Demo Time
Upcoming SlideShare
Loading in...5
×

Anatomy of a PHP Request ( UTOSC 2010 )

2,072

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,072
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
19
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide








































  • Anatomy of a PHP Request ( UTOSC 2010 )

    1. 1. Blank Slide
    2. 2. This one too
    3. 3. One for the road
    4. 4. Anatomy of a PHP Request Joseph Scott 7 Oct 2010 UTOSC
    5. 5. Rules of Engagement
    6. 6. Lifespan .php Read Parse Compile Execute Output
    7. 7. Lifespan .php Read Parse Compile Execute Output Apache / mod_php
    8. 8. Lifespan .php Read Parse Compile Execute Output FastCGI Nginx
    9. 9. Reading Open Read Close
    10. 10. Reading Open Read Close Avoid co$tly services like NFS
    11. 11. Parse hello.php <?php echo "Hello, World!n" Parse error: syntax error, unexpected $end, expecting ',' or ';' in /tmp/hello.php on line 3
    12. 12. Tokens <?php echo $tokens = token_get_all( ' "Hello, World!";' ); foreach ( $tokens as $token ) {     if ( is_array( $token ) ) {         echo token_name( $token[0] ) . " ( {$token[2]} ) - {$token[1]}n";     } else {         echo "{$token}n";     } }
    13. 13. Tokens T_OPEN_TAG ( 1 ) - <?php T_ECHO ( 1 ) - echo T_WHITESPACE ( 1 ) - T_CONSTANT_ENCAPSED_STRING ( 1 ) - "Hello, World!" ;
    14. 14. Compile Branch analysis from position: 0 Return found filename: /tmp/hello.php function name: (null) number of ops: 3 compiled vars: none line # op fetch ext return operands ------------------------------------------------------------------------------- 2 0 ECHO 'Hello%2C+World%21%0A' 3 1 RETURN 1 2* ZEND_HANDLE_EXCEPTION
    15. 15. Execute Deceptively Simple Term •Includes all sorts of activity •Database / remote requests
    16. 16. Output •PHP can buffer output •Don’t forget about compression
    17. 17. Making Things Faster
    18. 18. Making Things Faster Less work, for the same result = awesome
    19. 19. Making Things Faster .php Read Parse Compile Execute Output
    20. 20. Making Things Faster .php Read APC Parse Compile Execute Output
    21. 21. Making Things Faster .php Read APC Parse Compile Execute Output opcode cache
    22. 22. HipHop for PHP • Open source code translator from Facebook • Converts PHP into c++ • Single binary with built in web server • http://github.com/facebook/hiphop-php/
    23. 23. HipHop for PHP How much faster?
    24. 24. HipHop for PHP How much faster? Depends (of course)
    25. 25. Measuring Tape for Programmers
    26. 26. Measuring Tape for Programmers Xdebug can provide TONS of information http://xdebug.org/
    27. 27. Xdebug Profiler •Generates cachegrind output ➡KCachegrind ➡webgrind ➡MacCallGrind ➡WinCacheGrind ➡Valgrind
    28. 28. Kcachegrind
    29. 29. webgrind
    30. 30. XHProf
    31. 31. XHProf Call Graph
    32. 32. XHProf Diff
    33. 33. The PHP Point of View opcodes VLD - Vulcan Logic Dumper
    34. 34. Example PHP $html = file_get_contents( 'http://www.google.com/' ); $regex_pattern = '!<a href="[^>]*">(.*?)</a>!'; preg_match_all( $regex_pattern, $html, $matches );
    35. 35. Example PHP - VLD Branch analysis from position: 0 Return found filename: /drive/home/joseph/vld/parse-links.php function name: (null) number of ops: 17 compiled vars: !0 = $html, !1 = $regex_pattern, !2 = $matches
    36. 36. Example PHP - VLD line # op fetch ext return operands ------------------------------------------------------------------------------- 4 0 EXT_STMT 1 EXT_FCALL_BEGIN 2 SEND_VAL 'http%3A%2F%2Fwww.google.com%2F' 3 DO_FCALL 1 'file_get_contents' 4 EXT_FCALL_END 5 ASSIGN !0, $0 5 6 EXT_STMT 7 ASSIGN !1, '%21%3Ca+href%3D%22%5B%5E%3E %5D%2A%22%3E%28.%2A%3F%29%3C%2Fa%3E%21' 6 8 EXT_STMT 9 EXT_FCALL_BEGIN 10 SEND_VAR !1 11 SEND_VAR !0 12 SEND_REF !2 13 DO_FCALL 3 'preg_match_all' 14 EXT_FCALL_END 7 15 RETURN 1 16* ZEND_HANDLE_EXCEPTION
    37. 37. PHP - strace • System calls, expect LOTS of data • strace -o out php parse-links.php
    38. 38. PHP - strace • System calls, expect LOTS of data • strace -o out php parse-links.php 1,500+ lines of output!
    39. 39. 1. PHP - strace socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3 2. fcntl64(3, F_GETFL) = 0x2 (flags O_RDWR) 3. fcntl64(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 4. connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("64.233.169.99")}, 16) = -1 EINPROGRESS (Operation now in progress) 5. poll([{fd=3, events=POLLIN|POLLOUT|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=3, revents=POLLOUT}]) 6. getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 7. fcntl64(3, F_SETFL, O_RDWR) = 0 8. send(3, "GET / HTTP/1.0rn", 16, MSG_DONTWAIT) = 16 9. send(3, "Host: www.google.comrn", 22, MSG_DONTWAIT) = 22 10.send(3, "rn", 2, MSG_DONTWAIT) = 2 11.poll([{fd=3, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 0) = 0 (Timeout) 12.poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=3, revents=POLLIN}]) 13.recv(3, "HTTP/1.0 200 OKrnDate: Tue, 13 A"..., 8192, MSG_DONTWAIT) = 4636 14.poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=3, revents=POLLIN}]) 15.recv(3, "is) class=gb2>Blogs</a> <div cla"..., 8192, MSG_DONTWAIT) = 4290 16.poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=3, revents=POLLIN}]) 17.recv(3, "", 8192, MSG_DONTWAIT) = 0 18.poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=3, revents=POLLIN}]) 19.recv(3, "", 8192, MSG_DONTWAIT) = 0 20.close(3) = 0
    40. 40. Live Demo Time
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×