소개
phar:// 스트림 래퍼(stream wrapper)는 PHP 5.3.0 이후 모든 버전에서 기본적으로 제공됩니다. Phar는 PHP Archive(PHP 아카이브)의 약자로, PHP 애플리케이션이나 라이브러리를 하나의 파일로 묶어 배포할 때 사용되며, 일반 PHP 파일처럼 실행할 수 있습니다.
phar:// 래퍼는 fopen()을 통한 읽기/쓰기 및 파일 이름 변경은 물론, opendir()를 이용한 디렉터리 스트림 작업, 그리고 디렉터리 생성과 삭제까지 지원합니다.
Phar 클래스를 사용하면 특정 디렉터리에 담긴 애플리케이션 리소스들을 하나의 phar 아카이브로 손쉽게 패키징할 수 있습니다. 이렇게 만든 아카이브는 phar:// 래퍼를 통해 읽기 작업에 활용됩니다.
Phar 아카이브 빌드하기
먼저 php.ini 설정 파일에서 phar.readonly 값이 0으로 설정되어 있는지 확인해야 합니다. 이 설정이 켜져 있으면 phar 아카이브를 생성하거나 수정할 수 없습니다.
다음으로 애플리케이션의 모든 리소스를 담을 src 폴더를 만들고, 그 안에 진입점 역할을 할 index.php 파일을 생성합니다.
<?php echo "phar application started"; ?>
이제 Phar 클래스 객체를 만들고 buildFromDirectory() 메서드를 사용해 src 폴더의 모든 파일을 포함하는 phar 아카이브를 빌드합니다. 이때 setDefaultStub() 메서드로 index.php를 기본 스텁(stub)으로 지정합니다.
<?php
// php.ini의 phar.readonly 설정이 반드시 0이어야 합니다
$pharFile = 'app.phar';
// 기존 파일 정리
if (file_exists($pharFile)) {
unlink($pharFile);
}
if (file_exists($pharFile . '.gz')) {
unlink($pharFile . '.gz');
}
// phar 생성
$p = new Phar($pharFile);
// 전체 디렉터리를 기반으로 라이브러리 구성
$p->buildFromDirectory('src/');
// 모든 클래스를 로드하는 메인 파일 지정
$p->setDefaultStub('index.php', '/index.php');
// 추가로 gzip 압축 적용
$p->compress(Phar::GZ);
echo "$pharFile successfully created";
?>위 스크립트를 명령줄에서 다음과 같이 실행합니다.
php create-phar.php
실행이 완료되면 작업 디렉터리에 app.phar 파일이 생성됩니다. 만들어진 phar 아카이브는 아래 명령으로 바로 실행할 수 있습니다.
php app.phar
phar:// 래퍼 사용하기
생성된 아카이브 내부의 파일에는 phar:// 래퍼를 통해 접근할 수 있습니다.
<?php
echo file_get_contents('phar://app.phar/index.php');
?>위 코드를 실행하면 아카이브 안에 포함된 index.php 파일의 내용이 화면에 출력됩니다. 이처럼 phar:// 래퍼를 활용하면 단일 파일로 패키징된 애플리케이션 내부의 리소스도 일반 파일 시스템처럼 자유롭게 다룰 수 있습니다.