php script 파일을 파싱한 결과가 아파치 서버로 리턴되지 않는
안녕하세요. 전 php 개발자인데요.
얼마전에 제가 개발한 사이트에서 이상한 현상이 발생했는데 해결 방법을 찾을 수가 없네요. ^^;;
제 사이트는 solaris 2.8 에서 apache server 1.3.26, php 4.0.6 을 이용하여 사이트를 운영중입니다. php 는 shared apache module 로 컴파일했습니다.
apache server log 에 php request 결과가 http status 는 "200", http body size 가 "-" 인 경우가 하루에 5 ~ 6 번씩 남아있습니다.
이런 log 가 남는 이유는 php script 를 파싱한 결과가 apache server 의 타임아웃 시간 5분을 지나도 return 되지 않았기 때문인데, 왜 php script 를 파싱한 결과가 return 되지 않는지 이유를 모르겠습니다.
php script 를 파싱한 결과가 return 되지 않는 이유를 찾기 위해 syslog() 로 php engine 의 send_php(), apache_php_module_main(), php_execute_script(), zend_execute_scripts() 에 log 를 남겼습니다.
해당 경우에 log 는 apache_php_module_main() 까지만 남아 있습니다. 그러므로 php_execute_script() 이전에 있는 php_request_startup() 에 문제가 발생한다고 생각되지만, 정확한 원인을 찾지는 못했습니다.
해당 경우에 segmentation fault 로 인해 apache process 가 죽지는 않았습니다.
이러한 현상이 발생하는 원인과 해결방법을 아시는 분은 알려주세요.
그럼 부탁드립니다.
그리고 새해 복 많이 받으세요. ^_____^


php쪽에서 뭔가 문제가 있었다면..
php.ini에서 에러메시지 출력 레벨을
error_reporting = E_ALL 로 하고
log_errors = On 를 하게되면
에러가 아파치의 error_log에 쌓입니다.
이 정보와 같이 분석하는게 좋지 않을까 생각합니다.
#0 zif_phpinfo (ht=0, return_value=0x82bceec, this_ptr=0x0, return_value_used=0) at info.c:463 #1 0x814a3a1 in execute (op_array=0x82bce84) at ./zend_execute.c:1598 #2 0x812a547 in zend_execute_scripts (type=8, retval=0x0, file_count=3) at zend.c:812 #3 0x808856a in php_execute_script (primary_file=0xbffff6c4) at main.c:1383 #4 0x81318fe in apache_php_module_main (r=0x82b7604, display_source_mode=0) at sapi_apache.c:90 #5 0x80859d6 in send_php (r=0x82b7604, display_source_mode=0, filename=0x82b80a4 "/usr/local/apache/htdocs/ttt.php") at mod_php4.c:575 #6 0x8085a2f in send_parsed_php (r=0x82b7604) at mod_php4.c:590 #7 0x8155a43 in ap_invoke_handler (r=0x82b7604) at http_config.c:518 #8 0x816a6b9 in process_request_internal (r=0x82b7604) at http_request.c:1308 #9 0x816a71c in ap_process_request (r=0x82b7604) at http_request.c:1324 #10 0x816170e in child_main (child_num_arg=0) at http_main.c:4603 #11 0x81618a0 in make_child (s=0x824556c, slot=0, now=1041363261) at http_main.c:4718 #12 0x81619f9 in startup_children (number_to_start=5) at http_main.c:4800 #13 0x8162056 in standalone_main (argc=2, argv=0xbffff9d4) at http_main.c:5108 #14 0x8162823 in main (argc=2, argv=0xbffff9d4) at http_main.c:5456위에 것은 아파치가 php 요청을 처리할때 backtrace의 내용입니다.
소스레벨에소 체크를 좀더 해보실려면
#2 번인 zend_execute_scripts에서 어디까지 실행을 했나
확인해 보는 것도 좋겠네요 (저 함수에서 php 파싱과 실행이 이루어 지더군요)
794 ZEND_API int zend_execute_scripts(int type TSRMLS_DC, zval **retval, int file_count, ...) 795 { 796 va_list files; 797 int i; 798 zend_file_handle *file_handle; 799 zend_op_array *orig_op_array = EG(active_op_array); 800 zval *local_retval=NULL; 801 802 va_start(files, file_count); 803 for (i=0; i<file_count; i++) { 804 file_handle = va_arg(files, zend_file_handle *); 805 if (!file_handle) { 806 continue; 807 } 808 EG(active_op_array) = zend_compile_file(file_handle, ZEND_INCLUDE TSRMLS_CC); 809 zend_destroy_file_handle(file_handle TSRMLS_CC); 810 if (EG(active_op_array)) { 811 EG(return_value_ptr_ptr) = retval ? retval : &local_retval; 812 zend_execute(EG(active_op_array) TSRMLS_CC); 813 if (!retval) { 814 zval_ptr_dtor(EG(return_value_ptr_ptr)); 815 local_retval = NULL; 816 } 817 destroy_op_array(EG(active_op_array)); 818 efree(EG(active_op_array)); 819 } else if (type==ZEND_REQUIRE) { 820 va_end(files); 821 EG(active_op_array) = orig_op_array; 822 return FAILURE; 823 } 824 } 825 va_end(files); 826 EG(active_op_array) = orig_op_array; 827 828 return SUCCESS; 829 }울랄라~ 호기심 천국~!!
http://www.ezdoum.com
댓글 달기