PHP 엔진에 내장된 웹 서버를 활용하면 PHP 코드가 웹 브라우저의 요청에 실제로 어떻게 응 답하는지 신속하게 확인할 수 있습니다.


내장 웹 서버는 PHP 5.4.0부터 사용할 수 있습니다.


php 명령을 실행할 때 -S 인수를 주고 호스트명과 포트 번호를 지정하면 현재 디렉터리의 파일에 접근할 수 있는 웹 서버가 실행됩니다. 예를 들어 자신의 컴퓨터의 8000번 포트에 웹 서버를 띄우려면 php -S localhost:8000 명령을 실행합니다. 서버가 실행되고 http:// localhost:8000/habony.php에 접속하면 웹 서버는 habony.php의 코드를 실행하고 그 결과를 웹 브라우저로 반환합니다.


입력한 파일을 웹 서버가 찾지 못할 때는 php -s 명령을 실행한 디렉터리를 확인해야 합니다. 기본적으로 PHP 웹 서버는 php -S 명령을 실행한 현재 디렉터리와 그 하위에서 파일을 찾습니다. 최상위 문서 디렉터리를 직접 지정하려면 -t 인수를 사용합니다. 예를 들어 php -S localhost:8000 -t /home/habony/public_html 명령은 /home/habony/public_html 디렉터리의 파일을 http://localhost:8000에서 접근할 수 있도록 합니다.


PHP 웹 서버는 URL과 파일을 그저 단순히 연결하고 URL에 지정한 파일명 그대로 기본 디렉터리 하위의 파일을 검색합니다. URL에 파일명을 쓰지 않으면 index.php나 index.html 파일을 찾고, 그 파일도 없으면 "file not found" 오류를 반환합니다.


내장 웹 서버는 한 번에 하나의 요청만 처리할 수 있어서, 개발 환경에서 기능 테스트와 사용자 경험 테스트 용도로 사용하기 좋습니다. 아파치나 엔진엑스 같은 정식 웹 서버 설치에 비해 설정과정이 없어 간편하지만 그만큼 기능이 제한적입니다. 운영 환경에 코드를 배포할 때는 규모 변화에 잘 대응하고 보안에도 강한 일반적인 웹 서버를 사용해야 합니다.



PHP REPL

내장 웹 서버는 PHP 코드가 실제로 어떻게 작동하는지 빠르게 확인할 수 있는 좋은 도구입니다. PHP 코드 탐색과 테스트에 사용할 수 있는 다른 편리한 도구로는 PHP REPL이 있습니다. 아래 예제처럼 php -a 명령을 실행하면 php > 프롬프트가 나오고 여기에 PHP 코드를 입력하면 결과를 즉시 확인할 수 있습니다.


예제 #)

% php -a
Interactive shell

php > print strlen("habonyphp");

9

php > $releases = simplexml_load_file("https://secure.php.net/releases/feed.php"); php > print $releases->entry[0]->title;

PHP 7.0.5 released!

php >


% 기호는 유닉스 셸 프롬프트이며 php -a 는 PHP REPL을 실행하는 명령어입니다.

REPL은 Interactive shell을 출력하고 이어서 php > 프롬프트를 출력합니다. 단, php_pdo.dll 파일이 활성화되어 있어야 합니다.



PHP 코드를 입력하고 리턴 키를 누르면 REPL은 결과를 출력합니다. print strlen("habonyphp"); 코드를 입력하고 리턴 키를 누르면 REPL은 strlen("habonyphp");을 실행하고 그 결과를 print 명령에 전달해, 최종적으로 9를 출력합니다. 주의할 부분은 마지막에 세미콜론(;)을 빠뜨리지 않도록 주의합니다. 


REPL에 입력한 PHP 코드는 일반적인 PHP 프로그램과 같은 구문 규칙을 따릅니다.


strlen("habonyphp"); 명령만 입력해도 아무 오류 없이 잘 실행되지만 출력되는 내용이 없이 바로 php > 프롬프트가 나옵니다. PHP REPL은 PHP 코드에 명시적인 출력 명령이 있을 때만 그 결과를 출력합니다.


REPL은 명령에 쓰인 변수를 기억합니다. $releases = simplexml_load_file("https:// secure.php.net/releases/feed.php"); 명령을 실행하면 simplexml_load_file() 함수는 지정한 URL에서 XML을 가져와 그 결과를 $releases 변수에 SimpleXML 객체로 저장합니다.


SimpleXML은 입력받은 XML의 구조에 따라 계층화된 객체를 반환합니다. 따라서 XML 최 상위 계층에서 바로 다음 단계의 첫 번째 원소가 title 이라면 그 값은 $releases->entry[0]→title에 저장됩니다. 위 예제를 실행하면 여기에 PHP 7.0.5이 저장되는데, 이 값은 코드를 실행하는 시점에 따라 달라질 수 있습니다.


내장 REPL이 아닌 PsySH도 있습니다. 이것은 php composer.phar global require psy/psysh 명령어로 설치할 수 있습니다.


require 명령 앞에 global 인수를 넣으면, 시스템 전역 디렉터리에 패키지를 설치합니다. macOS와 리눅스의 전역 컴포저 디렉터리는 사용자 디렉터리 하위의 .composer 디렉터리며, 윈도우는 사용자 디렉터리 하위의 AppData\RoamingW Composer 디렉터리입니다. 예를 들어 habonyphp라는 사용자로 컴퓨터에 로그인했을 때, 전역 컴포저 디렉터리는 macOS에서 /Users/habonyphp/.composer, 리눅스에서 /home/habonyphp/. composer, 윈도우에서 C:\UsersWhabonyphp\AppData\Roaming\Composer입니다.


실제로 psysh 프로그램은 컴포저 디렉터리 하위의 vendor/bin 디렉터리에 저장됩니다. 따라서 명령행에서 psysh를 실행하려면 /Users/habonyphp/.composer/vendor/bin/psysh 처럼 전체 명령어 경로를 입력하거나, vendor/bin 디렉터리를 시스템의 $PATH 변수에 추가해 psysh 명령만 실행했을 때 해당 디렉터리를 검색할 수 있게 설정해야 합니다.


psysh를 실행하면 PHP 명령어를 입력할 수 있는 프롬프트가 나옵니다. 내장 REPL과 달리 psysh는 출력 명령을 사용하지 않더라도 선언 구문의 결과를 출력할 뿐만 아니라 텍스트나 변수의 종류 등을 색상을 통해 강조합니다.



0 댓글