0
Anatomy of a PHP
    Request
              Joseph Scott
             15 April 2010
                  UPHPU
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
.php



Read   Parse   Compile   Execute   Output
Making Things Faster
.php



Read   Parse APC
               Compile   Execute   Output
Making Things Faster
.php



Read   Parse APC
               Compile   Execute   Output




        opcode cache
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,786 lines of output!
1.
                          PHP - strace
   socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3
2. fcntl64(3, F_GETFL) = 0x2 (fla...
Measuring Tape for
  Programmers
Measuring Tape for
     Programmers
Xdebug can provide LOTS of information

           http://xdebug.org/
Xdebug Profiler
•Generates cachegrind output
 ➡KCachegrind
 ➡webgrind
 ➡MacCallGrind
 ➡WinCacheGrind
 ➡Valgrind
webgrind
Live Demo Time
Upcoming SlideShare
Loading in...5
×

Anatomy of a PHP Request

9,301

Published on

Outline of what happens when a PHP request is made, how you can measure different aspects of it's execution and improve performance.

Published in: Technology
0 Comments
9 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
9,301
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
122
Comments
0
Likes
9
Embeds 0
No embeds

No notes for slide




























  • Transcript of "Anatomy of a PHP Request"

    1. 1. Anatomy of a PHP Request Joseph Scott 15 April 2010 UPHPU
    2. 2. Lifespan .php Read Parse Compile Execute Output
    3. 3. Lifespan .php Read Parse Compile Execute Output Apache / mod_php
    4. 4. Lifespan .php Read Parse Compile Execute Output FastCGI Nginx
    5. 5. Reading Open Read Close
    6. 6. Reading Open Read Close Avoid co$tly services like NFS
    7. 7. Parse hello.php <?php echo "Hello, World!n" Parse error: syntax error, unexpected $end, expecting ',' or ';' in /tmp/hello.php on line 3
    8. 8. 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";     } }
    9. 9. Tokens T_OPEN_TAG ( 1 ) - <?php T_ECHO ( 1 ) - echo T_WHITESPACE ( 1 ) - T_CONSTANT_ENCAPSED_STRING ( 1 ) - "Hello, World!" ;
    10. 10. 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
    11. 11. Execute Deceptively Simple Term •Includes all sorts of activity •Database / remote requests
    12. 12. Output •PHP can buffer output •Don’t forget about compression
    13. 13. Making Things Faster
    14. 14. Making Things Faster .php Read Parse Compile Execute Output
    15. 15. Making Things Faster .php Read Parse APC Compile Execute Output
    16. 16. Making Things Faster .php Read Parse APC Compile Execute Output opcode cache
    17. 17. The PHP Point of View opcodes VLD - Vulcan Logic Dumper
    18. 18. Example PHP $html = file_get_contents( 'http://www.google.com/' ); $regex_pattern = '!<a href="[^>]*">(.*?)</a>!'; preg_match_all( $regex_pattern, $html, $matches );
    19. 19. 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
    20. 20. 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
    21. 21. PHP - strace • System calls, expect LOTS of data • strace -o out php parse-links.php
    22. 22. PHP - strace • System calls, expect LOTS of data • strace -o out php parse-links.php 1,786 lines of output!
    23. 23. 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
    24. 24. Measuring Tape for Programmers
    25. 25. Measuring Tape for Programmers Xdebug can provide LOTS of information http://xdebug.org/
    26. 26. Xdebug Profiler •Generates cachegrind output ➡KCachegrind ➡webgrind ➡MacCallGrind ➡WinCacheGrind ➡Valgrind
    27. 27. webgrind
    28. 28. 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.

    ×