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

0
294

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

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

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

내장 서버 사용

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

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

서버 시작

서버는 다음을 전달하여 시작됩니다. -S 플래그 php 실행 가능:

$ php -S localhost:8080
[Fri Jun 10 16:00:00 2022] PHP 8.1.5 Development Server (http://localhost:8080) started

명령에 지정된 인수는 서버의 수신 주소를 지정합니다. 우리는 포트를 사용했습니다 8080 ~에 localhost 위의 예에서. 이제 방문할 수 있습니다. 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는 다음을 찾습니다. index.php 그리고 index.html 들어오는 요청에 URI 구성 요소가 없는 경우 활성 문서 루트의 파일. 이러한 파일이 모두 존재하지 않으면 서버는 계속해서 디렉토리 트리 위로 이동하여 문서 루트의 부모 중 하나에서 색인을 찾습니다. 즉, 의도하지 않게 지정한 디렉터리 외부에 있는 콘텐츠를 제공할 수 있습니다. 404 Not Found 상태는 인덱스 파일을 찾지 않고 트리의 맨 위에 도달하면 발행됩니다.

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

라우터 스크립트 사용

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

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

$ php -S localhost:8080 router.php

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

if ($_SERVER["REQUEST_URI"] === "/dashboard") {
    require_once("dashboard.php");
}
else if ($_SERVER["REQUEST_URI"] === "/profile") {
    require_once("profile.php");
}
else {
    require_once("404.php");
}

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

if (str_starts_with($_SERVER["REQUEST_URI"], "/api")) {
    // Route to the correct API endpoint
    // ... 
}
else {
    // Serve other routes statically
    return false;
}

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 localhost:8080

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

요약

PHP에는 애플리케이션을 테스트하고 로컬 네트워크에서 로컬 파일 시스템 콘텐츠를 신속하게 노출할 수 있는 편리한 방법인 웹 서버가 내장되어 있습니다. PHP 스크립트 실행, 포괄 라우팅 및 가장 일반적인 MIME 유형의 정적 파일을 지원합니다.

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