Phar
Phar (PHP Archive)
Phar 확장은 전체 PHP 애플리케이션을 하나의 파일(phar, PHP Archive)로 묶어 배포·설치를 쉽게 해 주는 도구예요. PHP 애플리케이션을 위한 USB 드라이브라고 생각하면 이해가 빨라요.
본문
Phar 확장은 전체 PHP 애플리케이션을 "phar"(PHP Archive)라는 단일 파일로 만들어 배포와 설치를 쉽게 해 주는 기능을 제공해요. 게다가 PharData 클래스를 통해 tar와 zip 파일을 만들고 조작할 수 있는 파일 형식 추상화 방법도 제공해요. 이 점은 서로 다른 데이터베이스에 통일된 인터페이스를 제공하는 PDO와 비슷한데, PDO가 데이터베이스 간 변환을 할 수 없는 반면 Phar는 tar·zip·phar 형식 간 변환을 코드 한 줄로 가능하게 해요.
phar는 뭘까요?
Phar 아카이브는 여러 파일을 하나로 묶는 편리한 방법이에요. 그래서 완전한 PHP 애플리케이션을 단일 파일로 배포하고, 디스크에 압축을 풀지 않고도 그 파일에서 바로 실행할 수 있어요. phar 아카이브는 명령줄과 웹 서버 어디에서든 다른 파일처럼 쉽게 실행돼요.
Phar는 이 기능을 스트림 래퍼(Stream Wrapper) 를 통해 구현해요. 보통 include로 외부 파일을 쓰는데, .phar 아카이브 안의 파일은 phar:// 스킴을 사용해요.
<?php
include '/path/to/external/file.php';
/path/to/myphar.phar 안에 있는 file.php를 쓰고 싶다면 이렇게 해요.
<?php
include 'phar:///path/to/myphar.phar/file.php';
실제로 phar 아카이브는 마치 외부 디스크처럼 다룰 수 있어요. fopen() 관련 함수, opendir(), mkdir() 관련 함수를 그대로 사용해 아카이브 안의 파일과 디렉터리를 읽거나 수정하거나 새로 만들 수 있어요.
파일 형식: tar, zip, phar
Phar 아카이브는 tar, zip, 그리고 phar 확장 전용으로 설계된 고유 phar 형식으로 배포할 수 있어요. 각 형식에는 장단점이 있어요.
- tar·zip 형식 — 형식을 읽을 수 있는 타사 도구라면 누구나 읽거나 추출할 수 있지만, PHP에서 실행하려면 phar 확장이 필요해요.
- phar 형식 — phar 확장에 고유한 맞춤 형식이라 phar 확장이나 PEAR의 PHP_Archive 패키지로만 만들 수 있어요. 대신 이 형식으로 만든 애플리케이션은 phar 확장이 활성화되지 않아도 실행된다는 장점이 있어요.
즉 phar 확장이 비활성화된 상태에서도 phar 기반 아카이브는 실행하거나 include할 수 있어요. 아카이브 안의 개별 파일에 접근하는 건 phar 확장이 있을 때만 가능하고요(물론 PHP_Archive로 만든 아카이브는 예외).
Phar 확장은 한 명령으로 phar 아카이브를 tar에서 zip으로, 또는 phar 형식으로 변환할 수도 있어요.
<?php
$phar = new Phar('myphar.phar');
$pgz = $phar->convertToExecutable(Phar::TAR, Phar::GZ); // myphar.phar.tar.gz 생성
Phar는 개별 파일이나 아카이브 전체를 gzip 압축 또는 bzip2 압축으로 압축할 수 있고, MD5, SHA-1, SHA-256, SHA-512 서명으로 아카이브 무결성을 자동 검증해요.
보안에도 신경을 쓴 확장이라, 실행 가능한 phar 아카이브에 대한 쓰기 접근은 기본적으로 비활성화돼 있어요. phar 아카이브를 만들거나 수정하려면 php.ini의 phar.readonly 설정을 시스템 차원에서 꺼야 해요. 실행 스텁(stub)이 없는 일반 tar·zip 아카이브는 PharData 클래스로 언제든 만들고 수정할 수 있으니 참고해 주세요.
phar라는 단어는 PHP와 Archive의 합성어(portmanteau)예요. 자바 개발자에게 익숙한 jar(Java Archive)에서 느슨하게 착안했어요.Phar 아카이브의 구현은 PEAR 패키지
PHP_Archive에 기반하며 구현 세부도 비슷하지만, Phar 확장이 훨씬 강력해요. 대부분의 PHP 애플리케이션은 수정 없이 그대로 실행되는 반면, PHP_Archive 기반 phar는 동작하려면 광범위한 수정이 필요한 경우가 많아요.
주요 클래스와 함수
Phar 확장은 크게 Phar, PharData, PharFileInfo 클래스와 예외 클래스 PharException으로 구성돼요.
Phar— 실행 가능한 phar 아카이브를 다루는 클래스PharData— tar·zip 형식의 비실행형 아카이브를 다루는 클래스PharFileInfo— phar 안의 개별 파일 항목을 다루는 클래스
주요 메서드를 몇 가지 소개하면 이래요.
Phar::addFile,Phar::addFromString— 파일을 아카이브에 추가Phar::buildFromDirectory— 디렉터리 안의 파일로 아카이브 구성Phar::compress,Phar::compressFiles— Gzip/Bzip2 압축 적용Phar::convertToExecutable,Phar::convertToData— phar·tar·zip 형식 간 변환Phar::setStub,Phar::setDefaultStub— 로더/부트스트랩 스텁 설정Phar::extractTo— 아카이브 내용을 디렉터리로 추출Phar::getSignature— MD5/SHA1/SHA256/SHA512/OpenSSL 서명 반환Phar::interceptFileFuncs— fopen, file_get_contents, opendir 등 관련 함수를 가로채도록 지시
더 알아보기
- PHP: Phar 함수·클래스 - Manual — 전체 레퍼런스
- PHP: Phar 아카이브 만들기 — 배포용 아카이브 작성 방법
- PHP: Phar, Tar, Zip 비교 — 세 형식의 차이점