이 블로그는 LAMP ((linux, apache, MySQL 그리고 Perl 혹은 Python 혹은 PHP)) 구조에 기반하는 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의 악몽같은 특성
- 트랙백처럼 웹서버간 통신하는 공간에서 주로 사용되는 함수라서
…아주 즐겁게도 모든 안전망을 통과하고 숨어버린 버그가 된 것. 아직 개발 버젼이고 소수의 테스터들만 사용하는 상태라 문제가 적긴?하겠지만 그래도 이건
- 오류 추적이 힘들고 ((디버깅을 쉽게 하기 위해서는, 테스트하기 쉽고, 버그를 재현하기 쉽고(테스트하기 쉽고랑 일맥상통?) 추적하기 쉬워야한다고 생각함)) – apache log를 써야하고 커맨드라인 사용 자동화가 힘듦
- 변수 값에 관한 가정이 너무 약한
PHP의 특성이 문제라고 생각한다. PHP자체가 언어라기보단 웹 프레임웍(아주 밑단만 있는)이라고 생각하는데, 이게 좀 조약하다는게 -_-. 뭐 물론 PHP5/strict 라면 괜찮긴한데 이미 있는 응용들 안 깨지게 저기로 넘어가는건 진짜 언제가 될지 Orz
앞으로도 이런 버그를 몇 개는 더 보게 되지 않을까; 스크립트 기반으론 제일 처음 배운 CGI일텐데 이런 모습을 계속 봐야하는건 좀 괴롭다;
http://barosl.com/blog/entry/ruby-creator-matz-criticizes-php
제가 좋아하는 언어의 창시자 분께서 비슷한 맥락에서 php를 별로 안 좋아하신다고 하네요. 특히 위 목록 중 일관성을 날려버린 부분은 정말로 좋아하지 않습니다.
내가 PHP를 안좋아하는건 언어적인 측면보다는 “전체 프레임웍”의 관점에서 싫어하는거고(…). 저런 측면의 문제는 조금씩 일관성없게 커진 언어라면 어쩔수 없이? 같는 문제인지도 모르겠다. (C++의 써드 파티 라이브러리를 보면 그런걸 많이 느낄 수 있지)
뭐 여튼(…) PHP ㅈㅈ
프레임웍적인 관점이라면… 데이터 처리와 html 출력이 마구 뒤섞인다던가 뭐 그런? (이것도 신경 써서 코딩하면 별 문제 없긴 하지만 말입니다.)
아니 그것보다는 PHP를 스크립트 언어 수준으로 쓰는건 몇 가지 언어적인 제약이나 한계빼고는 만족스럽…다기엔 약간 부족한 수준에서 쓰는데.
문제는
* $HTTP_POST_VARS 라거나
* Global 이라거나
* 디버깅을 위한 로깅(apache 위에서 돌 때 특히)
* 현재 상태를 파악하기 위한 방법
이런 “웹 프레임웍” 적인 모습에서 진짜 불만족스럽다라는 것.