아무 것도 모르던 시절 php를 배우고 경력을 쌓았지만 나중에 다른 언어도 접촉해보고 느낌 점이 php는 템플릿언어라는 것입니다.
코드 자체를 보면 엄연히 프로그래밍 언어인데 html코드가 존재하지 않는 순수 php파일에서도 굳이 스크립트 태그 <?php를 붙여야 합니다.
나중에 알고보니 php를 만든 사람이 1버전때에는 템플릿 언어로 출시했다고 하네요.
2.0부터 본격적으로 프로그래밍 언어로 바뀌었다고 합니다.
하지만 저 스크립트 태그를 떼지 못한 것이 뭔가 아쉬운 느낌이 드네요.
php의 저런 스크립트 특성때문에 웹프로그랭 언어라고 하는 것 같습니다.
물론 태생자체가 웹을 위해 만들어진 언어이긴 하지만 따로 템플릿 엔진이 필요한 타 언어에 비해 자체적으로 이미 템플릿 언어라는 이유 때문에 더욱 그런 것 같습니다.
하지만 관련 API만 있다면 웹이외에 다른 임무도 수행할 수 있는 언어로 될 가능성도 있지 않을가 상상해봅니다.
이젠 정말 많이 발전하고 많이 좋아졌으니까요.
혹시 지금 이미 그런 API가 있는데 제가 모른다고 알려주시면 감사하겠습니다.
php가 타언어에 비해(많이는 자바에 비교당함) 많이 까이는 부분 중 하나가 바로 무상태성이 아닌가 싶습니다.
보안성에 대해서도 말이 많지만 지금은 이미 많이 개선되었고 사람들의 인식이 여전히 과거에 머물러있어 그렇다고들 하네요.
하지만 거기에 비해 무상태성은 아직도 진행 중이라 얘기해볼가 합니다.
무상태성이란 서버사이드 측면에서 한번의 요청을 처리한 후 어떠한 데이터도 남기지 않는다는 것입니다.
세션이나 데이터베이스에 저장되는 데이터는 별개의 개념입니다.
프로그래밍 측면에서 한번 선언된 변수는 다음 요청에서 쓰이지 못합니다.
왜냐면 우리가 작성한 php코드는 매번 http요청이 들어올 때마다 처음부터 끝까지 실행되고 다음 요청에서 또 다시 처음부터 다 실행되기 때문입니다.
전 회사 재직 중일 때 java를 배우고 들어왔던 한 신입분이랑 얘기를 나눴던 기억이 떠오르네요.
php는 어떤 언어인지 궁금해서 들어왔다고 하셨는데 php를 접해고나서 저한테 하는 말이 "지금 여기에 이렇게 작성된 class 코드들이 매번 페이지를 로딩할 때마다 계속 반복적으로 실행되는 건가요? 그럼 세션말고는 서버사이드에서 저장되는 데이터는 없는 건가요?" 그때는 그 분이 왜 그런 질문을 했는지 잘 몰랐죠.
그리고 java에서는 서버가 한번 실행되면 생성된 인스터스들이 그대로 유지되어 재활용이 되고 대신 코드가 수정되면 서버를 재실행 해야 한다는 내용도 들었습니다.
php만 사용해왔던 저로서는 java가 왜 그렇게 될 수 있었는지를 잘 이해를 못했죠.
지금 생각해보면 php가 무상태성인 이유가 지금까지 웹언어로서 사용해온 방식 때문이였던 것 같습니다.
Nginx 에선 php-fpm이라는 fastcgi 을, Apache 에서는 자체적인 php모듈을 사용합니다.
이들의 공통적인 작업은 웹서버에서 보내온 http요청을 받아서 request정보를 파싱하고 php인터프리터를 가동하여 우리가 작성한 코드를 실행한 후 출력된 내용을 response로 포맷하여 내보는 것입니다.
즉 우리가 작성한 php코드를 이용하여 웹애플리케이션서버 역할을 자처하고 있는 겁니다.
때문에 한번의 요청 사이클에서 우리가 작성한 코드는 처음부터 끝까지 그대로 실행되며 어떤 코드를 어떻게 실행할지를 우리가 스스로 정할 수 없는 것이지요.
게다가 매번 새로 코드를 가져와서 실행하다 보니 우리가 수정한 코드에 대해서 실시간으로 반영되긴 하지만 그만큼 속도가 느리게 됩니다.
그러던 차에 우연히 인터넷에서 reactPHP라는 라이브러리를 발견했습니다.
공식 설명으로는 이벤트 루프, 비동기형 논블로킹 로우레벨 라이브러러라고 합니다.
해당 라이브러리의 핵심기능 중 하나가 socket 서버를 생성하여 http요청을 대기할 수 있다는 겁니다.
그 말인 즉 php가 이제 스스로 웹애플리케이션서버를 생성할 수 있고 코드의 실행방식을 우리가 마음대로 좌우지 할 수 있습니다.
require __DIR__ . '/vendor/autoload.php';
$http = new React\Http\HttpServer(function (Psr\Http\Message\ServerRequestInterface $request) {
return React\Http\Message\Response::plaintext(
"Hello World!\n"
);
});
$socket = new React\Socket\SocketServer('127.0.0.1:8080');
$http->listen($socket);
echo "Server running at http://127.0.0.1:8080" . PHP_EOL;
위와 같은 코드를 작성하여 서버에서 실행시키면 간단한 웹서버가 생성됩니다.
보시다시피 React\Http\HttpServer 인스턴스 인수로 전달된 클로저에 코드만 요청에 의해 반복 실행되고
그 이외에 코드는 서버실행 시 한번만 실행됩니다.
따라서 우리는 라이브러리 로딩, 인스턴스 초기화 등 무거운 작업을 클로저 밖에서 한번만 실행시키고 반복 실행하는 요청작업만 클로저안에 넣어두면 됩니다.
그러면 클로저 밖에서는 상시 유지할 수 있는 데이터를 만들 수 있겠죠.
여기서 주의해야 할 것은 fpm, apache모듈을 안쓰기에 우리가 자주 쓰는 $_REQUEST, $_SERVER 와 같은 request정보가 담겨있는 전역변수를 더 이상 쓸 수 없습니다.
대신 reactPHP에는 자신만의 request 인터페이스가 있습니다.
그로인해 우리가 기존의 php프로젝트를 reactPHP 서버에 적용시킬려면 request 인터페이스에 대한 변환작업이 추가로 필요할 것입니다.
그리고 기존에 php실행방식과는 달리 처음부터 실행된 상태로 계속 반복작업을 하는거다보니 더 빠른 속도로 자랑할 수 있겠죠.
물론 php7.0 부터 나온 opcache 이나 8버전부터 나온 JIT 컴파일러 때문에 기존방식에서도 이미 엄청 빨라져서 큰 차이가 안 느껴질 수 있습니다만, 이제 stateful 언어로 거듭날 수 있다는 것만으로도 엄청난 메리트가 생기게 된거죠.
"자바공화국"에서 왜 굳이 php냐 라고 하실 순 있겠지만 이미 php로 경력을 쌓아왔고 다른 언어로 갈아타기엔 경력을 다시 쌓아야 하는 것도 그렇고 이제 나이도 적지 않은지라 새 언어로 커리어를 쌓는게 맞나 싶기도 하더군요.
좋은 의견 있으시면 조언 부탁드립니다.
감사합니다.