PHP에 화딱지가 날 때

이 블로그는 LAMP[1] 구조에 기반하는 WordPress 위에서 동작하고 있다. 근데 이 블로그가 WP 안정버젼이 아니라 개발 중인 버젼 위에서 돌고 있어서 가끔 문제를 일으키곤 하는데, 오늘 겪은 문제는 좀 PHP 근원?적인 문제라고 할만한 것.

특정 Post에 ping (핑백 혹은 트랙백)이 허용되는지 확인하는 함수인 pings_open()의 구현이 1주 전에 바뀌었다. 근데 그 사이엔 트랙백을 보내보질 않아서 (내가 내 블로그에 얼마나 자주 보내겠냐 -_-;; ) 모르고 있었는데, 어제 저녁에 UCS-2/UTF-16 에 관한 정정 포스팅을 쓴 트랙백이 안 갔더라고.

그래서 아까 점심 먹고나서 잠시 디버깅을 해봤는데, 원인은 이런 것.

function pings_open( $post_id=NULL ) { 
    $_post = get_post($post_id); 
    $open = ( 'open' == $post->ping_status ); 
    return apply_filters( 'pings_open', $open, $post_id ); 
}
 

몇 줄 되지도 않는 함수가 좀 변경이 되었는데 $_post 여야할 부분이 $post로 잘못 입력되었다. 이게 어떻게 regression test를 통과했는지 궁굼하지만. 여튼 저부분이 잘못되서 PHP가 뭔가 에러를 뱉는가?

특정 PHP  경고 셋팅에선 뱉을 수도 있긴한데

  • 기본적으론 사용자가 읽을 수 없는 apache log에 남는데다가 (셋팅도 맞아야하고)
  • 저런 경우 단순히 false / 0 에 가까운 값으로 자동 인식하는 PHP의 악몽같은 특성
  • 트랙백처럼 웹서버간 통신하는 공간에서 주로 사용되는 함수라서

…아주 즐겁게도 모든 안전망을 통과하고 숨어버린 버그가 된 것. 아직 개발 버젼이고 소수의 테스터들만 사용하는 상태라 문제가 적긴?하겠지만 그래도 이건

  • 오류 추적이 힘들고[2] – apache log를 써야하고 커맨드라인 사용 자동화가 힘듦
  • 변수 값에 관한 가정이 너무 약한

PHP의 특성이 문제라고 생각한다. PHP자체가 언어라기보단 웹 프레임웍(아주 밑단만 있는)이라고 생각하는데, 이게 좀 조약하다는게 -_-.  뭐 물론 PHP5/strict 라면 괜찮긴한데 이미 있는 응용들 안 깨지게 저기로 넘어가는건 진짜 언제가 될지 Orz

앞으로도 이런 버그를 몇 개는 더 보게 되지 않을까; 스크립트 기반으론 제일 처음 배운 CGI일텐데 이런 모습을 계속 봐야하는건 좀 괴롭다;

  1. linux, apache, MySQL 그리고 Perl 혹은 Python 혹은 PHP []
  2. 디버깅을 쉽게 하기 위해서는, 테스트하기 쉽고, 버그를 재현하기 쉽고(테스트하기 쉽고랑 일맥상통?) 추적하기 쉬워야한다고 생각함 []

Published by

rein

나는 ...

4 thoughts on “PHP에 화딱지가 날 때”

  1. 내가 PHP를 안좋아하는건 언어적인 측면보다는 “전체 프레임웍”의 관점에서 싫어하는거고(…). 저런 측면의 문제는 조금씩 일관성없게 커진 언어라면 어쩔수 없이? 같는 문제인지도 모르겠다. (C++의 써드 파티 라이브러리를 보면 그런걸 많이 느낄 수 있지)

    뭐 여튼(…) PHP ㅈㅈ

  2. 프레임웍적인 관점이라면… 데이터 처리와 html 출력이 마구 뒤섞인다던가 뭐 그런? (이것도 신경 써서 코딩하면 별 문제 없긴 하지만 말입니다.)

  3. 아니 그것보다는 PHP를 스크립트 언어 수준으로 쓰는건 몇 가지 언어적인 제약이나 한계빼고는 만족스럽…다기엔 약간 부족한 수준에서 쓰는데.

    문제는
    * $HTTP_POST_VARS 라거나
    * Global 이라거나
    * 디버깅을 위한 로깅(apache 위에서 돌 때 특히)
    * 현재 상태를 파악하기 위한 방법
    이런 “웹 프레임웍” 적인 모습에서 진짜 불만족스럽다라는 것.

Leave a Reply