2009년 12월 31일 목요일

PHP XML Writer 속도

XMLWriter

0.000063


XMLDocument

0.000068


String

0.000084

 

XMLWriter가 가장 빨라보이기는 했는데 XMLDocument가 String으로 XML을 만든 것보다 빠른 것은 예상 밖이었다. 위의 값은 평균 값은 아니고 어떤 특정시점의 스냅샷이다. 그렇지만 여러번 실행시켜도 결과는 마찬가지다.

할 일

스트링으로 XML을 생성하면 XMLWriter보다 느리다. 그러나 일부 호스팅 서비스에서 XMLWriter를 지원하지 않는 경우가 있다. 주로 사용하는 호스트에서는 XMLWriter를 지원하고 있기는 하지만 이를 기반으로 제작하면 다른 서비스에서 사용할 수 없다. 우선순위를 어떻게 두느냐로 고민하다가 각 사용자 환경별로 최고의 속도를 내게하자는 규칙을 만들었다. 즉 모두 지원하고 경우에 따라 알고리즘을 바꾸기 쉽게 만든다. 나중에.

HTTP XML output

flash, php 통신에서 XML을 사용했다. XML 구조에 flash가 호출하고 싶은 php의 영역과 기능에 대한 정의가 포함되어 있고 결과에도 역시 같은 내용이 담겨있었다. 결과를 flash에서 파싱할 때 어떤 호출에 대한 응답인지를 확인하겠다는 의도였다. 그러나 잘못된 생각이었다. request에 대한 response는 정해져 있기 때문에 응답에 대한 핸들러가 작동하는 시점에는 호출한 내용이 무엇인지 이미 알고있기 때문이다.

 

따라서 xml output에 기입되는 내용, 실제 데이타를 표현하기 위해 시스템 전반적으로 XML 객체를 넘기는 것을 빼는 게 좋겠다. xml이 사용되는 해당 시점에서 output을 관리하는 게 좋아 보인다. 다른 경우에 이 코드를 사용한다면 output이 xml이 아닐 수도 있고 객체 생성시 xml 오브젝트를 계속 넘겨주는 암담한 인터페이스를 피할 수 있기 때문이다.

PHP 속도체크

$s = microtime();
$this->doSomething();
echo sprintf("%f", microtime_float() - $s);

 

위처럼 하니 속도파악이 가능하다.

PHP에서 XML 다루기

XMLWriter 라는 스트링으로 XML을 생성하는 클래스를 구해다가 사용하고 있었다. 그런데 계층 구조의 객체 관계를 모델링하고 이를 XML로 바꾸는 과정에서 스트링은 문제가 생겼다. 스트링은 여태까지 만들어 놓은 XML 텍스트를 수정하는 것이 불편하다.

 

따라서 PHP에서 XML을 다루는 방법을 찾아본 결과 역시나 정리되어 있는 문서를 찾아볼 수 있었다. XML을 다루는 방법은 크게 네 분류로 나뉘는데 tree based, streaming, event based, transformation 이다.

 

tree based

- ext/dom

PHP 4에서는 ext/domxml을 쓰고 PHP 5에서는 ext/dom을 사용한다. 사용법은 매우 비슷하다.

- ext/simplexml

 

 

streaming (빠르고 간단함)

- ext/xmlreader

- ext/xmlwriter

 

event based

- ext/xml

 

transformation

- XSL

 

 

2009년 12월 28일 월요일

PHP 의 POST 자동 addslashes

SQL injection을 피해보잡시고 POST값에 대해서 addslashes를 하려고 했다. 그런데 뭔가 조금 이상해서 봤더니 POST된 값에 이미 슬래쉬가 붙어있다. flash가 그렇게 보내진 않을거 같고 조금 찾아봤더니 아래와 같은 설명이 PHP 메뉴얼에 나온다.

 

The PHP directive magic_quotes_gpc is on by default, and it essentially runs addslashes() on all GET, POST, and COOKIE data. Do not use addslashes() on strings that have already been escaped with magic_quotes_gpc as you'll then do double escaping. The function get_magic_quotes_gpc() may come in handy for checking this.

 

magic_quotes_gpc가 on이면 GET, POST, COOKIE에 대해서 addslashes()를 수행한다. 그래서 addslashes()를 추가했다가 다시 빼버렸다. 다른 환경을 위해 get_magic_quotes_gpc()로 검사하고 직접 해주던지 놔두던지 하게 바꾸야 한다.

작심 리팩토링

+ 프리젠테이션 레벨이 디비와 묶여서 response xml 출력 코드가 많이 겹친다. 달력을 구성하는 객체를 만드는 편이 좋아보인다.

+ 서비스가 시작되면 위 작업을 하다간 갑자기 짤릴지도 모르니 테스터부터 만드는 게 좋겠다. 그래도 주의해야 겠지만.