php script 파일을 파싱한 결과가 아파치 서버로 리턴되지 않는

rhs0517의 이미지

안녕하세요. 전 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 가 죽지는 않았습니다.

이러한 현상이 발생하는 원인과 해결방법을 아시는 분은 알려주세요.
그럼 부탁드립니다.

그리고 새해 복 많이 받으세요. ^_____^

choissi의 이미지

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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.