PHP로 HTTP 서버 구현하기 - 01 - 계획
HTTP 완벽가이드 5장을 가볍게 읽다가, Perl로 만든 간단한 서버 구현을 보고 이걸 PHP로 구현해보면 좋겠다는 생각을 했다.
그 예제는 (대충 봤는데) HTTP 서버라기 보다 소켓 연결해서 응답해주는 수준의 간단한 구현이었던 것 같고, HTTP 서버가 되려면 뭘 해야하는지는 설명으로만 보여준다.
이응준님은 “웹 프로그래머를 위한 HTTP 완벽 가이드 읽는 법“에서
5장 “웹 서버”는 웹 서버가 어떻게 동작하는지 설명한다. 웹 프로그래머라면 반드시 이해해야 할 것이다.
라고 하셨지만, 사실 책에는 뭐 그리 많은 내용이 있는 건 아니다.
HTTP 완벽가이드 5장의 내용을 더 알고 싶다면, 남이 정리한 HTTP 완벽가이드 5장 자료를 찾아봐도 좋겠다.
구현 목표
몇부작이 될 지는 모르겠으나 시간날 때마나 기능을 하나씩 추가해볼까 한다.
단일 쓰레드로 하나의 요청만 처리하는 것부터 시작하기 때문에,
나중에 ReactPHP나 멀티쓰레딩 처리(PHP 7.2이상 + CLI 모드에선 가능한 듯) 혹은 멀티쓰레딩 흉내를 내는 것까지 갈 것 같다.
물론 올 해 안을 목표로 하는 프로젝트도 있기 때문에…한두번 하고 그만둘 수도 있다!
(중요/강조/미리죄송)
지금은 뭔가 신났지만…시작이나 하면 다행.
1차로 구현하고자 하는 기능은 ‘이미지가 하나 포함된 HTML 파일을 서비스한다’.
즉, HTML 파일 하나와 이미지 하나 정도 서비스 할 수 있는 능력이면 됐다.
예를 들어 이런 식.
|
가장 간단하게 시작하기
- 클래식한 소켓 연결 예제 프로그램
- 5년 전 기억을 더듬어 보면 이런 식으로 짰던 것 같기도 하다
PHP Socket Programming, done the Right Way
- 여기서는 PHP5.0 부터 사용할 수 있는 stream_socket_* 친구들을 소개한다
- 존 레식 닯은 청년이 아주 친절하게 설명해주기 때문에, 누구든 국경을 초월한 지식 습득이 가능하다
- 안 쓸 이유가 없다
찾아보니 OOP 방식의 간단한 구현체도 보임
- A simple HTTP server
- 아마도 위의 저 간단한 서버로 운영을 하다보면 겪을 수많은 고민이 담겨 있다(간단하게 구현 했음에도!)
- 하지만 내 수준에서 보면 너무 많이 구현해놓았으니, 간간히 안 풀릴 때 참고만 해보자
기본 기능
socket create/bind/listen까지는 가장 간단하게 구현된 놈을 쓰자.
최신 스타일로 하자면 stream_socket_server/stream_socket_accept.
이제 main 스크립트 하나 돌리면서, 들어오는 스트림을 앞으로 만들 클래스 인스턴스로 넘겨주는 작업부터 본격 개발 시작이다.
구현할 기능
- 요청 메시지 읽어들이기
- 메시지 파싱
- 리소스 접근
- config파일 활용
- document root, virtual host
- config파일 활용
- 응답 만들기
- 응답 코드 / 헤더 / 본문을 어떻게 구성할 지 정한다
- 응답/로그
예상되는 변화
앞에서 언급한 대로 다중커넥션 처리
400/500번 대 일부 구현
- 400, 404, 500 정도 구현할까 싶은데
- 에러 페이지는 사치
경로 조회 공격 방어 [?]
directory index
저장소
GitHub : https://github.com/youngiggy/phttp