2013년 2월 5일 화요일

PHP non-thread safe binaries for windows

PHP non-thread safe binaries for windows

PHP는 5.2.1 버전 부터 윈도우용 바이너리로는 Non thread safe PHP와 Non thread safe PECL 바이너리 2개를 제공해왔다. 2000년도 10월에 PHP 3.0.17 버전이 윈도우 진영으로 편입되면서 그로부터 쭉 Thread safe한 바이너리만을 제공해왔는데, 그 이유는 윈도우는 리눅스의 멀티 프로세스 아키텍쳐와 반대인 멀티 쓰레드 아키텍쳐에 기반을 두고 있었기 때문이다. 그래서 PHP를 IIS의 CGI 모듈 위에서 구동할 때 CGI 자체는 멀티 쓰레드 모델이 아닌 멀티 프로세스 모델이었기 때문에 매우 속도가 느렸다. 그래서 당시에는, 리눅스의 멀티 프로세스 모델을 본따서 만든 PHP ISAPI 모듈이 존재하였고 실제로 CGI 모듈 보다 속도가 훨씬 빨랐다고 한다. 하지만 ISAPI 모듈은 IIS와 크래쉬가 일어나는 문제가 있었기 때문에 결론적으로 CGI가 IIS+PHP 조합에서는 가장 안정적인 구성으로 자리매김을 했다. 하지만, 요청이 있을 때 마다 PHP 환경변수들에 대해서 메모리를 갱신함으로 인해 생기는 성능상의 문제는 해결해야할 과제로 남아있었다.
PHP+IIS의 성능상 이슈를 해결 할 수 있는 방법으로 두 가지가 있었는데, 첫 번째가 php 스크립트를 미리 컴파일 하여 실행 시간을 비약적으로 감소시켜주는 eAccelerator와 같은 opcode cache를 쓰는 것이었다. 나머지 하나는 설정을 통한 방법이었는데, IIS가 PHP를 FastCGI 모드로 사용할 수 있게 해주는 것이었다. FastCGI 모듈은 PHP 프로세스 들이 매 요청이 완료 될 때 마다 프로세스를 죽이는 것이 아니라 재활용 할 수 있도록 해주었고 이 방법은 PHP를 훨씬 빠르게 동작하게 하였을 뿐만 아니라 CGI 인터페이스를 사용함으로써 PHP extentions들의 호환성 문제들도 해결하였다.
Non thread safe 바이너리는 위 두 번째 방법을 위하여 만들어졌으며 PHP를 스탠다드한 CGI 인터페이스와 동작하도록 함으로써 PHP 프로세스 들로 하여금 쓰레드 동기화를 위해 기다릴 필요가 없게 만들었다. 이것은 기존 보다 40% 정도의 속도향상을 가지고 왔다. 결론적으로, 추후에 MS는 새로운 FastCGI 핸들러를 만들었고, 설정을 통해 non thread safe PHP 바이너리를 FastCGI 모듈에서 동작할 수 있도록 만들어 주었다.