Weitere ähnliche Inhalte Ähnlich wie Anatomy of a PHP Request ( UTOSC 2010 ) (20) Mehr von Joseph Scott (8) Kürzlich hochgeladen (20) Anatomy of a PHP Request ( UTOSC 2010 )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
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/
26. Measuring Tape for
Programmers
Xdebug can provide TONS of information
http://xdebug.org/
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