PHP의 내장 웹 서버로 웹사이트를 빠르게 테스트하는 방법

게시 됨: 2022-08-11

PHP 로고를 보여주는 그림

PHP 애플리케이션을 테스트하기 위해 웹 서버를 빠르게 시작해야 합니까? PHP 인터프리터에는 하나의 내장 기능이 있습니다! 이를 사용하여 Apache, NGINX 또는 컨테이너화 솔루션을 실행하지 않고도 작업을 빠르게 검사할 수 있습니다.

PHP의 통합 서버는 상대적으로 관심을 덜 받지만 개발 목적으로는 상당히 강력합니다. 이 가이드에서는 PHP 스크립트를 실행할 수 없는 Python의 SimpleHTTPServer 또는 http-server npm 패키지와 같은 다른 마이크로 서버의 대안으로 이를 사용하는 방법을 보여줍니다.

내장 서버 사용

내장 서버는 완전한 HTTP 서버가 없는 환경에서 PHP 사이트를 테스트하는 데 도움이 되는 편리한 메커니즘입니다. PHP 5.4 및 모든 이후 버전에서 사용할 수 있습니다. 먼저 가상 호스트를 설정할 필요 없이 작업 디렉토리에서 바로 실행할 수 있습니다.

서버를 사용하기 전에 개발용으로만 설계되었음을 경고합니다. PHP 문서는 프로덕션 애플리케이션 앞에 이 서버를 배포하는 것에 대해 명시적으로 경고합니다. 공개적으로 액세스 가능한 네트워크에 노출될 만큼 충분히 안전하지 않습니다.

서버 시작

-S 플래그를 php 실행 파일에 전달하여 서버를 시작합니다.

 $ php -S 로컬 호스트:8080
[2022년 6월 10일 금요일 16:00:00] PHP 8.1.5 개발 서버(http://localhost:8080) 시작

명령에 지정된 인수는 서버의 수신 주소를 지정합니다. 위의 예에서 localhost 에서 포트 8080 을 사용했습니다. 이제 웹 브라우저에서 http://localhost:8080 을 방문하여 작업 디렉토리의 콘텐츠에 액세스할 수 있습니다. 모든 PHP 스크립트는 요청하면 자동으로 실행됩니다.

서버를 시작할 때 -t 플래그를 설정하여 작업 디렉토리 외부에 있는 경로를 제공할 수 있습니다.

 $ php -S localhost:8080 -t /home/$USER/public_docs

이제 문서 루트는 홈 폴더 내의 /public_docs 가 됩니다.

웹 서버를 사용하는 동안 터미널 창을 열어 두십시오. 사이트 테스트가 끝나면 Ctrl+C를 눌러 프로세스를 종료합니다. PHP는 URI 및 HTTP 메서드를 포함하여 들어오는 각 요청을 터미널 창에 기록합니다. 잡히지 않은 PHP 오류도 로그에 표시됩니다.

원격 액세스 활성화

localhost 에서 수신 대기하면 네트워크의 다른 장치에서 들어오는 연결이 허용되지 않습니다. 대신 0.0.0.0 에 바인딩하여 원격 액세스를 허용할 수 있습니다.

 $ PHP -S 0.0.0.0:8080

서버는 프로덕션 용도로 강화되지 않았으며 공개적으로 노출되어서는 안 됩니다. 모바일 장치에서 특정 기능을 테스트할 때와 같이 절대적으로 필요한 경우에만 원격 액세스를 허용하십시오. 사용하는 포트가 인터넷에 열려 있지 않은지 확인하십시오.

대체 일치 요청

PHP는 들어오는 요청에 URI 구성 요소가 없을 때 활성 문서 루트에서 index.phpindex.html 파일을 찾습니다. 이러한 파일이 모두 존재하지 않으면 서버는 계속해서 디렉토리 트리 위로 이동하여 문서 루트의 부모 중 하나에서 색인을 찾습니다. 즉, 의도하지 않게 지정한 디렉터리 외부에 있는 콘텐츠를 제공할 수 있습니다. 404 Not Found 상태는 인덱스 파일을 찾지 않고 트리의 맨 위에 도달하면 발행됩니다.

URI를 포함하는 요청(예: /file )은 문서 루트의 정적 파일과 정확히 일치해야 합니다. 그렇지 않으면 404가 반환됩니다. PHP는 자동으로 Content-Type 응답 헤더를 가장 많이 사용되는 파일 확장자에 대해 제공된 파일의 MIME 유형으로 설정합니다.

라우터 스크립트 사용

모든 요청에 ​​대해 스크립트를 호출하도록 웹 서버를 선택적으로 구성할 수 있습니다. 이를 통해 애플리케이션의 전면 컨트롤러를 사용하여 고급 동적 라우팅을 수행할 수 있습니다.

라우터 기능은 서버를 시작할 때 명령줄에 PHP 파일 이름을 제공하여 활성화됩니다.

 $ php -S 로컬 호스트:8080 라우터.php

PHP는 이제 router.php 를 사용하여 들어오는 모든 요청을 처리합니다. 요청 URI를 검사하여 애플리케이션의 적절한 지점으로 사용자를 라우팅할 수 있습니다.

 if ( $_SERVER [ "REQUEST_URI" ] === "/대시보드" ) {
    require_once ( "dashboard.php" ) ;
}
else if ( $_SERVER [ "REQUEST_URI" ] === "/프로필" ) {
    require_once ( "프로필.php" ) ;
}
다른 {
    require_once ( "404.php" ) ;
}

라우터 스크립트에서 생성된 출력은 클라이언트로 다시 전송되는 응답이 됩니다. 스크립트가 false 를 반환하는 경우는 예외입니다. 이 경우 PHP는 원래 요청 URI와 일치하는 정적 파일을 반환하도록 대체합니다.

 if ( str_starts_with ( $_SERVER [ "REQUEST_URI" ] , "/api" ) ) {
    // 올바른 API 엔드포인트로 라우팅
    // ...
}
다른 {
    // 다른 경로를 정적으로 제공
    반환 거짓 ;
}

PHP 코드에서 내장 서버 감지하기

PHP 코드는 활성 인터페이스 이름을 검사하여 내장 웹 서버에서 호출하는지 여부를 감지할 수 있습니다. php_sapi_name() 함수는 이 값을 제공합니다. 스크립트가 통합 서버 구성 요소에 의해 호출될 때 cli-server 로 설정됩니다.

 if ( php_sapi_name ( ) === "cli-server" ) {
    enable_development_mode ( ) ;
}

여러 요청을 동시에 처리하기

서버는 기본적으로 단일 프로세스 동기 모드에서 실행하도록 기본 설정되어 있습니다. 요청은 개별적으로 처리되며 완료될 때까지 서로가 실행되지 않도록 차단합니다. 이것이 서버가 프로덕션 용도에 적합하지 않은 이유 중 하나입니다.

PHP 7.4는 여러 요청을 동시에 처리하기 위한 지원을 추가했습니다. fork() 가용성에 의존하며 Windows에서는 작동하지 않습니다. 이 모드가 활성화되면 서버는 들어오는 각 요청을 처리할 새 작업자를 분기합니다. PHP_CLI_SERVER_WORKERS 환경 변수를 원하는 작업자 수로 설정하여 활성화할 수 있습니다.

 $ PHP_CLI_SERVER_WORKERS=8 php -S 로컬 호스트:8080

이 기능은 여전히 ​​PHP 8.1에서 실험적인 것으로 표시되어 있습니다.

요약

PHP에는 응용 프로그램을 테스트하고 로컬 네트워크에서 로컬 파일 시스템 콘텐츠를 신속하게 노출하는 편리한 방법인 웹 서버가 내장되어 있습니다. PHP 스크립트 실행, catch-all 라우팅 및 가장 일반적인 MIME 유형의 정적 파일을 지원합니다.

서버는 이제 선택적 분기 모드를 지원하지만 프로덕션 환경에서는 사용하지 않는 것이 좋습니다. 개발 지원을 위한 것이며 공개 배포에 필요한 사용자 지정 및 보안 기능이 부족합니다. WAMP, XAMPP 및 Docker 컨테이너와 같은 기존 개발 플랫폼에 대한 경량의 통합된 대안으로서 탁월한 기능을 제공합니다.