2012-12-14 4 views
6

현재 프레임 워크의 확장 메커니즘을 실험하고 있습니다. 각 모듈은 적어도 하나의 PHP 파일 (단일 클래스 정의)과 XSL 스타일 시트로 구성되어 있지만 잠재적으로 다른 여러 파일이 포함될 수 있으므로 Phars를 사용하는 것을 즉시 고려했습니다.최소 PHP Phar 스텁

모든 것이 잘 어울리고 있지만 createDefaultStub()을 사용하지 않고 다음 스 니펫에서와 같이 Phar를 구성하면 결과가 크기의 4 분의 1이며 압축 된 버전보다 작습니다.

$phar = new Phar('Example.phar', 0, 'Example.phar'); 
$phar->buildFromDirectory(__DIR__ . '/src'); 
$phar->setStub('<?php __HALT_COMPILER();'); 
$phar->setSignatureAlgorithm(Phar::SHA256); 
$phar->compress(Phar::GZ); 

예제 파일 크기 :

8799 14 Dec 09:37 ExampleCog.phar (using createDefaultStub()) 
2143 14 Dec 10:08 ExampleCog.phar (using __HALT_COMPILER()) 
3373 14 Dec 10:08 ExampleCog.phar.gz (consistent with either method) 

의 Phar은 단순히 함께 번들 모듈 특정 파일을 유지하고 프레임 워크에 포함됩니다 사용됩니다 -이 어떤 의미를하지 않을 실행 독립 문맥. 내 질문에, 내가 무엇을 놓친거야 - 만약 - 최소한의 스텁 코드를 사용하여? 왜 압축 된 버전이 항상 같은 크기입니까?

답변

7

내가 궁금한 점은, 최소한의 스텁 코드를 사용하면 무엇을 놓치겠습니까?

의 Phar 기반의 Phar 아카이브 기본 스터브 대략의 Phar의 내용을 추출하고이를 실행하기위한 코드 7K 때 : file format documentation에서

는 기본 스텁으로 설명한다.

이 방법은의 Phar 아카이브에서 시작 파일을 실행하는 스텁을 만들 수있는 간단하고 쉬운 방법을 제공 :

그 후라고하는 Phar::createDefaultStub를 가리 킵니다. 또한 웹 서버를 통해 명령 줄에서 phar 아카이브를 실행하기 위해 다른 파일을 지정할 수 있습니다. 로더 스텁은 Phar :: interceptFileFuncs()를 호출하여 파일 시스템에 액세스하는 PHP 응용 프로그램을 번들로 묶을 수 있습니다. phar 확장자가 없으면 로더 스텁이 임시 디렉토리에 phar 아카이브를 추출한 다음 파일을 조작합니다. 종료 기능은 종료시 임시 파일을 지 웁니다.

강조 표시가 추가되어 기본 스텁이 너무 큰 이유입니다. 당신은 당신이 항상 PHP 5.3에서 작동 이상 거라고 가정 할 경우, 당신은 아마 기본 스텁이 필요하지 않으며 최소한의 __HALT_COMPILER

을 고수 할 수 그리고 왜 압축 버전은 항상 같은 크기?

Phad가 파일 단위 및 전체 압축 모두를 수행한다는 것을 설명하는 comparison between archive formats이 있습니다. gzip이 데이터를 더 이상 압축 할 수 없기 때문에 유사한 압축 크기를보고있을 가능성이 큽니다. 이것은 추측입니다.

+2

+1 : 매우 유용하고 잘 쓰여졌습니다. –