SlideShare a Scribd company logo
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 ',' or ';' in /tmp/hello.php on line 3
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";
    }
}
Tokens

T_OPEN_TAG ( 1 ) - <?php
T_ECHO ( 1 ) - echo
T_WHITESPACE ( 1 ) -
T_CONSTANT_ENCAPSED_STRING ( 1 ) - "Hello,
  World!"
;
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
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 server
• http://github.com/facebook/hiphop-php/
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_match_all( $regex_pattern, $html, $matches );
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
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
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 (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
Live Demo Time

More Related Content

Anatomy of a PHP Request ( UTOSC 2010 )

  • 3. One for the road
  • 4. Anatomy of a PHP Request Joseph Scott 7 Oct 2010 UTOSC
  • 6. Lifespan .php Read Parse Compile Execute Output
  • 7. Lifespan .php Read Parse Compile Execute Output Apache / mod_php
  • 8. Lifespan .php Read Parse Compile Execute Output FastCGI Nginx
  • 9. Reading Open Read Close
  • 10. Reading Open Read Close Avoid co$tly services like NFS
  • 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. 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. Tokens T_OPEN_TAG ( 1 ) - <?php T_ECHO ( 1 ) - echo T_WHITESPACE ( 1 ) - T_CONSTANT_ENCAPSED_STRING ( 1 ) - "Hello, World!" ;
  • 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. Execute Deceptively Simple Term •Includes all sorts of activity •Database / remote requests
  • 16. Output •PHP can buffer output •Don’t forget about compression
  • 18. Making Things Faster Less work, for the same result = awesome
  • 19. Making Things Faster .php Read Parse Compile Execute Output
  • 20. Making Things Faster .php Read APC Parse Compile Execute Output
  • 21. Making Things Faster .php Read APC Parse Compile Execute Output opcode cache
  • 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. HipHop for PHP How much faster?
  • 24. HipHop for PHP How much faster? Depends (of course)
  • 25. Measuring Tape for Programmers
  • 26. Measuring Tape for Programmers Xdebug can provide TONS of information http://xdebug.org/
  • 27. Xdebug Profiler •Generates cachegrind output ➡KCachegrind ➡webgrind ➡MacCallGrind ➡WinCacheGrind ➡Valgrind
  • 33. The PHP Point of View opcodes VLD - Vulcan Logic Dumper
  • 34. Example PHP $html = file_get_contents( 'http://www.google.com/' ); $regex_pattern = '!<a href="[^>]*">(.*?)</a>!'; preg_match_all( $regex_pattern, $html, $matches );
  • 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. 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. PHP - strace • System calls, expect LOTS of data • strace -o out php parse-links.php
  • 38. PHP - strace • System calls, expect LOTS of data • strace -o out php parse-links.php 1,500+ lines of output!
  • 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

Editor's Notes