Upgrade to Pro — share decks privately, control downloads, hide ads and more …

php-fpm がリクエスト処理する仕組みを追う / Tracing-How-php-fpm-...

shin1x1
March 24, 2025

php-fpm がリクエスト処理する仕組みを追う / Tracing-How-php-fpm-Handles-Requests

2025-03-23 PHPerKaigi 2025

shin1x1

March 24, 2025
Tweet

More Decks by shin1x1

Other Decks in Programming

Transcript

  1. 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
  2. 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"}
  3. 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
  4. 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͔ΒͷϦΫΤετ઀ଓ
  5. 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$(*ड৴ʢϦΫΤετʣ
  6. 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$(*ૹ৴ʢϨεϙϯεʣ
  7. D .BTBTIJ4IJOCBSB!TIJOY 'BTU$(*ϓϩτίϧϔομ Ґஔ όΠτ਺ ಺༰   'BTU$(*όʔδϣϯʢ௨ৗ͸ʣ 

     ϨίʔυλΠϓ   ϦΫΤετࣝผࢠ   ίϯςϯπ௕   ύσΟϯά௕   ༧໿ʢৗʹʣ όΠτݻఆ௕
  8. 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͸όΠφϦΛਐ਺දݱͰग़ྗʢΦϓγϣϯʹΑΔʣ
  9. 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ܗࣜ
  10. 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  ༧໿ʢৗʹʣ
  11. 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
  12. 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  ༧໿ʢৗʹʣ
  13. 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  ༧໿ʢৗʹʣ
  14. 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 ͜ͷΑ͏ʹෳ਺ϨίʔυΛҰ౓ʹૹ৴ͯ͠΋ྑ͍ ड৴ଆ͕ύʔε͢Δ
  15. 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>
  16. 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
  17. 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
  18. 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ϦΫΤετॲཧϧʔϓʢͬ͘͟ΓΠϝʔδʣ ઀ଓʢ௨ৗ͸͜ͷதͰ଴ͪʣ
  19. 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ड৴
  20. 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%*/ड৴
  21. 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ϑΝΠϧ࣮ߦ
  22. 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ૹ৴ ϦΫΤετऴྃॲཧ
  23. ઀ଓ଴ͪ 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Ͱ઀ଓ଴ͪ ʢϦΫΤετ͕ແ͚Ε͹͜͜Ͱ଴ͭʣ ઀ଓͨ͠ΒࣝผࢠΛฦ͢
  24. 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
  25. 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ʹಡࠐ IES͸GDHJ@IFBEFSߏ଄ମ
  26. 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$(*όʔδϣϯΛνΣοΫ
  27. 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 ίϯςϯπ௕ͱύσΟϯά௕Λܭࢉ
  28. 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
  29. 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 ϨίʔυλΠϓ൑ఆ
  30. 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ʹίϯςϯπ ύσΟϯάಡࠐ
  31. 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ʢϋογϡςʔϒϧʣʹ֨ೲ
  32. ࣮ߦ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); }
  33. ࣮ߦ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@'*-&/".&Λ࣮ߦϑΝΠϧީิͱͯ֨͠ೲ
  34. ࣮ߦ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ͳΒ֨ೲ
  35. D .BTBTIJ4IJOCBSB!TIJOY εʔύʔάϩʔόϧม਺΁ͷ֨ೲ w εʔύʔάϩʔόϧม਺͸&( TZNCPM@UBCMF ʹ͋Δ &( TZNCPM@UBCMF FYFDVUFS@HMPCBMTTZNCPM@UBCMF

    w &( TZNCPM@UBCMF ͸1)1άϩʔόϧม਺ςʔϒϧ ϋογϡςʔϒϧʢΩʔม਺໊ɺ஋ม਺஋ʣ w @(&5ͷ࣮ମ͸&( TZNCPM@UBCMF <@(&5>
  36. &( 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 ^
  37. &( 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 ^
  38. 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
  39. 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 Λ࣮ߦ
  40. 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*/(Λύʔεͯ͠ϋογϡςʔϒϧʹ֨ೲ
  41. 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ʹηοτ
  42. ࢀߟεʔύʔάϩʔόϧม਺ॲཧϋϯυϥ 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) εʔύʔάϩʔόϧม਺͝ͱʹϋϯυϥ͕͋Δ
  43. 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);
  44. 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ϑΝΠϧΛίϯύΠϧ ੜ੒͞ΕͨΦϖίʔυྻΛฦ͢
  45. 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 Ͱฦ͢ͷ͸͜ͷ஋
  46. 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); ੜ੒ͨ͠ΦϖίʔυΛ࣮ߦ
  47. 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ग़ྗ஋
  48. όοϑΝྫ >>> 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ϨίʔυܗࣜͰόοϑΝʹه࿥ ʢϔομɺίϯςϯπɺύσΟϯάʣ
  49. όοϑΝྫ >>> 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ϨίʔυܗࣜͰόοϑΝʹه࿥ ʢϔομɺίϯςϯπɺύσΟϯάʣ
  50. 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
  51. 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Λ௥Ճ
  52. 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ʣΛૹ৴
  53. 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 # ॲཧ࠶։
  54. 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 σόοΨऴྃ
  55. D .BTBTIJ4IJOCBSB!TIJOY ओͳHECίϚϯυQIQTSD ίϚϯυ ಺༰ QSJOU[W [WBM ͷ಺༰Λදࣔ QSJOU@HMPCBM@WBST άϩʔόϧม਺Λදࣔ

    QSJOU@IU )BTI5BCMF ͷ಺༰Λදࣔ QSJOU@[TUS [FOE@TUSJOH ͷ಺༰Λදࣔ [CBDLTUSBDF 1)1ίʔυϨϕϧͷελοΫτϨʔεΛදࣔ QIQTSDͷHECJOJUʹఆٛ͞Ε͍ͯΔ