Slide 1

Slide 1 text

1)1FS,BJHJ !TIJOY QIQGQN͕ϦΫΤετॲཧ͢Δ࢓૊ΈΛ௥͏

Slide 2

Slide 2 text

D .BTBTIJ4IJOCBSB!TIJOY !TIJOY ৽ݪʢ͠Μ͹Βʣխ࢘ େࡕͰ8FCγεςϜ։ൃ΍ٕज़αϙʔτΛߦ͍ͬͯ·͢ wCMPH IUUQTCMPHTIJOYDPN w1PEDBTU1)1ͷݱ৔ IUUQTQIQHFOCBTIJOYDPN

Slide 3

Slide 3 text

D .BTBTIJ4IJOCBSB!TIJOY ͸͡Ίʹ 👉͜ͷࢿྉ͸ެ։͠·͢ 👉࢓૊ΈΛ஌Δͷ͸໘ന͍ʂΛ఻͍͑ͨ ෼͔Βͳ͍ͱ͜Ζ͸εϧʔͰ0, 👉ײ૝ɺϑΟʔυόοΫ͓଴͍ͪͯ͠·͢ʂ QIQFSLBJHJPSGPSUFFϑΟʔυόοΫϖʔδ ͸͡Ίʹ

Slide 4

Slide 4 text

D .BTBTIJ4IJOCBSB!TIJOY "HFOEB w QIQGQNͱ͸ w 'BTU$(*ͱ͸ w QIQGQNϦΫΤετॲཧΛσόοΨͰ௥͏

Slide 5

Slide 5 text

D .BTBTIJ4IJOCBSB!TIJOY QIQGQNͱ͸

Slide 6

Slide 6 text

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αʔόͱ࿈ܞ

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

D .BTBTIJ4IJOCBSB!TIJOY 'BTU$(*ͱ͸

Slide 9

Slide 9 text

D .BTBTIJ4IJOCBSB!TIJOY 'BTU$(* w 8FCαʔόͱΞϓϦέʔγϣϯͷ࿈ܞϓϩτίϧ w $(*վྑ൛ $(*ϦΫΤετͷ౓ʹϓϩηεੜ੒ͯ͠ॲཧ 'BTU$(*Ӭଓతͳϓϩηε͕ϦΫΤετΛॲཧ w 6OJYυϝΠϯιέοτɺ5$1Ͱιέοτ௨৴

Slide 10

Slide 10 text

D .BTBTIJ4IJOCBSB!TIJOY 'BTU$(*௨৴ϓϩτίϧ w όΠφϦܗࣜ w 'BTU$(*Ϩίʔυ୯ҐͰૹड৴ w ϨίʔυλΠϓʹΑͬͯ௨৴಺༰͕ҟͳΔ

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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,

Slide 13

Slide 13 text

D .BTBTIJ4IJOCBSB!TIJOY αϯϓϧ1)1ίʔυ $id, 'name' => $name, 'message' => $message, ]); $ curl http://localhost:8000/?id=1 -X POST -d 'name=foo' {"id":"1","name":"foo","message":"name=foo"}

Slide 14

Slide 14 text

D .BTBTIJ4IJOCBSB!TIJOY EFNPTUSBDFग़ྗྫ accept(9, {sa_family=AF_INET, sin_port=htons(46404)... read(4, "\1\1\0\1\0\10\0\0", 8) = 8 read(4, "\0\1\0\0\0\0\0\0", 8) = 8 read(4, "\1\4\0\1\2G\1\0", 8) = 8 read(4, "\17\16SCRIPT_FILENAME/app/ index.php\f\4QUERY_STRINGid=1\16\4REQUEST_METHODPOST... read(4, "\1\5\0\1\0\10\0\0", 8) = 8 read(4, "name=foo", 8) = 8 write(4, "\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

Slide 15

Slide 15 text

D .BTBTIJ4IJOCBSB!TIJOY EFNPTUSBDFग़ྗྫ accept(9, {sa_family=AF_INET, sin_port=htons(46404)... read(4, "\1\1\0\1\0\10\0\0", 8) = 8 read(4, "\0\1\0\0\0\0\0\0", 8) = 8 read(4, "\1\4\0\1\2G\1\0", 8) = 8 read(4, "\17\16SCRIPT_FILENAME/app/ index.php\f\4QUERY_STRINGid=1\16\4REQUEST_METHODPOST... read(4, "\1\5\0\1\0\10\0\0", 8) = 8 read(4, "name=foo", 8) = 8 write(4, "\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͔ΒͷϦΫΤετ઀ଓ

Slide 16

Slide 16 text

D .BTBTIJ4IJOCBSB!TIJOY EFNPTUSBDFग़ྗྫ accept(9, {sa_family=AF_INET, sin_port=htons(46404)... read(4, "\1\1\0\1\0\10\0\0", 8) = 8 read(4, "\0\1\0\0\0\0\0\0", 8) = 8 read(4, "\1\4\0\1\2G\1\0", 8) = 8 read(4, "\17\16SCRIPT_FILENAME/app/ index.php\f\4QUERY_STRINGid=1\16\4REQUEST_METHODPOST... read(4, "\1\5\0\1\0\10\0\0", 8) = 8 read(4, "name=foo", 8) = 8 write(4, "\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$(*ड৴ʢϦΫΤετʣ

Slide 17

Slide 17 text

D .BTBTIJ4IJOCBSB!TIJOY EFNPTUSBDFग़ྗྫ accept(9, {sa_family=AF_INET, sin_port=htons(46404)... read(4, "\1\1\0\1\0\10\0\0", 8) = 8 read(4, "\0\1\0\0\0\0\0\0", 8) = 8 read(4, "\1\4\0\1\2G\1\0", 8) = 8 read(4, "\17\16SCRIPT_FILENAME/app/ index.php\f\4QUERY_STRINGid=1\16\4REQUEST_METHODPOST... read(4, "\1\5\0\1\0\10\0\0", 8) = 8 read(4, "name=foo", 8) = 8 write(4, "\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$(*ૹ৴ʢϨεϙϯεʣ

Slide 18

Slide 18 text

D .BTBTIJ4IJOCBSB!TIJOY 'BTU$(*Ϩίʔυ w ϔομόΠτݻఆ w ίϯςϯπՄม௕ʢϔομͰࢦఆʣ w ύσΟϯάՄม௕ʢϔομͰࢦఆʣ

Slide 19

Slide 19 text

D .BTBTIJ4IJOCBSB!TIJOY 'BTU$(*ϓϩτίϧϔομ Ґஔ όΠτ਺ ಺༰ 'BTU$(*όʔδϣϯʢ௨ৗ͸ʣ ϨίʔυλΠϓ ϦΫΤετࣝผࢠ ίϯςϯπ௕ ύσΟϯά௕ ༧໿ʢৗʹʣ όΠτݻఆ௕

Slide 20

Slide 20 text

D .BTBTIJ4IJOCBSB!TIJOY '$(*@1"3".4OHJOYQIQGQN w )551ϦΫετ΍؀ڥม਺ͳͲΛૹ৴ ϦΫΤετϝιου΍ϦΫΤετύεɺΫΤϦετϦϯάͳͲ w ,FZ7BMVFܗࣜ w 1)1࣮ߦϑΝΠϧύε΍@(&5ɺ@4&37&3౳Ͱར༻

Slide 21

Slide 21 text

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͸όΠφϦΛਐ਺දݱͰग़ྗʢΦϓγϣϯʹΑΔʣ

Slide 22

Slide 22 text

D .BTBTIJ4IJOCBSB!TIJOY '$(*@1"3".4ίϯςϯπ read(4, "\17\16SCRIPT_FILENAME/app/ index.php\f\4QUERY_STRINGid=1\16\4REQUEST_METHODPOST... Ґஔ ஋ ஋ ਐʣ ಺༰ a Ωʔ௕ a ஋௕ 4$3*15@'*-&/".& ΩʔʢόΠτʣ BQQJOEFYQIQ ஋ʢόΠτʣ ,FZ7BMVFܗࣜ

Slide 23

Slide 23 text

D .BTBTIJ4IJOCBSB!TIJOY '$(*@1"3".4ྫίϯςϯπ read(4, "\17\16SCRIPT_FILENAME/app/ index.php\f\4QUERY_STRINGid=1\16\4REQUEST_METHODPOST... Ґஔ ஋ ஋ ਐʣ ಺༰ aG Ωʔ௕ a ஋௕ 26&3:@453*/( ΩʔʢόΠτʣ JE ஋ʢόΠτʣ ,FZ7BMVFܗࣜ

Slide 24

Slide 24 text

D .BTBTIJ4IJOCBSB!TIJOY '$(*@45%*/OHJOYQIQGQN w )551ϦΫετϘςΟΛૹ৴ ϑΥʔϜσʔλɺΞοϓϩʔυϑΝΠϧɺ+40/ͳͲ w @1045΍@'*-&4ɺQIQJOQVU౳Ͱར༻ $POUFOU5ZQFʹΑͬͯࢀরํ๏͕ҟͳΔ

Slide 25

Slide 25 text

D .BTBTIJ4IJOCBSB!TIJOY '$(*@45%*/ϔομ read(4, "\1\5\0\1\0\10\0\0", 8) = 8 Ґஔ ஋ ஋ ਐʣ ಺༰ a 'BTU$(*όʔδϣϯ a ϨίʔυλΠϓʢ'$(*@45%*/ʣ a ϦΫΤετࣝผࢠ aa ίϯςϯπ௕ a ύσΟϯά௕ a ༧໿ʢৗʹʣ

Slide 26

Slide 26 text

D .BTBTIJ4IJOCBSB!TIJOY '$(*@45%*/ྫίϯςϯπ read(4, "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

Slide 27

Slide 27 text

D .BTBTIJ4IJOCBSB!TIJOY '$(*@45%065QIQGQNOHJOY w 1)1ίʔυ࣮ߦͷग़ྗʢϨεϙϯεʣΛૹ৴ FDIPɺQSJOU΍)551Ϩεϙϯεϔομग़ྗͳͲ

Slide 28

Slide 28 text

D .BTBTIJ4IJOCBSB!TIJOY '$(*@45%065ϔομ write(4, "\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 ༧໿ʢৗʹʣ

Slide 29

Slide 29 text

D .BTBTIJ4IJOCBSB!TIJOY '$(*@45%065ίϯςϯπɺύσΟϯά write(4, "\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 ύσΟϯά௕όΠτʢ྘ࣈʣ

Slide 30

Slide 30 text

D .BTBTIJ4IJOCBSB!TIJOY ͜ͷ෦෼͸ʁ write(4, "\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

Slide 31

Slide 31 text

D .BTBTIJ4IJOCBSB!TIJOY '$(*@&/%@3&26&45ϔομ write(4, "\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 ༧໿ʢৗʹʣ

Slide 32

Slide 32 text

D .BTBTIJ4IJOCBSB!TIJOY '$(*@&/%@3&26&45ίϯςϯπ write(4, "\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 ͜ͷΑ͏ʹෳ਺ϨίʔυΛҰ౓ʹૹ৴ͯ͠΋ྑ͍ ड৴ଆ͕ύʔε͢Δ

Slide 33

Slide 33 text

D .BTBTIJ4IJOCBSB!TIJOY OHJOY QIQGQN )551 4 'BTU$(* 'BTU$(*Ϩίʔυૹड৴Πϝʔδ (&5JOEFYQIQ JE

Slide 34

Slide 34 text

D .BTBTIJ4IJOCBSB!TIJOY OHJOY QIQGQN )551 4 'BTU$(* 'BTU$(*Ϩίʔυૹड৴Πϝʔδ (&5JOEFYQIQ JE <'$(*@1"3".4> 4$3*15@'*-&/".&BQQJOEFYQIQ 26&3:@453*/(JE

Slide 35

Slide 35 text

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>

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

D .BTBTIJ4IJOCBSB!TIJOY QIQGQNϦΫΤετॲཧΛσόοΨͰ௥͏

Slide 39

Slide 39 text

D .BTBTIJ4IJOCBSB!TIJOY QIQTSD w $ݴޠͰ࣮૷ w 1)1ιʔείʔυ͸(JU)VCͰެ։ w QIQGQNͳͲͷ4"1*΋ಉࠝ IUUQTHJUIVCDPNQIQQIQTSD

Slide 40

Slide 40 text

D .BTBTIJ4IJOCBSB!TIJOY ⚠ຊࢿྉͷίʔυදݱ w આ໌ͷͨΊʹίʔυΛ͔ͳΓ؆ུԽ͍ͯ͠·͢ ؾʹͳΔํ͸QIQTSDΛࢀর͍ͯͩ͘͠͞ w ϋογϡςʔϒϧදهIBTI@UBCMF<,&:> $ݴޠͰ͜ͷΑ͏ͳهड़͸Ͱ͖ͳ͍

Slide 41

Slide 41 text

D .BTBTIJ4IJOCBSB!TIJOY ϦΫΤετॲཧϧʔϓ w ϦΫΤετ઀ଓ w ϦΫΤετ։࢝ॲཧ w 1)1ίʔυ࣮ߦ w ϦΫΤετऴྃॲཧ w ϦΫΤετ઀ଓʹ໭Δʣ

Slide 42

Slide 42 text

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ϦΫΤετॲཧϧʔϓʢͬ͘͟ΓΠϝʔδʣ

Slide 43

Slide 43 text

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ϦΫΤετॲཧϧʔϓʢͬ͘͟ΓΠϝʔδʣ ઀ଓʢ௨ৗ͸͜ͷதͰ଴ͪʣ

Slide 44

Slide 44 text

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ड৴

Slide 45

Slide 45 text

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%*/ड৴

Slide 46

Slide 46 text

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ϑΝΠϧ࣮ߦ

Slide 47

Slide 47 text

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ૹ৴ ϦΫΤετऴྃॲཧ

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

઀ଓ଴ͪ NBJOGBTUDHJDGDHJ@BDDFQU@SFRVFTU GDHJ@SFRVFTUSFR int listen_socket = req->listen_socket; sa_t sa; socklen_t len = sizeof(sa); req->fd = accept(listen_socket, (struct sockaddr *)&sa, &len); BDDFQUͰ઀ଓ଴ͪ ʢϦΫΤετ͕ແ͚Ε͹͜͜Ͱ଴ͭʣ ઀ଓͨ͠ΒࣝผࢠΛฦ͢

Slide 50

Slide 50 text

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@SFRVFTUSFR

Slide 51

Slide 51 text

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@SFRVFTUSFR TBGF@SFBE Ͱड৴σʔλΛIESʹಡࠐ IES͸GDHJ@IFBEFSߏ଄ମ

Slide 52

Slide 52 text

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@SFRVFTUSFR σʔλαΠζͱ'BTU$(*όʔδϣϯΛνΣοΫ

Slide 53

Slide 53 text

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@SFRVFTUSFR ίϯςϯπ௕ͱύσΟϯά௕Λܭࢉ

Slide 54

Slide 54 text

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@SFRVFTUSFR

Slide 55

Slide 55 text

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@SFRVFTUSFR ϨίʔυλΠϓ൑ఆ

Slide 56

Slide 56 text

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@SFRVFTUSFR CVGʹίϯςϯπύσΟϯάಡࠐ

Slide 57

Slide 57 text

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@SFRVFTUSFR ಡࠐσʔλΛύʔεͯ͠ SFRFOWʢϋογϡςʔϒϧʣʹ֨ೲ

Slide 58

Slide 58 text

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ʢϋογϡςʔϒϧٙࣅදݱʣ

Slide 59

Slide 59 text

D .BTBTIJ4IJOCBSB!TIJOY ϦΫΤετ։࢝ॲཧ w ࣮ߦ1)1ϑΝΠϧύεͷܾఆ w 1)1ίʔυ࣮ߦʹඞཁͳ஋Λऔಘ εʔύʔάϩʔόϧม਺ @(&5 @4&37&3ͳͲ ΁ͷ֨ೲ w ࣮ߦ؀ڥͷηοτΞοϓ

Slide 60

Slide 60 text

࣮ߦ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); }

Slide 61

Slide 61 text

࣮ߦ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@'*-&/".&Λ࣮ߦϑΝΠϧީิͱͯ֨͠ೲ

Slide 62

Slide 62 text

࣮ߦ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ͳΒ֨ೲ

Slide 63

Slide 63 text

D .BTBTIJ4IJOCBSB!TIJOY εʔύʔάϩʔόϧม਺΁ͷ֨ೲ w εʔύʔάϩʔόϧม਺͸&( TZNCPM@UBCMF ʹ͋Δ &( TZNCPM@UBCMF FYFDVUFS@HMPCBMTTZNCPM@UBCMF w &( TZNCPM@UBCMF ͸1)1άϩʔόϧม਺ςʔϒϧ ϋογϡςʔϒϧʢΩʔม਺໊ɺ஋ม਺஋ʣ w @(&5ͷ࣮ମ͸&( TZNCPM@UBCMF <@(&5>

Slide 64

Slide 64 text

&( 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 ^

Slide 65

Slide 65 text

&( 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 ^

Slide 66

Slide 66 text

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@TUSJOHOBNF

Slide 67

Slide 67 text

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@TUSJOHOBNF QIQJOJͷWBSJBCMFT@PSEFSνΣοΫ (PSH͕͋Ε͹ɺUSFBU@EBUB Λ࣮ߦ

Slide 68

Slide 68 text

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@TUSJOHOBNF 26&3:@453*/(Λύʔεͯ͠ϋογϡςʔϒϧʹ֨ೲ

Slide 69

Slide 69 text

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@TUSJOHOBNF ੜ੒ͨ͠ϋογϡςʔϒϧΛ&( TZNCPM@UBCMF <@(&5>@(&5ʹηοτ

Slide 70

Slide 70 text

ࢀߟεʔύʔάϩʔόϧม਺ॲཧϋϯυϥ 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) εʔύʔάϩʔόϧม਺͝ͱʹϋϯυϥ͕͋Δ

Slide 71

Slide 71 text

D .BTBTIJ4IJOCBSB!TIJOY 1)1ϑΝΠϧ࣮ߦ w ϦΫΤετͰࢦఆ͞Εͨ1)1ϑΝΠϧΛ࣮ߦ w 1)1ίʔυΛίϯύΠϧɺΦϖίʔυ࣮ߦ

Slide 72

Slide 72 text

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);

Slide 73

Slide 73 text

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ϑΝΠϧΛίϯύΠϧ ੜ੒͞ΕͨΦϖίʔυྻΛฦ͢

Slide 74

Slide 74 text

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 Ͱฦ͢ͷ͸͜ͷ஋

Slide 75

Slide 75 text

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); ੜ੒ͨ͠ΦϖίʔυΛ࣮ߦ

Slide 76

Slide 76 text

D .BTBTIJ4IJOCBSB!TIJOY 1)1ίʔυͷग़ྗ w FDIPͳͲͷग़ྗ͸όοϑΝʹه࿥ όοϑΝΛ௒͑ͦ͏ͳ৔߹͸ૹ৴͢Δ w '$(*@45%065Ϩίʔυͱͯ͠όοϑΝʹ֨ೲ w ϦΫΤετऴྃॲཧͰOHJOYʹૹ৴

Slide 77

Slide 77 text

fcgi_request *request = (fcgi_request*) SG(server_context); ret = fcgi_write(request, FCGI_STDOUT, str, str_length); FDIPͳͲͷग़ྗ GQNGQNGQN@NBJODTBQJ@DHJCJO@TJOHMF@XSJUF DPOTUDIBSTUS VJOU@UTUS@MFOHUI '$(*@45%065ϨίʔυΛੜ੒ͯ͠ɺ ϦΫΤετߏ଄ମόοϑΝʹه࿥ Ҿ਺TUSग़ྗ஋

Slide 78

Slide 78 text

όοϑΝྫ >>> 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ϨίʔυܗࣜͰόοϑΝʹه࿥ ʢϔομɺίϯςϯπɺύσΟϯάʣ

Slide 79

Slide 79 text

όοϑΝྫ >>> 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ϨίʔυܗࣜͰόοϑΝʹه࿥ ʢϔομɺίϯςϯπɺύσΟϯάʣ

Slide 80

Slide 80 text

D .BTBTIJ4IJOCBSB!TIJOY ϦΫΤετऴྃॲཧ w όοϑΝΛ'BTU$(*Ϩεϙϯεͱͯ͠ૹ৴ '$(*@&/%@3&26&45Λ߹Θͤͯૹ৴ w ϦΫΤετ࣮ߦ؀ڥͷΫϦʔϯΞοϓ

Slide 81

Slide 81 text

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@SFRVFTUSFR JOUFOE

Slide 82

Slide 82 text

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@SFRVFTUSFR JOUFOE ࠷ޙͷݺͼग़͠ʢϦΫΤετऴྃॲཧ࣌ʣͳΒɺ '$(*@&/%@3&26&45Λ௥Ճ

Slide 83

Slide 83 text

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@SFRVFTUSFR JOUFOE όοϑΝʢSFRPVU@CVGʣΛૹ৴

Slide 84

Slide 84 text

D .BTBTIJ4IJOCBSB!TIJOY ࣮ߦ؀ڥ

Slide 85

Slide 85 text

D .BTBTIJ4IJOCBSB!TIJOY TIJOYHECQIQ w QIQTSDϏϧυHECʹΑΔσόοάͰ͖Δ؀ڥ EPDLFSDPNQPTF w FOWͰର৅1)1όʔδϣϯ΍ϏϧυΦϓγϣϯΛࢦఆ w HEC΍TUSBDFͳͲͷπʔϧΛ಺แ IUUQTHJUIVCDPNTIJOYHECQIQ

Slide 86

Slide 86 text

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 # ॲཧ࠶։

Slide 87

Slide 87 text

D .BTBTIJ4IJOCBSB!TIJOY QIQGQNϦΫΤετॲཧΛσόοΨͰ௥͏ $ curl http://localhost:8000/?id=1 w ผλʔϛφϧ͔ΒDVSMͰϦΫΤετૹ৴ w HECλʔϛφϧͰϒϨʔΫϙΠϯτͰఀࢭ gdb> w O TUFQPWFS ΍T TUFQJO ίϚϯυͳͲͰ࣮ߦ͍ͯ͘͠

Slide 88

Slide 88 text

D .BTBTIJ4IJOCBSB!TIJOY ओͳHECίϚϯυ ίϚϯυ ಺༰ CSFBL C ϒϨʔΫϙΠϯτΛઃఆʢؔ਺໊ɺϑΝΠϧ໊ߦ൪߸ʣ CQD ϓϩάϥϜΧ΢ϯλͷҐஔʹϒϨʔΫϙΠϯτΛઃఆ DPOUJOVF D ॲཧΛ࠶։ OFYU O εςοϓΦʔόʔ TUFQ T εςοϓΠϯ fi OJTI fi O ݱࡏͷؔ਺͕ऴྃ͢Δ·ͰॲཧΛ࣮ߦ QSJOU Q ม਺PSΞυϨε ม਺΍ϝϞϦΞυϨεͷ஋Λදࣔ Y/Tม਺PSΞυϨε /όΠτΛจࣈྻͱͯ͠දࣔ XIFSF ݱࡏͷ࣮ߦҐஔΛදࣔ MJTU ݱࡏͷ࣮ߦҐஔલޙͷίʔυΛදࣔ R σόοΨऴྃ

Slide 89

Slide 89 text

D .BTBTIJ4IJOCBSB!TIJOY ओͳHECίϚϯυQIQTSD ίϚϯυ ಺༰ QSJOU[W [WBMͷ಺༰Λදࣔ QSJOU@HMPCBM@WBST άϩʔόϧม਺Λදࣔ QSJOU@IU )BTI5BCMFͷ಺༰Λදࣔ QSJOU@[TUS [FOE@TUSJOHͷ಺༰Λදࣔ [CBDLTUSBDF 1)1ίʔυϨϕϧͷελοΫτϨʔεΛදࣔ QIQTSDͷHECJOJUʹఆٛ͞Ε͍ͯΔ

Slide 90

Slide 90 text

D .BTBTIJ4IJOCBSB!TIJOY ·ͱΊ w QIQGQNͷ'BTU$(*ϦΫΤετॲཧΛݟͨ w *0؍࡯ɺίʔυɺσόοΨͰڍಈΛ௥͑Δ TUSBDFQIQTSDHEC w ࢓૊ΈΛ஌Δͷ͸ָ͍͠ʂ

Slide 91

Slide 91 text

D .BTBTIJ4IJOCBSB!TIJOY ࢀߟ w IUUQTFOXJLJQFEJBPSHXJLJ'BTU$(* w IUUQTGBTUDHJBSDIJWFTHJUIVCJP'BTU$(*@4QFDJ fi DBUJPOIUNM