PHPã§ã®Webãããžã§ã¯ãã®å®å®æ§ã«ã€ããŠè²¬ä»»ãè² ããŸãã è² è·ã¯çµ¶ããå¢å€§ããæ©èœã远å ãããé¡§å®¢ã¯æºè¶³ããŠããŸãã ããæŽããæ¥ãç¥ç§çãªãšã©ãŒãçŸãå§ããŸã...

ãµãŒããŒãœãããŠã§ã¢ãšã©ãŒ
...ããã°ã©ãã¯ä¿®æ£æ¹æ³ãç¥ããªã ãµãŒããŒãœãããŠã§ã¢ã¯ãããšãã°ãäžé£ã®apache-PHPããç Žå£ãããã¯ã©ã€ã¢ã³ãã¯èŠæ±ã«å¿ããŠå®æçãªã¡ã³ããã³ã¹ã«é¢ããããŒãžãåãåããŸãã Webéçºè
ã¯unix / linuxã§ã®Cããã°ã©ãã³ã°ã®æ·±ãç¥èãæã£ãŠããªãããšãå€ããã·ã¹ãã 管çè
ã¯æ®å¿µãªããã·ã¹ãã ã«bashããæ·±ãæœããªãããšããããããŸãã æ¬åœã®ããŒãã³ã¢:-)
ãµãŒããŒã¹ã¯ãªããã®äžå®å®ãªåäœ
å€ãã®å ŽåãWebãããžã§ã¯ãã®ç¹å®ã®ããŒãžããããããªãå§ããŸãã ããšãã°ãå®äºããã®ã«15åãããã圌ããããŠããããšãèŠã€ããã®ã¯ç°¡åã§ã¯ãããŸããã
ãã®ãããã¯ã«é¢ãã以åã®æçš¿ã§ ãæŠéãµãŒããŒäžã®PHPã¹ã¯ãªãããäœãè¡ãããæ±ºå®ããæ¹æ³ã®1ã€ã«ã€ããŠèª¬æããŸãããããã匷åãªããŒã«ãå¿
èŠã§ãããšæããŠããŸãã
å®éã«ã¯ããã䌌ãã¯ã©ã¹ã®ãµãŒããŒãœãããŠã§ã¢ãšã©ãŒãçºçãããããžã§ã¯ãã«ééããŸãããããŒã ã¯äœããã¹ãããåžžã«ææ¡ããŠããããã§ã¯ãããŸããã ã»ã°ã¡ã³ããŒã·ã§ã³é害ã¡ãã»ãŒãžã¯Apacheãã°ã«é »ç¹ã«è¡šç€ºãããã¯ã©ã€ã¢ã³ãã¯ãšã©ãŒããŒãžãååŸããã·ã¹ãã 管çè
ãšäžç·ã«Webéçºè
ãé ãæ©ãŸããããŸããŸãªããŒãžã§ã³ã®PHP / Apache /ããªã³ã³ãã€ã©ã§éãã§ãããŸããŸãªãªãã·ã§ã³ã§ãœãŒã¹ããPHPãäœåºŠãåéããŸããã°ã«ã€ããŠæžããŠãã ããããããã¯PHPã®ãã°ã§ã¯ãªããã³ãŒããªã©ãç¡éã«ç¶ãããšã蚌æãããŠããŸã...
èšäºã§ã¯ãPHPãæŠéãµãŒããŒã§åŽ©ããçç±ããã°ããç°¡åã«èŠã€ããŠããããæé€ããæ¹æ³ãæããããšæããŸã-UNIXã®Cã·ã¹ãã ããã°ã©ãã³ã°ã®çŸããäžçã«é£ã³èŸŒãããšãªã:-)欲æãšã³ãŒããŒ1æ¯ãå¿
èŠã«ãªããŸãã
WebãµãŒããŒã®ãšã©ãŒãã°ã確èªããŸã
Apacheãšã©ãŒãã°ã«æ¬¡ã®ãããªã¡ãã»ãŒãžã衚瀺ãããå Žåã¯ã次ã®èšäºãåç
§ããŠãã ããã
[Mon Oct 01 12:32:09 2012] [notice] child pid 27120 exit signal Segmentation fault (11)

ãã®å Žåãã¹ã¯ãªããã§ã¯ãªãããã»ã¹èªäœãã¯ã©ãã·ã¥ãããããPHPãšã©ãŒãã°ã§è©³çŽ°ãªæ
å ±ãæ¢ãããšã¯åœ¹ã«ç«ã¡ãŸããã äºåã«nginxã®å®æçãªã¡ã³ããã³ã¹ã«é¢ããçŽ æŽãããããŒãžãäœæããŠããªãå Žåãã¯ã©ã€ã¢ã³ãã«ã¯çŠæ¬²çãªãšã©ãŒã50 *ãã衚瀺ãããŸãã
誰ãã«é¡ãèŠãããã®ã§ããã誰ã«ïŒ :-)ç Žå£çãªæ±ºå®ããæ³šæããããããã«ãçè«ãæãåºããŸãã
ã·ã°ãã«ãšã¯äœã§ããïŒ ããã¯ãããšãã°ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãããã»ã¹ã«ãããééã£ãŠããããšãäŒããããã«äœ¿çšããããŒã«ã§ã:-)æ°åŠã®æ³åã«éåãã... 0ã§é€ç®ãããã匷å¶ã¢ã¯ã·ã§ã³ã«ãã£ãŠã¹ã¿ãã¯ãªãŒããŒãããŒãçºçããŸãã ãã®å Žåã11ãšããæ°åãšãSIGSEGVããšããååã®ã·ã°ãã«ã衚瀺ãããŸãã ã·ã°ãã«ã®ãªã¹ãã¯ããkill -lããå®è¡ããããšã§è¡šç€ºã§ããŸãã
...
11) SIGSEGV
...
SIGSEGVãªã©ã®äžéšã®ä¿¡å·ã¯ååã§ããªããããApache-PHPããã»ã¹ã¯è©Šè¡ãªãã§ã«ãŒãã«ã«ãã£ãŠå®¹èµŠãªã匷å¶çµäºãããŸãã 圌ãååããããšãæ£ç¢ºã«å€æããŸãã-ããã¯å¯èœã§ããããœãŒã¹ã«ç»ãå¿
èŠããããŸã:-)
ãããŠããªã圌ãã¯ãããæ®ºããã®ã§ããïŒ
ã§ã¯ãapache-PHPããã»ã¹ã匷å¶çµäºãããçç±ãèŠã€ããŸãããã ãããè¡ãã«ã¯ãkill :-)ãŸãã¯coredumpã®æç¹ã§ããã»ã¹ã¡ã¢ãªã®ãã³ããæ§æããŸãã ã¯ããã¯ã-ãããŸã§ã廿¢ããã50幎ãšããçšèªã䜿çšãããŠããŸãããããã¯
ãç£æ°ã³ã¢ããã®ããŒã¿ã®ä¿åãæå³ããŸãã æ¬¡åããã»ã¹ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«ãã£ãŠåŒ·å¶çµäºããããšããã«ããã¡ã€ã«ãã«ãŒãã«ã«ãã£ãŠäœæãã
ãŸã ãå Žæãšãã®åå
ãèšå®ã§ããŸã ã ã³ã³ãœãŒã«ã«ããå Žåã¯ããman 5 coreããšå
¥åããã ãã§ãã

ããšãã°ã次ã®ããã«ãã¡ã€ã«ãããã«å
¥ããããšãã§ããŸãã
echo "/tmp/httpd-core.%p"> / proc / sys / kernel / core_pattern
äœãèšå®ãããŠããªãå Žåãã·ã¹ãã ã¯ããã»ã¹ã®äœæ¥ãã£ã¬ã¯ããªã«ãcoreãïŒProcess_numberïŒããšãããã¡ã€ã«ãäœæããŸãã
apache-PHPããã»ã¹ã«æžã蟌ã¿èš±å¯ãããããšã確èªããŠãã ããã
ããã ãã§ã¯ãããŸããã ããã©ã«ãã§ã¯ãã»ãšãã©ã®å Žåãã³ã¢ãã³ããã¡ã€ã«ã®çæã¯ã·ã¹ãã ã§ç¡å¹ã«ãªã£ãŠããŸãã WebãµãŒããŒã®èµ·åã¹ã¯ãªããã®å
é ã«è¡ãæ¿å
¥ããããšã§æå¹ã«ã§ããŸãã
ulimit - unlimited
ãŸãã¯ãèšå®ãæ°žç¶çã«ããã«ã¯ããã¡ã€ã«ã/etc/security/limits.confããç·šéããŸãã ããã«æ¿å
¥ã§ããŸãïŒ
apache - core -1
ãã¡ã€ã«åœ¢åŒã®è©³çްã¯ãman limits.confãã§ãã
ãã ããApacheã®ã³ã¢ãã³ããã¡ã€ã«çšã®ãã©ã«ããŒãèšå®ãããŸã§ã
äœãæ©èœããŸããã§ãã ïŒ "/etc/httpd/conf/httpd.conf"ïŒã
CoreDumpDirectory /tmp

次ã«ãApacheãåèµ·åããŸãã
service httpd restart
ãã¹ãäžã§ãã ããã»ã¹ãæåã§åŒ·å¶çµäºããŸãã
ps aux | grep httpd
...
ãã«-12 12345
ã/ var / log / httpd / error_logãã確èªããŸãã
[Mon Oct 01 16:12:08 2012] [notice] child pid 22596 exit signal Segmentation fault (11), possible coredump in /tmp
ã/ tmpãã«ã¯ãã/ tmp / httpd-core.22596ããªã©ã®ååã®ãã¡ã€ã«ããããŸãã
çµäºããããã»ã¹ã®ã¡ã¢ãªãã³ããååŸããæ¹æ³ãåŠã³ãŸããã çŸåšãããã»ã¹ãèªç¶ã«çµäºããã®ãåŸ
ã£ãŠããŸãã
ç¯çœªçŸå Žã§-ã³ã¢ãã³ãã®è§£é
PHPããããã°ã·ã³ãã«ïŒã³ã³ãã€ã«æã®gccã®--enable-debugã-gããŒïŒãªãã§æ§ç¯ãããŠããå Žåãå€ãã®æçšãªæ
å ±ã倱ãããããšãç¥ã£ãŠããããšãéèŠã§ãã ãã ãããã®ãªãã·ã§ã³ããªããŠããœãŒã¹ããPHPãã³ã³ãã€ã«ãããœãŒã¹ãè¿ãã«ããå Žå-åæã«ã¯ããã§ååãããããŸããã
ãããã°ãã«ããããã©ãŒãã³ã¹ãšããã»ã¹ã«ãã£ãŠæ¶è²»ãããã¡ã¢ãªãããããªã³ãã«åœ±é¿ãäžãããšããéåžžã«äžè¬çãªèª€è§£ããŸã ãããŸãã 圱é¿ã¯ãããŸããããå®è¡å¯èœãã¡ã€ã«ã®ãµã€ãºã¯å¢å ããã ãã§ãã ãããã£ãŠããã«ãããããã°ããã«ãšã©ãŒã®åå ãç¹å®ã§ããªãå Žåã¯ãã·ã¹ãã 管çè
ã«ãããã°ã·ã³ãã«ã䜿çšããŠPHPã¢ãžã¥ãŒã«ããã«ãããããäŸé ŒããŠãã ããã

ã³ã¢ãã³ããéãæ¹æ³ã¯ïŒ ãã¡ãããå€ããŠãéåžžã«èŠªåãªããŠãŒãã£ãªãã£
-gdb㯠ãå
ã
ã¯
ããªãŒãœãããŠã§ã¢éåã®
ãªãã£ãŒãã¹ããŒã«ãã³ã®å€§äœ¿ã«ãã£ãŠäœæãããŸããã
ãããã¬ã®åäœãçè§£ããã®ã«ããã»ã©æéã¯ããããŸããã æ°æéã§
æãé¢çœãæç§æžã®1ã€ãåžåããããã·ã¹ãã 管çè
ã«ãããäŸé Œããããšãã§ããŸã;-)
éåžžãæ¬¡ã®ããã«ã³ã¢ãã³ããéããŸãã
gdb path_to_ executable_file_web server path_to_coredump
unixã®ãã¹ãŠã®èªå°å¿ã®ããCéçºè
ã¯ããã®ãããã¬ã®äœ¿ç𿹿³ã確ãã«ç¥ã£ãŠããŸããããããæ¯æ¥ãããè¡ããŸãããæ®å¿µãªããã圌ãã¯ããªãã®ããŒã ã«ããªããããããŸããã ãããŠãã1ã€äžå¿«ãªãã®ããããŸã...
GDBã§ã®PHPãããã°-ãã©ãã¯ããžãã¯
å®éããã€ãã³ãŒãã«ã³ã³ãã€ã«ãããPHPã¹ã¯ãªããã¯... Cããã°ã©ã ã§ã¯ãããŸãã;-)ããªãã§ã¯ãããŸããã
Zendãšã³ãžã³ã®å
éšãçè§£ããŸãããããŠã
ããã«çè§£ã§ããŸãã ã€ãŸãããã¬ãŒã¹ã§å®è¡é¢æ°ã®æåŸã®åŒã³åºããèŠã€ããã¹ã¿ãã¯ã®ãã®ãã¬ãŒã ã«ç§»åããŠããŒã«ã«å€æ°ïŒop_arrayïŒã調ã¹ãZendãšã³ãžã³ã®ã°ããŒãã«å€æ°ã調ã¹ãå¿
èŠããããŸãã
(gdb) frame 3 #3 0x080f1cc4 in execute (op_array=0x816c670) at ./zend_execute.c:1605 (gdb) print (char *)(executor_globals.function_state_ptr->function)->common.function_name $14 = 0x80fa6fa "pg_result_error" (gdb) print (char *)executor_globals.active_op_array->function_name $15 = 0x816cfc4 "result_error" (gdb) print (char *)executor_globals.active_op_array->filename $16 = 0x816afbc "/home/yohgaki/php/DEV/segfault.php"

op_arrayãšæ··åãããå¯èœæ§ãããããããã®æ§é ã®ãããªã«ãã¯ã¢ããã³ãã³ãã¯äŸ¿å©ã§ãã
(gdb) ptype op_array type = struct _zend_op_array { zend_uchar type; char *function_name; zend_class_entry *scope; zend_uint fn_flags; union _zend_function *prototype; zend_uint num_args; zend_uint required_num_args; zend_arg_info *arg_info; zend_bool pass_rest_by_reference; unsigned char return_reference; zend_uint *refcount; zend_op *opcodes; zend_uint last; zend_uint size; zend_compiled_variable *vars; int last_var; int size_var; zend_uint T; zend_brk_cont_element *brk_cont_array; zend_uint last_brk_cont; zend_uint current_brk_cont; zend_try_catch_element *try_catch_array; int last_try_catch; HashTable *static_variables; zend_op *start_op; int backpatch_count; zend_bool done_pass_two; zend_bool uses_this; char *filename; zend_uint line_start; zend_uint line_end; char *doc_comment; zend_uint doc_comment_len; void *reserved[4]; } *
ãããã°ããã»ã¹ã¯ãã¹ã¿ãã¯ã®ãã¬ãŒã ïŒããã¬ãŒã NãïŒéã®ãŠã©ãŒã¯ããexecuteã颿°ã®ååŒã³åºããžã®åãæ¿ããããŒã«ã«åŒæ°ïŒãprint nameãããptype nameãïŒã®æ€æ»ã§æ§æãããŸãã ãã¬ãŒã çªå·ãäœãã»ã©ãããªãã¯æ·±ããªããŸãã PHPã®æ¡åŒµæ©èœã«ã¢ã¯ã»ã¹ããŠããšã©ãŒãçºçããå Žæãšçç±ã確èªãããšäŸ¿å©ãªå ŽåããããŸãïŒå°ãªããšãçç±ãçè§£ããŠãã ããïŒã
(gdb) frame ## (gdb) print op_array.function_name $1 = 0x2aaab7ca0c10 "myFunction" (gdb) print op_array.filename $2 = 0x2aaab7ca0c20 "/var/www/file.php"
ãªã©ãªã©...
ã³ãŒããŒã§çªæ¯ããå Žå:-)ãã³ãã³ããframeïŒNïŒãã䜿çšããŠã³ãŒã«ã¹ã¿ãã¯ã®ãã¬ãŒã ãåãæ¿ãããšããã®æ§é ã®ç¹å®ã®èŠçŽ ããã¹ãŠèŠãããšãã§ã
ãŸã-PHP颿°ãåŒã³åºãããPHPãã¡ã€ã«ã«ééããªãèšå®ã§ããããšãèŠããŠãããŠãã ãã
圌女ãåŒãã æ©èœãªã© -ãããŠããã»ã°ã¡ã³ããŒã·ã§ã³ãã©ãŒã«ãããŸãã¯ããã»ã¹ã匷å¶çµäºãããã®ä»ã®ãšã©ãŒã®åå ã«å°éããŸãã ãããŠãããã°ã©ããŒã«ãã®çç±ã説æãããšã圌ãã¯ãããä¿®æ£ããŸãïŒ ããã«ããããŠæ¥œèгçã§ãªããã°ãªããŸãã-æ°žé ã«ã
ãšã©ãŒã®äžè¬çãªåå
ã³ã¢ãã³ããã¡ã€ã«ã®åç
§ãéå§ïŒãŸãã¯ã·ã¹ãã 管çè
ã«å²ãåœãŠïŒãããšããšã©ãŒãã°ã«ãŒãã«åé¡ããæ¹æ³ãããã«åŠç¿ã§ããŸãã
1ïŒPHPæ¡åŒµã®åé¡ã ãã®å Žåãæ¡åŒµæ©èœãç¡å¹ã«ãããããã®èšå®ã§éãã§ã¿ãŠãã ããã ããªãã¯ç¢ºãã«åé¡ãããã«ããããšãç¥ã£ãŠããŸããåé¡ã¯å°ããã§ãã
2ïŒååž°ã®åé¡ãã¹ã¿ãã¯ã ãšã©ãŒãçºçããpcreãªã©ã®ã©ã€ãã©ãªé¢æ°ãååž°ã«å
¥ããèªèº«ã2äžååŒã³åºããšã©ãŒãçºçããå ŽåããããŸãã ã©ã€ãã©ãªèšå®ãæ§æããããé
å»¶ããŠããå Žåã¯ãããã»ã¹ã«å€§ããªã¹ã¿ãã¯ã远å ã§ããŸãïŒ "/etc/init.d/httpd"ïŒïŒ
ulimit -sãå€ãããã«èšå®ã
ãŸããçŸåšã®å€ã¯ãã³ãã³ããulimit -aãã§è¡šç€ºã§ããŸãïŒulimitãå®è¡ããŠããããulimitããæ¢ããŸãïŒã
3ïŒPHPã³ã¢ã®åé¡-ããã§ã¯ãPHPéçºè
ã«æžã蟌ãå¿
èŠããããŸã:-)
äžè¬ã«ããšã©ãŒã®åå ã®ç¯å²ã¯å€§å¹
ã«åæžãããŸãã ãããå¿
èŠãªãã®ã§ãã

å®è¡äžã®ããã»ã¹ã®ãããã°
ããã ãã§ã¯ãããŸããã ã³ã¢ãã³ããååŸã§ããªãå Žåã¯ãå®è¡äžã®ããã»ã¹ã«æ¥ç¶ããŠããããèŠãŠåãããšãã§ããŸãã ããã»ã¹å
ã«ããéããã®å®è¡ã¯äžæåæ¢ãããŸãïŒãps aux | grep apache | grep 'T'ã-ãã¬ãŒã¹ç¶æ
ã«ãªããŸãïŒã ããªãã圌ãå»ããšãã圌ã¯åã³åŠåããç¶ããŸãã æ¬¡ã®ããã«æ¥ç¶ã§ããŸãã
gdb -pããã»ã¹ID
ãŸãšã
ãã®èšäºã§ã¯ããµãŒããŒãœãããŠã§ã¢ãšã©ãŒããæ£ããæºåãããæ¹æ³ãApache-PHPãããã°ãã«ããäœæããæ¹æ³ãã³ã¢ãã³ããã¡ã€ã«ãäœæããæ¹æ³ãããã³ã·ã³ããªãã¯ãããã¬ãŒã䜿çšããŠæ£ããè§£éããæ¹æ³ãåŠã³ãŸããã ãŸããã³ã¢ãã³ããã¡ã€ã«ãããç¹å®ã®PHPãã¡ã€ã«ãšãšã©ãŒã®åå ãšãªã£ã颿°ãèŠã€ããããšãã§ããããšãåŠã³ãŸããã
ããã§ããããŒãžã£ãŒã®ããã®ãã§ãã¯ãªã¹ããäœæããŠãWebéçºè
ãã·ã¹ãã 管çè
ãææ¡ã§ããªãè¬ã®ãµãŒããŒãšã©ãŒãåŠçã§ããŸãã
- ãµãŒããŒïŒsysadminïŒã§ã³ã¢ãã³ããã¡ã€ã«ã®ã³ã¬ã¯ã·ã§ã³ãæå¹ã«ããŸã
- å¿
èŠã«å¿ããŠããããã°ã·ã³ãã«ã䜿çšããŠapache-PHPãåæ§ç¯ããŸãïŒsysadminïŒ
- gdbïŒé±æ«ã§åŠç¿ïŒã䜿çšããŠããšã©ãŒã®åå ã調æ»ããŸãïŒWebéçºè
ã®ã·ã¹ãã 管çè
ïŒ
- èšå®ã倿Žãããçºçé »åºŠãæžãããªã©ã®å¯Ÿçãè¬ããŸããèšå®ã®å€æŽããœãããŠã§ã¢ã®æŽæ°ããã°ãã©ãã«ãŒãžã®æžã蟌ã¿ãPHPæ¡åŒµæ©èœã®ç¡å¹åãªã©ã
çµè«ãšããŠãç§ã¯
Bitrix24ã¯ã©ãŠããµãŒãã¹ã«å
šå¡ãæåŸ
ããŸãã
ãã®ãµãŒãã¹ã§ã¯ãèšäºã§èª¬æãããŠãããã¹ãŠã®ãã¯ãããžãŒã广çã«äœ¿çšããŸãã
çããã®å¹žéãšWebãããžã§ã¯ãã®å®å®ããä»äºã«ïŒ