Share
Embed
php-fpm がリクエスト処理する仕組みを追う / Tracing-How-php-fpm-Handles-Requests
2025-03-23 PHPerKaigi 2025
shin1x1
March 24, 2025
Transcript
91 slides
-
D .BTBTIJ4IJOCBSB!TIJOY QIQGQN'BTU$(*1SPDFTT.BOBHFS w 1)1ʹ͓͚Δ'BTU$(*࣮ w 1)14"1* 4FSWFS"1* ͷҰͭ 4"1*ྫGQNɺDMJɺDHJɺBQBDIFIBOEMFS
NPE@QIQ ɺFNCFEͳͲ w OHJOYͷΑ͏ͳ8FCαʔόͱ࿈ܞ -
D .BTBTIJ4IJOCBSB!TIJOY w Ϛελϓϩηε ઃఆϑΝΠϧಡࠐɺͪड͚ιέοτੜɺϫʔΧʔϓϩηεੜɺཧ w ϫʔΧʔϓϩηε 'BTU$(*ϦΫΤετॲཧɺ1)1ϑΝΠϧ࣮ߦ QIQGQNϓϩηεߏ PID
TTY STAT TIME COMMAND 1 ? Ss 0:41 php-fpm: master process 7 ? S 0:00 php-fpm: pool www 8 ? S 0:00 php-fpm: pool www -
D .BTBTIJ4IJOCBSB!TIJOY 'BTU$(*ϓϩτίϧओͳϨίʔυλΠϓ λΠϓ ໊শ ༰ '$(*@#&(*/@3&26&45 ϦΫΤετ։࢝
'$(*@1"3".4 )551ϦΫΤετͳͲͷใΛૹ৴ '$(*@45%*/ )551ϦΫΤετϘσΟૹ৴ w ϦΫΤετOHJOYQIQGQN λΠϓ ໊শ ༰ '$(*@45%065 )551Ϩεϙϯεૹ৴ '$(*@45%&33 1)1Τϥʔૹ৴ '$(*@&/%@3&26&45 ϦΫΤετऴྃ w ϨεϙϯεQIQGQNOHJOY -
D .BTBTIJ4IJOCBSB!TIJOY TUSBDFͰ'BTU$(*௨৴Λ؍ w γεςϜίʔϧΛςΩετʹग़ྗ͢ΔίϚϯυ w ରϓϩηε*%ίϚϯυΛࢦఆ࣮ͯ͠ߦ w ࣮ߦྫϓϩηε*% $
strace -p 7 -f -s 1024 -y -ttT -e trace=network,desc strace: Process 7 attached 14:00:34.291084 accept(9<socket:[103273]>, -
D .BTBTIJ4IJOCBSB!TIJOY αϯϓϧ1)1ίʔυ <?php $id = $_GET['id'] ?? 0; $name
= $_POST['name'] ?? ''; $message = file_get_contents('php://input'); echo json_encode([ 'id' => $id, 'name' => $name, 'message' => $message, ]); $ curl http://localhost:8000/?id=1 -X POST -d 'name=foo' {"id":"1","name":"foo","message":"name=foo"} -
D .BTBTIJ4IJOCBSB!TIJOY EFNPTUSBDFग़ྗྫ accept(9<socket:[103273]>, {sa_family=AF_INET, sin_port=htons(46404)... read(4<socket:[248969]>, "\1\1\0\1\0\10\0\0", 8) =
8 read(4<socket:[248969]>, "\0\1\0\0\0\0\0\0", 8) = 8 read(4<socket:[248969]>, "\1\4\0\1\2G\1\0", 8) = 8 read(4<socket:[248969]>, "\17\16SCRIPT_FILENAME/app/ index.php\f\4QUERY_STRINGid=1\16\4REQUEST_METHODPOST... read(4<socket:[248969]>, "\1\5\0\1\0\10\0\0", 8) = 8 read(4<socket:[248969]>, "name=foo", 8) = 8 write(4<socket:[248969]>, "\1\6\0\1\0s\5\0X-Powered-By: PHP/8.4.5- dev\r\nContent-type: text/html; charset=UTF-8\r\n\r\n{\"id\":\"1\",\"name\": \"foo\",\"message\":\"name=foo\"}\0\0\0\0\0\1\3\0\1\0\10\0\0\0\0\0\0\0\10\0\0", 144) = 144 -
D .BTBTIJ4IJOCBSB!TIJOY EFNPTUSBDFग़ྗྫ accept(9<socket:[103273]>, {sa_family=AF_INET, sin_port=htons(46404)... read(4<socket:[248969]>, "\1\1\0\1\0\10\0\0", 8) =
8 read(4<socket:[248969]>, "\0\1\0\0\0\0\0\0", 8) = 8 read(4<socket:[248969]>, "\1\4\0\1\2G\1\0", 8) = 8 read(4<socket:[248969]>, "\17\16SCRIPT_FILENAME/app/ index.php\f\4QUERY_STRINGid=1\16\4REQUEST_METHODPOST... read(4<socket:[248969]>, "\1\5\0\1\0\10\0\0", 8) = 8 read(4<socket:[248969]>, "name=foo", 8) = 8 write(4<socket:[248969]>, "\1\6\0\1\0s\5\0X-Powered-By: PHP/8.4.5- dev\r\nContent-type: text/html; charset=UTF-8\r\n\r\n{\"id\":\"1\",\"name\": \"foo\",\"message\":\"name=foo\"}\0\0\0\0\0\1\3\0\1\0\10\0\0\0\0\0\0\0\10\0\0", 144) = 144 OHJOY͔ΒͷϦΫΤετଓ -
D .BTBTIJ4IJOCBSB!TIJOY EFNPTUSBDFग़ྗྫ accept(9<socket:[103273]>, {sa_family=AF_INET, sin_port=htons(46404)... read(4<socket:[248969]>, "\1\1\0\1\0\10\0\0", 8) =
8 read(4<socket:[248969]>, "\0\1\0\0\0\0\0\0", 8) = 8 read(4<socket:[248969]>, "\1\4\0\1\2G\1\0", 8) = 8 read(4<socket:[248969]>, "\17\16SCRIPT_FILENAME/app/ index.php\f\4QUERY_STRINGid=1\16\4REQUEST_METHODPOST... read(4<socket:[248969]>, "\1\5\0\1\0\10\0\0", 8) = 8 read(4<socket:[248969]>, "name=foo", 8) = 8 write(4<socket:[248969]>, "\1\6\0\1\0s\5\0X-Powered-By: PHP/8.4.5- dev\r\nContent-type: text/html; charset=UTF-8\r\n\r\n{\"id\":\"1\",\"name\": \"foo\",\"message\":\"name=foo\"}\0\0\0\0\0\1\3\0\1\0\10\0\0\0\0\0\0\0\10\0\0", 144) = 144 'BTU$(*ड৴ʢϦΫΤετʣ -
D .BTBTIJ4IJOCBSB!TIJOY EFNPTUSBDFग़ྗྫ accept(9<socket:[103273]>, {sa_family=AF_INET, sin_port=htons(46404)... read(4<socket:[248969]>, "\1\1\0\1\0\10\0\0", 8) =
8 read(4<socket:[248969]>, "\0\1\0\0\0\0\0\0", 8) = 8 read(4<socket:[248969]>, "\1\4\0\1\2G\1\0", 8) = 8 read(4<socket:[248969]>, "\17\16SCRIPT_FILENAME/app/ index.php\f\4QUERY_STRINGid=1\16\4REQUEST_METHODPOST... read(4<socket:[248969]>, "\1\5\0\1\0\10\0\0", 8) = 8 read(4<socket:[248969]>, "name=foo", 8) = 8 write(4<socket:[248969]>, "\1\6\0\1\0s\5\0X-Powered-By: PHP/8.4.5- dev\r\nContent-type: text/html; charset=UTF-8\r\n\r\n{\"id\":\"1\",\"name\": \"foo\",\"message\":\"name=foo\"}\0\0\0\0\0\1\3\0\1\0\10\0\0\0\0\0\0\0\10\0\0", 144) = 144 'BTU$(*ૹ৴ʢϨεϙϯεʣ -
D .BTBTIJ4IJOCBSB!TIJOY 'BTU$(*ϓϩτίϧϔομ Ґஔ όΠτ ༰ 'BTU$(*όʔδϣϯʢ௨ৗʣ
ϨίʔυλΠϓ ϦΫΤετࣝผࢠ ίϯςϯπ ύσΟϯά ༧ʢৗʹʣ όΠτݻఆ -
D .BTBTIJ4IJOCBSB!TIJOY '$(*@1"3".4ྫϔομ read(4, "\1\4\0\1\1\321\7\0", 8)= 8 Ґஔ
ਐʣ ༰ a 'BTU$(*όʔδϣϯ a ϨίʔυλΠϓʢ'$(*@1"3".4ʣ a ϦΫΤετࣝผࢠ aa ίϯςϯπʢ ʣ a ύσΟϯά a ༧ʢৗʹʣ TUSBDFόΠφϦΛਐදݱͰग़ྗʢΦϓγϣϯʹΑΔʣ -
D .BTBTIJ4IJOCBSB!TIJOY '$(*@1"3".4ίϯςϯπ read(4<socket:[248969]>, "\17\16SCRIPT_FILENAME/app/ index.php\f\4QUERY_STRINGid=1\16\4REQUEST_METHODPOST... Ґஔ ਐʣ
༰ a Ωʔ a 4$3*15@'*-&/".& ΩʔʢόΠτʣ BQQJOEFYQIQ ʢόΠτʣ ,FZ7BMVFܗࣜ -
D .BTBTIJ4IJOCBSB!TIJOY '$(*@1"3".4ྫίϯςϯπ read(4<socket:[248969]>, "\17\16SCRIPT_FILENAME/app/ index.php\f\4QUERY_STRINGid=1\16\4REQUEST_METHODPOST... Ґஔ ਐʣ
༰ aG Ωʔ a 26&3:@453*/( ΩʔʢόΠτʣ JE ʢόΠτʣ ,FZ7BMVFܗࣜ -
D .BTBTIJ4IJOCBSB!TIJOY '$(*@45%*/ϔομ read(4<socket:[248969]>, "\1\5\0\1\0\10\0\0", 8) = 8 Ґஔ
ਐʣ ༰ a 'BTU$(*όʔδϣϯ a ϨίʔυλΠϓʢ'$(*@45%*/ʣ a ϦΫΤετࣝผࢠ aa ίϯςϯπ a ύσΟϯά a ༧ʢৗʹʣ -
D .BTBTIJ4IJOCBSB!TIJOY '$(*@45%*/ྫίϯςϯπ read(4<socket:[248969]>, "name=foo", 8) = 8 w )551ϦΫΤετϘσΟ͕ೖ͍ͬͯΔ
$ curl http://localhost:8000/?id=1 -X POST -d 'name=foo' \ --trace-ascii - (snip) 0064: Content-Type: application/x-www-form-urlencoded 0095: => Send data, 8 bytes (0x8) 0000: name=foo -
D .BTBTIJ4IJOCBSB!TIJOY '$(*@45%065ϔομ write(4<socket:[248969]>, "\1\6\0\1\0s\5\0X-Powered-By: PHP/8.4.5- dev\r\nContent-type: text/html; charset=UTF-8\r\n\r\n{\"id\":\"1\", \"name\":\"foo\",\"message\":\"name=foo\"}
\0\0\0\0\0\1\3\0\1\0\10\0\0\0\0\0\0\0\10\0\0", 144) = 144 Ґஔ ਐʣ ༰ a 'BTU$(*όʔδϣϯ a ϨίʔυλΠϓʢ'$(*@45%065ʣ a ϦΫΤετࣝผࢠ aT ίϯςϯπʢTBTDJJDPEFʣ a ύσΟϯά a ༧ʢৗʹʣ -
D .BTBTIJ4IJOCBSB!TIJOY '$(*@45%065ίϯςϯπɺύσΟϯά write(4<socket:[248969]>, "\1\6\0\1\0s\5\0X-Powered-By: PHP/8.4.5- dev\r\nContent-type: text/html; charset=UTF-8\r\n\r\n{\"id\":\"1\", \"name\":\"foo\",\"message\":\"name=foo\"}
\0\0\0\0\0\1\3\0\1\0\10\0\0\0\0\0\0\0\10\0\0", 144) = 144 w ίϯςϯπόΠτʢࣈʣ w ύσΟϯάόΠτʢࣈʣ -
D .BTBTIJ4IJOCBSB!TIJOY ͜ͷ෦ʁ write(4<socket:[248969]>, "\1\6\0\1\0s\5\0X-Powered-By: PHP/8.4.5- dev\r\nContent-type: text/html; charset=UTF-8\r\n\r\n{\"id\":\"1\", \"name\":\"foo\",\"message\":\"name=foo\"}
\0\0\0\0\0\1\3\0\1\0\10\0\0\0\0\0\0\0\10\0\0", 144) = 144 -
D .BTBTIJ4IJOCBSB!TIJOY '$(*@&/%@3&26&45ϔομ write(4<socket:[248969]>, "\1\6\0\1\0s\5\0X-Powered-By: PHP/8.4.5- dev\r\nContent-type: text/html; charset=UTF-8\r\n\r\n{\"id\":\"1\", \"name\":\"foo\",\"message\":\"name=foo\"}
\0\0\0\0\0\1\3\0\1\0\10\0\0\0\0\0\0\0\10\0\0", 144) = 144 Ґஔ ਐʣ ༰ a 'BTU$(*όʔδϣϯ a ϨίʔυλΠϓʢ'$(*@&/%@3&26&45ʣ a ϦΫΤετࣝผࢠ aa ίϯςϯπ a ύσΟϯά a ༧ʢৗʹʣ -
D .BTBTIJ4IJOCBSB!TIJOY '$(*@&/%@3&26&45ίϯςϯπ write(4<socket:[248969]>, "\1\6\0\1\0s\5\0X-Powered-By: PHP/8.4.5- dev\r\nContent-type: text/html; charset=UTF-8\r\n\r\n{\"id\":\"1\", \"name\":\"foo\",\"message\":\"name=foo\"}
\0\0\0\0\0\1\3\0\1\0\10\0\0\0\0\0\0\0\10\0\0", 144) = 144 w ίϯςϯπόΠτʢࣈʣ w ͜ͷΑ͏ʹෳϨίʔυΛҰʹૹ৴ͯ͠ྑ͍ ड৴ଆ͕ύʔε͢Δ -
D .BTBTIJ4IJOCBSB!TIJOY OHJOY QIQGQN )551 4 'BTU$(* 'BTU$(*Ϩίʔυૹड৴Πϝʔδ (&5JOEFYQIQ JE
<'$(*@1"3".4> 4$3*15@'*-&/".&BQQJOEFYQIQ 26&3:@453*/(JE -
D .BTBTIJ4IJOCBSB!TIJOY OHJOY QIQGQN )551 4 'BTU$(* 'BTU$(*Ϩίʔυૹड৴Πϝʔδ (&5JOEFYQIQ JE
<'$(*@1"3".4> 4$3*15@'*-&/".&BQQJOEFYQIQ 26&3:@453*/(JE BQQJOEFYQIQ࣮ߦ @(&5<JE> -
D .BTBTIJ4IJOCBSB!TIJOY OHJOY QIQGQN )551 4 'BTU$(* 'BTU$(*Ϩίʔυૹड৴Πϝʔδ (&5JOEFYQIQ JE
BQQJOEFYQIQ࣮ߦ @(&5<JE> <'$(*@45%065> )FMMP <'$(*@1"3".4> 4$3*15@'*-&/".&BQQJOEFYQIQ 26&3:@453*/(JE -
D .BTBTIJ4IJOCBSB!TIJOY OHJOY QIQGQN )551 4 'BTU$(* 'BTU$(*Ϩίʔυૹड৴Πϝʔδ (&5JOEFYQIQ JE
BQQJOEFYQIQ࣮ߦ @(&5<JE> )5510, )FMMP <'$(*@45%065> )FMMP <'$(*@1"3".4> 4$3*15@'*-&/".&BQQJOEFYQIQ 26&3:@453*/(JE -
D .BTBTIJ4IJOCBSB!TIJOY ϦΫΤετॲཧϧʔϓ w ϦΫΤετଓ w ϦΫΤετ։࢝ॲཧ w 1)1ίʔυ࣮ߦ w
ϦΫΤετऴྃॲཧ w ϦΫΤετଓʹΔʣ -
while (EXPECTED(fcgi_accept_request(request) >= 0)) { init_request_info(); php_request_startup(); php_execute_script(&file_handle); php_request_shutdown((void *)
0); /* end of fastcgi loop */ } GQNGQNGQN@NBJODϦΫΤετॲཧϧʔϓʢͬ͘͟ΓΠϝʔδʣ -
while (EXPECTED(fcgi_accept_request(request) >= 0)) { init_request_info(); php_request_startup(); php_execute_script(&file_handle); php_request_shutdown((void *)
0); /* end of fastcgi loop */ } GQNGQNGQN@NBJODϦΫΤετॲཧϧʔϓʢͬ͘͟ΓΠϝʔδʣ ଓʢ௨ৗ͜ͷதͰͪʣ -
while (EXPECTED(fcgi_accept_request(request) >= 0)) { init_request_info(); php_request_startup(); php_execute_script(&file_handle); php_request_shutdown((void *)
0); /* end of fastcgi loop */ } GQNGQNGQN@NBJODϦΫΤετॲཧϧʔϓʢͬ͘͟ΓΠϝʔδʣ '$(*@1"3".4ड৴ -
while (EXPECTED(fcgi_accept_request(request) >= 0)) { init_request_info(); php_request_startup(); php_execute_script(&file_handle); php_request_shutdown((void *)
0); /* end of fastcgi loop */ } GQNGQNGQN@NBJODϦΫΤετॲཧϧʔϓʢͬ͘͟ΓΠϝʔδʣ ϦΫΤετ։࢝ॲཧ '$(*@45%*/ड৴ -
while (EXPECTED(fcgi_accept_request(request) >= 0)) { init_request_info(); php_request_startup(); php_execute_script(&file_handle); php_request_shutdown((void *)
0); /* end of fastcgi loop */ } GQNGQNGQN@NBJODϦΫΤετॲཧϧʔϓʢͬ͘͟ΓΠϝʔδʣ 1)1ϑΝΠϧ࣮ߦ -
while (EXPECTED(fcgi_accept_request(request) >= 0)) { init_request_info(); php_request_startup(); php_execute_script(&file_handle); php_request_shutdown((void *)
0); /* end of fastcgi loop */ } GQNGQNGQN@NBJODϦΫΤετॲཧϧʔϓʢͬ͘͟ΓΠϝʔδʣ '$(*@45%065ૹ৴ ϦΫΤετऴྃॲཧ -
D .BTBTIJ4IJOCBSB!TIJOY EFNPHECσόοά࣮ߦ w '$(*@1"3".4ʢϦΫΤετʣड৴ 4$3*15@'*-&/".&1)1εΫϦϓτϑΝΠϧύεऔಘ 26&3:@453*/(@(&5ʹ֨ೲ w 1)1ϑΝΠϧ࣮ߦ FDIP
w '$(*@45%065ʢϨεϙϯεʣૹ৴ GDHJ@XSJUF GDHJ@ fl VTI -
ଓͪ NBJOGBTUDHJDGDHJ@BDDFQU@SFRVFTU GDHJ@SFRVFTU SFR int listen_socket = req->listen_socket; sa_t sa;
socklen_t len = sizeof(sa); req->fd = accept(listen_socket, (struct sockaddr *)&sa, &len); BDDFQUͰଓͪ ʢϦΫΤετ͕ແ͚Ε͜͜Ͱͭʣ ଓͨ͠ΒࣝผࢠΛฦ͢ -
if (safe_read(req, &hdr, sizeof(fcgi_header)) != sizeof(fcgi_header) || hdr.version < FCGI_VERSION_1)
{ return 0; } len = (hdr.contentLengthB1 << 8) | hdr.contentLengthB0; padding = hdr.paddingLength; '$(*@1"3".4ϔομड৴ NBJOGBTUDHJDGDHJ@SFBE@SFRVFTU GDHJ@SFRVFTU SFR -
if (safe_read(req, &hdr, sizeof(fcgi_header)) != sizeof(fcgi_header) || hdr.version < FCGI_VERSION_1)
{ return 0; } len = (hdr.contentLengthB1 << 8) | hdr.contentLengthB0; padding = hdr.paddingLength; '$(*@1"3".4ϔομड৴ NBJOGBTUDHJDGDHJ@SFBE@SFRVFTU GDHJ@SFRVFTU SFR TBGF@SFBE Ͱड৴σʔλΛIESʹಡࠐ IESGDHJ@IFBEFSߏମ -
if (safe_read(req, &hdr, sizeof(fcgi_header)) != sizeof(fcgi_header) || hdr.version < FCGI_VERSION_1)
{ return 0; } len = (hdr.contentLengthB1 << 8) | hdr.contentLengthB0; padding = hdr.paddingLength; '$(*@1"3".4ϔομड৴ NBJOGBTUDHJDGDHJ@SFBE@SFRVFTU GDHJ@SFRVFTU SFR σʔλαΠζͱ'BTU$(*όʔδϣϯΛνΣοΫ -
if (safe_read(req, &hdr, sizeof(fcgi_header)) != sizeof(fcgi_header) || hdr.version < FCGI_VERSION_1)
{ return 0; } len = (hdr.contentLengthB1 << 8) | hdr.contentLengthB0; padding = hdr.paddingLength; '$(*@1"3".4ϔομड৴ NBJOGBTUDHJDGDHJ@SFBE@SFRVFTU GDHJ@SFRVFTU SFR ίϯςϯπͱύσΟϯάΛܭࢉ -
while (hdr.type == FCGI_PARAMS && len > 0) { if
(len + padding > FCGI_MAX_LENGTH) { return 0; } if (safe_read(req, buf, len+padding) != len+padding) { req->keep = 0; return 0; } if (!fcgi_get_params(req, buf, buf+len)) { req->keep = 0; return 0; } // ϔομಡΈࠐΈʢུʣ } '$(*@1"3".4ίϯςϯπड৴ NBJOGBTUDHJDGDHJ@SFBE@SFRVFTU GDHJ@SFRVFTU SFR -
while (hdr.type == FCGI_PARAMS && len > 0) { if
(len + padding > FCGI_MAX_LENGTH) { return 0; } if (safe_read(req, buf, len+padding) != len+padding) { req->keep = 0; return 0; } if (!fcgi_get_params(req, buf, buf+len)) { req->keep = 0; return 0; } // ϔομಡΈࠐΈʢུʣ } '$(*@1"3".4ίϯςϯπड৴ NBJOGBTUDHJDGDHJ@SFBE@SFRVFTU GDHJ@SFRVFTU SFR ϨίʔυλΠϓఆ -
while (hdr.type == FCGI_PARAMS && len > 0) { if
(len + padding > FCGI_MAX_LENGTH) { return 0; } if (safe_read(req, buf, len+padding) != len+padding) { req->keep = 0; return 0; } if (!fcgi_get_params(req, buf, buf+len)) { req->keep = 0; return 0; } // ϔομಡΈࠐΈʢུʣ } '$(*@1"3".4ίϯςϯπड৴ NBJOGBTUDHJDGDHJ@SFBE@SFRVFTU GDHJ@SFRVFTU SFR CVGʹίϯςϯπ ύσΟϯάಡࠐ -
while (hdr.type == FCGI_PARAMS && len > 0) { if
(len + padding > FCGI_MAX_LENGTH) { return 0; } if (safe_read(req, buf, len+padding) != len+padding) { req->keep = 0; return 0; } if (!fcgi_get_params(req, buf, buf+len)) { req->keep = 0; return 0; } // ϔομಡΈࠐΈʢུʣ } '$(*@1"3".4ίϯςϯπड৴ NBJOGBTUDHJDGDHJ@SFBE@SFRVFTU GDHJ@SFRVFTU SFR ಡࠐσʔλΛύʔεͯ͠ SFRFOWʢϋογϡςʔϒϧʣʹ֨ೲ -
D .BTBTIJ4IJOCBSB!TIJOY '$(*@1"3".4ϦΫΤετใߏମ \17\16SCRIPT_FILENAME/app/index.php\f\4QUERY_STRINGid=1 [ 'SCRIPT_FILENAME' => '/app/index.php', // PHP
ϑΝΠϧύε 'QUERY_STRING' => 'id=1', // $_GET ] w '$(*@1"3".4 w SFRFOWʢϋογϡςʔϒϧٙࣅදݱʣ -
࣮ߦ1)1ϑΝΠϧύεͷܾఆ GQNGQNNBJODJOJU@SFRVFTU@JOGP fcgi_request *request = (fcgi_request*) SG(server_context); char *env_script_filename =
FCGI_GETENV(request, "SCRIPT_FILENAME"); // (snip) char *script_path_translated = env_script_filename; // (snip) if (is_valid_path(script_path_translated)) { SG(request_info).path_translated = estrdup(script_path_translated); } -
࣮ߦ1)1ϑΝΠϧύεͷܾఆ GQNGQNNBJODJOJU@SFRVFTU@JOGP fcgi_request *request = (fcgi_request*) SG(server_context); char *env_script_filename =
FCGI_GETENV(request, "SCRIPT_FILENAME"); // (snip) char *script_path_translated = env_script_filename; // (snip) if (is_valid_path(script_path_translated)) { SG(request_info).path_translated = estrdup(script_path_translated); } 4$3*15@'*-&/".&Λ࣮ߦϑΝΠϧީิͱͯ֨͠ೲ -
࣮ߦ1)1ϑΝΠϧύεͷܾఆ GQNGQNNBJODJOJU@SFRVFTU@JOGP fcgi_request *request = (fcgi_request*) SG(server_context); char *env_script_filename =
FCGI_GETENV(request, "SCRIPT_FILENAME"); // (snip) char *script_path_translated = env_script_filename; // (snip) if (is_valid_path(script_path_translated)) { SG(request_info).path_translated = estrdup(script_path_translated); } ࣮ߦϑΝΠϧύεީิΛݕূͯ͠WBMJEͳΒ֨ೲ -
D .BTBTIJ4IJOCBSB!TIJOY εʔύʔάϩʔόϧมͷ֨ೲ w εʔύʔάϩʔόϧม&( TZNCPM@UBCMF ʹ͋Δ &( TZNCPM@UBCMF FYFDVUFS@HMPCBMTTZNCPM@UBCMF
w &( TZNCPM@UBCMF 1)1άϩʔόϧมςʔϒϧ ϋογϡςʔϒϧʢΩʔม໊ɺมʣ w @(&5ͷ࣮ମ&( TZNCPM@UBCMF <@(&5> -
&( TZNCPM@UBCMF ྫ QSJOU@IUFYFDVUPS@HMPCBMTTZNCPM@UBCMF )BTI <YBBBBCCF>\ <>@(&5<Y ffff
BCFF> SFGDPVOU BSSBZ <>@1045<Y ff ff BCFF> SFGDPVOU BSSBZ <>@$00,*&<Y ff ff BCFF> SFGDPVOU BSSBZ <>@'*-&4<Y ff ff BCFF> SFGDPVOU BSSBZ <>JE<Y ffff BCFF>JOEJSFDU<Y ff ff BCF> SFGDPVOU TUSJOH ^ -
&( TZNCPM@UBCMF <@(&5>ྫ QSJOU[WY ff ff BCFF <Y ff ff
BCFF> SFGDPVOU BSSBZ)BTI <Y ffff BCFB>\ <>JE<Y ff ff BCFCD> SFGDPVOU TUSJOH ^ -
if (PG(variables_order) && (strchr(PG(variables_order),'G') || strchr(PG(variables_order),'g'))) { sapi_module.treat_data(PARSE_GET, NULL, NULL);
} else { zval_ptr_dtor_nogc(&PG(http_globals)[TRACK_VARS_GET]); array_init(&PG(http_globals)[TRACK_VARS_GET]); } zend_hash_update(&EG(symbol_table), name , &PG(http_globals)[TRACK_VARS_GET]); 26&3:@453*/(Λύʔεͯ͠@(&5ʹ֨ೲ NBJOQIQ@WBSJBCMFTDQIQ@BVUP@HMPCBMT@DSFBUF@HFU [FOE@TUSJOH OBNF -
if (PG(variables_order) && (strchr(PG(variables_order),'G') || strchr(PG(variables_order),'g'))) { sapi_module.treat_data(PARSE_GET, NULL, NULL);
} else { zval_ptr_dtor_nogc(&PG(http_globals)[TRACK_VARS_GET]); array_init(&PG(http_globals)[TRACK_VARS_GET]); } zend_hash_update(&EG(symbol_table), name , &PG(http_globals)[TRACK_VARS_GET]); 26&3:@453*/(Λύʔεͯ͠@(&5ʹ֨ೲ NBJOQIQ@WBSJBCMFTDQIQ@BVUP@HMPCBMT@DSFBUF@HFU [FOE@TUSJOH OBNF QIQJOJͷWBSJBCMFT@PSEFSνΣοΫ (PSH͕͋ΕɺUSFBU@EBUB Λ࣮ߦ -
if (PG(variables_order) && (strchr(PG(variables_order),'G') || strchr(PG(variables_order),'g'))) { sapi_module.treat_data(PARSE_GET, NULL, NULL);
} else { zval_ptr_dtor_nogc(&PG(http_globals)[TRACK_VARS_GET]); array_init(&PG(http_globals)[TRACK_VARS_GET]); } zend_hash_update(&EG(symbol_table), name , &PG(http_globals)[TRACK_VARS_GET]); 26&3:@453*/(Λύʔεͯ͠@(&5ʹ֨ೲ NBJOQIQ@WBSJBCMFTDQIQ@BVUP@HMPCBMT@DSFBUF@HFU [FOE@TUSJOH OBNF 26&3:@453*/(Λύʔεͯ͠ϋογϡςʔϒϧʹ֨ೲ -
if (PG(variables_order) && (strchr(PG(variables_order),'G') || strchr(PG(variables_order),'g'))) { sapi_module.treat_data(PARSE_GET, NULL, NULL);
} else { zval_ptr_dtor_nogc(&PG(http_globals)[TRACK_VARS_GET]); array_init(&PG(http_globals)[TRACK_VARS_GET]); } zend_hash_update(&EG(symbol_table), name , &PG(http_globals)[TRACK_VARS_GET]); 26&3:@453*/(Λύʔεͯ͠@(&5ʹ֨ೲ NBJOQIQ@WBSJBCMFTDQIQ@BVUP@HMPCBMT@DSFBUF@HFU [FOE@TUSJOH OBNF ੜͨ͠ϋογϡςʔϒϧΛ&( TZNCPM@UBCMF <@(&5>@(&5ʹηοτ -
ࢀߟεʔύʔάϩʔόϧมॲཧϋϯυϥ NBJOQIQ@WBSJBCMFTDQIQ@TUBSUVQ@BVUP@HMPCBMT zend_register_auto_global(zend_string_init_interned("_GET", sizeof("_GET")-1, 1), 0, php_auto_globals_create_get); zend_register_auto_global(zend_string_init_interned("_POST", sizeof("_POST")-1, 1),
0, php_auto_globals_create_post); zend_register_auto_global(zend_string_init_interned("_COOKIE", sizeof("_COOKIE")-1, 1), 0, php_auto_globals_create_cookie); // (snip) εʔύʔάϩʔόϧม͝ͱʹϋϯυϥ͕͋Δ -
1)1ίʔυͷ࣮ߦ ;FOE[FOED[FOE@FYFDVUF@TDSJQU zend_op_array *op_array = zend_compile_file(file_handle, type); if (file_handle->opened_path) {
zend_hash_add_empty_element(&EG(included_files), file_handle->opened_path); } zend_result ret = SUCCESS; if (op_array) { zend_execute(op_array, retval); -
1)1ίʔυͷ࣮ߦ ;FOE[FOED[FOE@FYFDVUF@TDSJQU zend_op_array *op_array = zend_compile_file(file_handle, type); if (file_handle->opened_path) {
zend_hash_add_empty_element(&EG(included_files), file_handle->opened_path); } zend_result ret = SUCCESS; if (op_array) { zend_execute(op_array, retval); 1)1ϑΝΠϧΛίϯύΠϧ ੜ͞ΕͨΦϖίʔυྻΛฦ͢ -
1)1ίʔυͷ࣮ߦ ;FOE[FOED[FOE@FYFDVUF@TDSJQU zend_op_array *op_array = zend_compile_file(file_handle, type); if (file_handle->opened_path) {
zend_hash_add_empty_element(&EG(included_files), file_handle->opened_path); } zend_result ret = SUCCESS; if (op_array) { zend_execute(op_array, retval); JODMVEFE@ fi MFTʹύεΛՃ HFU@JODMVEFE@ fi MFT Ͱฦ͢ͷ͜ͷ -
1)1ίʔυͷ࣮ߦ ;FOE[FOED[FOE@FYFDVUF@TDSJQU zend_op_array *op_array = zend_compile_file(file_handle, type); if (file_handle->opened_path) {
zend_hash_add_empty_element(&EG(included_files), file_handle->opened_path); } zend_result ret = SUCCESS; if (op_array) { zend_execute(op_array, retval); ੜͨ͠ΦϖίʔυΛ࣮ߦ -
fcgi_request *request = (fcgi_request*) SG(server_context); ret = fcgi_write(request, FCGI_STDOUT, str,
str_length); FDIPͳͲͷग़ྗ GQNGQNGQN@NBJODTBQJ@DHJCJO@TJOHMF@XSJUF DPOTUDIBS TUS VJOU@UTUS@MFOHUI '$(*@45%065ϨίʔυΛੜͯ͠ɺ ϦΫΤετߏମόοϑΝʹه ҾTUSग़ྗ -
όοϑΝྫ >>> p req->out_buf $5 = "\001\006\000\001\000d\004\000X-Powered-By: PHP/8.4.5- dev\r\nContent-type: text/html;
charset=UTF-8\r\n\r\n{\"id\": \"1\",\"message\":\"Hello!\"}\000\000\000\000 '$(*@45%065ϨίʔυܗࣜͰόοϑΝʹه ʢϔομɺίϯςϯπɺύσΟϯάʣ -
όοϑΝྫ >>> p req->out_buf $5 = "\001\006\000\001\000d\004\000X-Powered-By: PHP/8.4.5- dev\r\nContent-type: text/html;
charset=UTF-8\r\n\r\n{\"id\": \"1\",\"message\":\"Hello!\"}\000\000\000\000 '$(*@45%065ϨίʔυܗࣜͰόοϑΝʹه ʢϔομɺίϯςϯπɺύσΟϯάʣ -
if (end) { // (snip) fcgi_make_header(&rec->hdr, FCGI_END_REQUEST, req->id, sizeof(fcgi_end_request)); //
(snip) } if (safe_write(req, req->out_buf, len) != len) { req->keep = 0; req->out_pos = req->out_buf; return 0; } όοϑΝͷ༰Λૹ৴ NBJOGBTUDHJDGDHJ@GMVTI GDHJ@SFRVFTU SFR JOUFOE -
if (end) { // (snip) fcgi_make_header(&rec->hdr, FCGI_END_REQUEST, req->id, sizeof(fcgi_end_request)); //
(snip) } if (safe_write(req, req->out_buf, len) != len) { req->keep = 0; req->out_pos = req->out_buf; return 0; } όοϑΝͷ༰Λૹ৴ NBJOGBTUDHJDGDHJ@GMVTI GDHJ@SFRVFTU SFR JOUFOE ࠷ޙͷݺͼग़͠ʢϦΫΤετऴྃॲཧ࣌ʣͳΒɺ '$(*@&/%@3&26&45ΛՃ -
if (end) { // (snip) fcgi_make_header(&rec->hdr, FCGI_END_REQUEST, req->id, sizeof(fcgi_end_request)); //
(snip) } if (safe_write(req, req->out_buf, len) != len) { req->keep = 0; req->out_pos = req->out_buf; return 0; } όοϑΝͷ༰Λૹ৴ NBJOGBTUDHJDGDHJ@GMVTI GDHJ@SFRVFTU SFR JOUFOE όοϑΝʢSFRPVU@CVGʣΛૹ৴ -
D .BTBTIJ4IJOCBSB!TIJOY TIJOYHECQIQ w QIQTSDϏϧυ HECʹΑΔσόοάͰ͖Δڥ EPDLFSDPNQPTF w FOWͰର1)1όʔδϣϯϏϧυΦϓγϣϯΛࢦఆ w
HECTUSBDFͳͲͷπʔϧΛแ IUUQTHJUIVCDPNTIJOYHECQIQ -
D .BTBTIJ4IJOCBSB!TIJOY QIQGQNϦΫΤετॲཧΛσόοΨͰ͏ # php-src ΛϏϧυ $ make # Ϗϧυͨ͠
php-fpm ىಈ $ make up # php-fpm ϫʔΧʔϓϩηεʹΞλον $ make gdb-php-fpm-worker gdb> b fcgi_read_request # ϒϨʔΫϙΠϯτઃఆ gdb> c # ॲཧ࠶։ -
D .BTBTIJ4IJOCBSB!TIJOY QIQGQNϦΫΤετॲཧΛσόοΨͰ͏ $ curl http://localhost:8000/?id=1 w ผλʔϛφϧ͔ΒDVSMͰϦΫΤετૹ৴ w HECλʔϛφϧͰϒϨʔΫϙΠϯτͰఀࢭ
gdb> w O TUFQPWFS T TUFQJO ίϚϯυͳͲͰ࣮ߦ͍ͯ͘͠ -
D .BTBTIJ4IJOCBSB!TIJOY ओͳHECίϚϯυ ίϚϯυ ༰ CSFBL C ϒϨʔΫϙΠϯτΛઃఆʢ໊ؔɺϑΝΠϧ໊ߦ൪߸ʣ C QD
ϓϩάϥϜΧϯλͷҐஔʹϒϨʔΫϙΠϯτΛઃఆ DPOUJOVF D ॲཧΛ࠶։ OFYU O εςοϓΦʔόʔ TUFQ T εςοϓΠϯ fi OJTI fi O ݱࡏͷ͕ؔऴྃ͢Δ·ͰॲཧΛ࣮ߦ QSJOU Q มPSΞυϨε มϝϞϦΞυϨεͷΛදࣔ Y/TมPSΞυϨε /όΠτΛจࣈྻͱͯ͠දࣔ XIFSF ݱࡏͷ࣮ߦҐஔΛදࣔ MJTU ݱࡏͷ࣮ߦҐஔલޙͷίʔυΛදࣔ R σόοΨऴྃ -
D .BTBTIJ4IJOCBSB!TIJOY ओͳHECίϚϯυQIQTSD ίϚϯυ ༰ QSJOU[W [WBM ͷ༰Λදࣔ QSJOU@HMPCBM@WBST άϩʔόϧมΛදࣔ
QSJOU@IU )BTI5BCMF ͷ༰Λදࣔ QSJOU@[TUS [FOE@TUSJOH ͷ༰Λදࣔ [CBDLTUSBDF 1)1ίʔυϨϕϧͷελοΫτϨʔεΛදࣔ QIQTSDͷHECJOJUʹఆٛ͞Ε͍ͯΔ