내장 웹 서버

경고 이 웹 서버는 응용 프로그램 개발을 지원하도록 설계되었습니다. 테스트 목적이나 통제된 환경에서 실행되는 애플리케이션 데모에도 유용할 수 있습니다. 완전한 기능을 갖춘 웹 서버가 아닙니다. 공용 네트워크에서 사용하면 안 됩니다.

CLI SAPI는 내장 웹 서버를 제공합니다.

웹 서버는 단일 스레드 프로세스를 하나만 실행하므로 요청이 차단되면 PHP 애플리케이션이 중단됩니다.

URI 요청은 -t 옵션을 사용하여 명시적 문서 루트를 지정하지 않는 한 PHP가 시작된 현재 작업 디렉토리에서 제공됩니다. URI 요청이 파일을 지정하지 않으면 지정된 디렉토리의 index.php 또는 index.html이 반환됩니다. 두 파일이 모두 존재하지 않는 경우 index.php 및 index.html에 대한 조회는 상위 디렉토리에서 계속되는 식으로 파일을 찾거나 문서 루트에 도달할 때까지 계속됩니다. index.php 또는 index.html이 발견되면 반환되고 $_SERVER['PATH_INFO']는 URI의 후행 부분으로 설정됩니다. 그렇지 않으면 404 응답 코드가 반환됩니다.

웹 서버가 시작될 때 PHP 파일이 명령줄에 제공되면 "라우터" 스크립트로 처리됩니다. 스크립트는 각 HTTP 요청이 시작될 때 실행됩니다. 이 스크립트가 false를 반환하면 요청된 리소스가 있는 그대로 반환됩니다. 그렇지 않으면 스크립트의 출력이 브라우저로 반환됩니다.

확장자가 .3gp, .apk, .avi, .bmp, .css, .csv, .doc, .docx, .flac, .gif, .gz, .gzip, .htm인 파일에 대해 표준 MIME 유형이 반환됩니다. HTML, .ics, .jpe, .jpeg, .jpg, .js, .kml, .kmz, .m4a, .mov, .mp3, .mp4, .mpeg, .mpg, .odp, .ods, .odt, .oga, .ogg, .ogv, .pdf, .pdf, .png, .pps, .pptx, .qt, .svg, .swf, .tar, .text, .tif, .txt, .wav, .webm , .wmv, .xls, .xlsx, .xml, .xsl, .xsd 및 .zip.

변경 로그: 지원되는 MIME 유형(파일 확장자)

Version Description
5.5.12 .xml, .xsl, and .xsd
5.5.7 .3gp, .apk, .avi, .bmp, .csv, .doc, .docx, .flac, .gz, .gzip, .ics, .kml, .kmz, .m4a, .mp3, .mp4, .mpg, .mpeg, .mov, .odp, .ods, .odt, .oga, .pdf, .pptx, .pps, .qt, .swf, .tar, .text, .tif, .wav, .wmv, .xls, .xlsx, and .zip
5.5.5 .pdf
5.4.11 .ogg, .ogv, and .webm
5.4.4 .htm and .svg

변경 로그

Version Description
7.4.0 You can configure the built-in webserver to fork multiple workers in order to test code that requires multiple concurrent requests to the built-in webserver. Set the PHP_CLI_SERVER_WORKERS environment variable to the number of desired workers before starting the server. This is not supported on Windows.
Warning

This experimental feature is not intended for production usage. Generally, the built-in Web Server is not intended for production usage.


예제 #1 웹 서버 시작

$ cd ~/public_html
$ php -S localhost:8000
                

터미널에 다음이 표시됩니다.

PHP 5.4.0 Development Server started at Thu Jul 21 10:43:28 2011
Listening on localhost:8000
Document root is /home/me/public_html
Press Ctrl-C to quit
                

http://localhost:8000/ 및 http://localhost:8000/myscript.html에 대한 URI 요청 후 터미널에 다음과 유사한 내용이 표시됩니다.

PHP 5.4.0 Development Server started at Thu Jul 21 10:43:28 2011
Listening on localhost:8000
Document root is /home/me/public_html
Press Ctrl-C to quit.
[Thu Jul 21 10:48:48 2011] ::1:39144 GET /favicon.ico - Request read
[Thu Jul 21 10:48:50 2011] ::1:39146 GET / - Request read
[Thu Jul 21 10:48:50 2011] ::1:39147 GET /favicon.ico - Request read
[Thu Jul 21 10:48:52 2011] ::1:39148 GET /myscript.html - Request read
[Thu Jul 21 10:48:52 2011] ::1:39149 GET /favicon.ico - Request read
                

PHP 7.4.0 이전에는 라우터 스크립트가 처리하지 않는 한 Windows에서 심볼릭 링크된 정적 리소스에 액세스할 수 없었습니다.

예제 #2 특정 문서 루트 디렉토리로 시작하기

$ cd ~/public_html
$ php -S localhost:8000 -t foo/
                

터미널에 다음이 표시됩니다.

PHP 5.4.0 Development Server started at Thu Jul 21 10:50:26 2011
Listening on localhost:8000
Document root is /home/me/public_html/foo
Press Ctrl-C to quit
                

예제 #3 라우터 스크립트 사용

이 예에서 이미지에 대한 요청은 이미지를 표시하지만 HTML 파일에 대한 요청은 "PHP에 오신 것을 환영합니다"를 표시합니다.

                  
<?php
// router.php
if (preg_match('/\.(?:png|jpg|jpeg|gif)$/', $_SERVER["REQUEST_URI"])) {
    return false;    // serve the requested resource as-is.
} else {
    echo "<p>Welcome to PHP</p>";
}
?>
                  
                
$ php -S localhost:8000 router.php
                

예제 #4 CLI 웹 서버 사용 확인

CLI 웹 서버와 나중에 프로덕션 웹 서버를 사용하여 개발하는 동안 프레임워크 라우터 스크립트를 재사용하려면:

                  
<?php
// router.php
if (php_sapi_name() == 'cli-server') {
    /* route static assets and return false */
}
/* go on with normal index.php operations */
?>
                  
                
$ php -S localhost:8000 router.php
                

예제 #5 지원되지 않는 파일 형식 처리

MIME 유형이 CLI 웹 서버에서 처리되지 않는 정적 리소스를 제공해야 하는 경우 다음을 사용하십시오.

                  
<?php
// router.php
$path = pathinfo($_SERVER["SCRIPT_FILENAME"]);
if ($path["extension"] == "el") {
    header("Content-Type: text/x-script.elisp");
    readfile($_SERVER["SCRIPT_FILENAME"]);
}
else {
    return FALSE;
}
?>
                  
                
$ php -S localhost:8000 router.php
                

예제 #6 원격 시스템에서 CLI 웹 서버에 액세스

다음을 사용하여 모든 인터페이스에 대해 포트 8000에서 웹 서버에 액세스할 수 있습니다.

$ php -S 0.0.0.0:8000
                

경고 내장 웹 서버는 공용 네트워크에서 사용하면 안 됩니다.