[질문] POST 데이터가 Apache에서부터 넘어오지 않습니다.
안녕하세요~
음.. PHP에서 POST 데이터를 받지 못하는 현상이 생겨 질문드립니다.
클라이언트로 부터 넘어오는 POST 데이터의 형식이 틀려 PHP에서 못받는
경우가 아니라, 아예 POST 데이터를 아파치에서 부터 받지 못하는군요.
POST 데이터의 형식이 틀리다 하더라도, $HTTP_RAW_POST_DATA에는
POST 값이 있어야 하는데 $HTTP_RAW_POST_DATA에도
값이 없군요( php.ini 에서 always_populate_raw_post_data = On 으로 했습니다).
더욱이 문제는 POST 이 항상 안오는게 아니라 열번중에 1번 정도 안오는군요.
하도 이상해서 apache의 스택 트레이스를 걸어 보았더니,
신기한점을 발견 하였습니다.
apache가 POST 데이터를 다 받지도 않았는데, PHP 코드를 호출해서
PHP코드상에서는 $HTTP_RAW_POST_DATA가 없는걸로 나오더군요.
스택 스레이스한걸 중요한 부분만 올려봅니다.
...생략 7223 read(6, "POST /myoffice/ezOrgan/OrganInfo/GetDeptMemberList.php HTTP/1.1\r\nAccept: */*\r\nAccept-Language: ko\r\nReferer: http://XX.74.182.XX/myoffice/ezEmail/receiverChoose.php?defaultwin=TO\r\nAccept-Encoding: gzip, deflate\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)\r\nHost: XX.74.182.XX\r\nContent-Length: 137\r\nConnection: Keep-Alive\r\nCache-Control: no-cache\r\nCookie: Login[UserID]=hihi; Login[chkID]=2; AUTH_USER=HIHI; AUTH_PASSWORD=13adb4e65fad618975c7dbd8705ecad2; PHPSESSID=3fb2 .... FD 6 번에서 클라이언트의 HTTP 요청을 받았습니다. 보시다시피 POST 형식이구요. 중요한 Content-Length는 137입니다. 즉 POST 데이터가 있다는 소리겠죠. ...생략 7223 rt_sigaction(SIGPIPE, {SIG_IGN}, {SIG_IGN}, 8) = 0 7223 read(6, "<DATA><DEPTID>ST001</DEPTID><CELL>displayname;description;title;telephonenumber;company</CELL><PROP>mail</PROP><TYPE>user</TYPE></DATA>\r\n", 4096) = 137 FD 6 번에 POST 데이터가 도착했습니다. 137 바이트죠. ...생략 7223 lstat64("/usr/local/apache/htdocs/myoffice/ezOrgan/OrganInfo/GetDeptMemberList.php", {st_mode=S_IFREG|0775, st_size=3970, ...}) = 0 PHP를 처리하기위해 php파일을 엽니다. 이미 POST 값을 읽었기 때문에, $HTTP_RAW_POST_DATA에는 ""<DATA><DEPTID>ST001</DEPTID><CELL>displayname;description;title;telephonenumber;company</CELL><PROP>mail</PROP><TYPE>user</TYPE></DATA>" 값이 들어가 있습니다. ...생략 PHP 처리부분 7223 writev(6, [{"HTTP/1.1 200 OK\r\nDate: Mon, 25 Aug 2003 13:51:42 GMT\r\nServer: Apache/1.3.27 (Unix) PHP/4.3.0\r\nX-Powered-By: PHP/4.3.0\r\nExpires: Thu, 19 Nov 1981 08:52:00 GMT\r\nCache-Control: no-store, no-cache, must-rev... 처리된 PHP 결과를 Client(FD 6)에게 보내줍니다. 이렇게 되면 정상적인 POST 처리가 되었습니다. 보시다시피 아파치가 POST 를 받은 후, PHP를 호출하죠. 다음은 이상하게도 POST가 오지 않았는데, PHP를 호출하는 부분입니다. ...생략 7223 read(6, "POST /myoffice/ezOrgan/OrganInfo/GetDeptMemberList.php HTTP/1.1\r\nAccept: */*\r\nAccept-Language: ko\r\nReferer: http://XX.74.182.XXX/myoffice/ezEmail/receiverChoose.php?defaultwin=TO\r\nAccept-Encoding: gzip, deflate\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)\r\nHost: XX.74.182.XXX\r\nContent-Length: 137\r\nConnection: Keep-Alive\r\nCache-Control: no-cache\r\nCookie: Login[UserID]=hihi; Login[chkID]=2; AUTH_USER=HIHI; AUTH_PASS... FD 6 번에서 클라이언트의 HTTP 요청을 받았습니다. 아까와 마찬가지와 POST 형식이구요. 중요한 Content-Length는 137입니다. 즉 POST 데이터가 있다는 소리겠죠. 7223 rt_sigaction(SIGUSR1, {SIG_IGN}, {0x40ba3830, [], SA_INTERRUPT|0x4000000}, 8) = 0 7223 time(NULL) = 1061819515 7223 stat64("/usr/local/apache/htdocs/myoffice/ezOrgan/OrganInfo/GetDeptMemberList.php", {st_mode=S_IFREG|0775, st_size=3970, ...}) = 0 PHP를 처리하기위해 php파일을 엽니다. 아까와는 다르게 POST데이터가 아직 도착하지 않았습니다. ...생략 PHP 처리부분 7223 read(6, "<DATA><DEPTID>ST001</DEPTID><CELL>displayname;description;title;telephonenumber;company</CELL><PROP>mail</PROP><TYPE>user</TYPE></DATA>\r\n", 4096) = 137 지금에서야 POST를 읽었습니다. PHP부분을 수행하는 도중에 POST를 읽은 것이지요. 즉, PHP 코드 에서는 POST 데이터가 없는걸로 수행됩니다. ...생략 PHP 처리 완료 7223 write(6, "HTTP/1.1 200 OK\r\nDate: Mon, 25 Aug 2003 13:51:55 GMT\r\nServer: Apache/1.3.27 (Unix) PHP/4.3.0\r\nX-Powered-By: PHP/4.3.0\r\nExpires: Thu, 19 Nov 1981 08:52:00 GMT\r\nCache-Control: no-store, no-cache, mus... PHP 처리가 끝났습니다. 단, PHP에서는 POST 데이터가 없는걸($HTTP_RAW_POST_DATA에는 "" 값이 있습니다)로 실행된거죠.
이와 같은 현상이 나타납니다. 서버 환경
apache-2.0.47 + PHP 4.3.3 + Oracle8i
apache-1.3.28 + PHP 4.3.3 + Oracle8i
apache-1.3.27 + PHP 4.3.3 + Oracle8i
apache-1.3.27 + PHP 4.3.0 + Oracle8i
와 같은 조합으로 해보았는데 마찬가지 더군요.
제 생각으로는 아파치에서 POST 데이터를 read 후 PHP 코드를 실행해야 하는것
같은데, 혹시 이런 현상 겪어보신분 조언부탁드립니다.
이틀 동안 개삽질 중입니다. T-T
댓글 달기