본문 바로가기
기타

PHP 내장 웹 서버 관련 스터디

2022. 1. 6.

php 는 특정 버전 이후부터 자체 내장 웹 서버를 제공하기 때문에 nginx 나 apache 같은 웹 서버를 따로 설치, 연결하지 않더라도 서버를 띄울 수 있다.

1. 웹 서버 시작 (-S)

php -S localhost:8000

localhost:8000 에 접속하면 php 웹 서버에 접속할 수 있다.

2. 특정 디렉토리에서 웹 서버 시작(-t)

php -S localhost:8000 -t public

프로젝트의 시작점인 index.html이 현재 위치한 디렉토리인 루트 디렉토리가 아니라, public 디렉토리에 있는 경우

public 에서 시작할 수 있도록 시작 디렉토리를 알려줘서 웹 서버에 접속할 수 있다.

그러므로 public 디렉토리에 있는 index.php 혹은 index.html 이 반환된다.

3. 라우터 스크립트 사용

php -S 0.0.0.0:8000 -t public .htrouter.php

 

위 명령어처럼 php 파일이 명령어에 포함되면, 해당 php 파일은 "라우터' 스크립트로 처리된다.

스크립트가 false 를 반환하면 요청된 리소스가 있는 그대로 반환되고, (ex 이미지 자체를 요청하는 경우에는 false 처리를 해서 이미지 리소스 자체를 반환할 수 있다)

false 가 아니면 스크립트의 출력 결과가 브라우저로 반환된다.

https://www.php.net/manual/en/features.commandline.webserver.php

 

PHP: Built-in web server - Manual

$_SERVER['SERVER_ADDR'] is not defined when using php as the built-in commandline web server, so you can not use $_SERVER['SERVER_ADDR'] to detect the Server's IP address.P.S.: This is tested on Windows with PHP 7.1 on 2016-12-22.Below is the printed $_SER

www.php.net


php 내장 웹 서버 실행 샘플

php -S 0.0.0.0:8000 -t public .htrouter.php

8000번 포트로 php 내장 웹 서버를 실행시킬 것이고, public 디렉토리에서 시작하며, 라우터 설정은 .htrouter.php 에 따른다는 의미이다.

http://0.0.0.0:8000

브라우저에서 위 주소로 접속하면 index.php가 실행된 결과 페이지가 뜬다. 

.htrouter.php 샘플

<?php

$uri = urldecode(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));

if ($uri !== '/' && file_exists(__DIR__ . '/public' . $uri)) {
    return false;
}

$_GET['_url'] = $_SERVER['REQUEST_URI'];

require_once __DIR__ . '/public/index.php';

.htrouter.php 코드 학습

$uri = urldecode(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));

- $_SERVER['REQUEST_URI']
이 페이지에 접근하기 위해 입력한 URI

- parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)
parse_url 함수는 첫번째 파라미터로 오는 url 에 대한 정보를 배열로 리턴하는 함수이다. 두번째 파라미터로 PHP_URL_PATH를 넣어주면, 리턴된 배열에서 PHP_URL_PATH에 해당하는 정보만 뽑아준다. 그러므로 해당 url의 path 정보만 뽑는 함수이다.

=> http://0.0.0.0:8000 의 경우 path 가 따로 없기 때문에 $uri = '/' 일 것이다.
if ($uri !== '/' && file_exists(__DIR__ . '/public' . $uri)) {
    return false;
}

- 특정 리소스를 요청하는 경우, uri에 path 가 추가될 것이기 때문에 if문에 걸리고,
찾는 리소스가 public 디렉토리 안에 존재한다면 false를 리턴함으로써 해당 리소스 자체를 반환한다 (https://www.php.net/manual/en/features.commandline.webserver.php 참고)

- 그냥 http://0.0.0.0:8000 으로 접속하면 if문에 걸리지 않고 그냥 지나가겠지만
http://0.0.0.0:8000 뒤에 특정 자원에 접근하는 path 가 추가되어 접속하면
해당 리소스를 리턴하는 것인데,
예를 들어 이미지를 요청했고 public 폴더 안에 요청한 이미지가 존재한다면 false를 리턴함으로써 해당 이미지를 반환해버린다.
$_GET['_url'] = $_SERVER['REQUEST_URI'];

- 사실 여기는 잘 모르겠...
require_once __DIR__ . '/public/index.php';

- __DIR__
현재 디렉토리 위치를 의미한다. 현재 위치에서 /public/index.php 를 실행시킨다.
(이 부분 때문에 현재 디렉토리를 반드시 public의 부모 디렉토리로 잡아주어야 함)

프레임워크 별 웹 서버 실행 위치와 index.php 위치 주의

라라벨과 코드이그나이터의 디렉토리 구조가 다르기 때문에 index.php 의 위치를 잘 찾아갈 수 있도록 웹 서버 실행 디렉토리를 신경써줘야 한다.

- 라라벨 

-.htrouter.php
-public
   ㄴindex.php  

- 코드이그나이터

- applications
   ㄴ.htrouter.php
   ㄴpublic
      ㄴindex.php  

코드이그나이터는 root 디렉토리가 아니라, applications 디렉토리 안에서 서버 실행 명령어를 쳐줘야 한다. 

'기타' 카테고리의 다른 글

mac 개발환경 세팅  (0) 2022.01.07
환경 변수 관련 스터디  (0) 2022.01.07
PHP 내장 웹서버로 개발환경 세팅  (0) 2022.01.06
php short tag 적용  (0) 2022.01.06
Db 용어  (0) 2022.01.04

댓글