Phar建立與使用

回覆文章
yehlu
Site Admin
文章: 3244
註冊時間: 2004-04-15 17:20:21
來自: CodeCharge Support Engineer

Phar建立與使用

文章 yehlu »

http://scar.simcz.tw/article/2013/01/09 ... e-and-use/

這幾天為了Pointless而嘗試使用Phar去包裝整套系統,但除了官方文件之外,中文的資源相當的少,所以我在這邊筆記一下使用方法與問題

Phar

Phar(PHP Archive)它是PHP的extension,就像是Java的jar一樣可以用來打包程式碼,可讓專案易於散佈並安裝使用

包裝PHP Source

1<?php
2$phar = new Phar('bin/pointless.phar');
指定Phar的路徑以及名稱,需要注意的是結尾一定要用.phar

1$phar->setAlias('poi.phar');
Alias用來設定Phar檔的別名

1$phar->setStub("<?php Phar::mapPhar('poi.phar'); define('ROOT', 'phar://poi.phar/'); require ROOT. 'Boot.php'; __HALT_COMPILER(); ?>");
Stub的用途是,如果你不是在PHP檔案中引用Phar檔案,而是直接用Phar作為執行檔,它就會以Stub作為預設的呼叫對象

而在Stub中用到的mapPhar的作用是指定並註冊為你所設定的Phar檔,Phar會使用執行檔的名稱作為註冊的依據

1$phar->buildFromDirectory(dirname(__FILE__) . '/pointless');
buildFromDirectory則是指定要打包成Phar檔的資料夾

1$phar->compressFiles(Phar::GZ);
compressFiles設定Phar的打包格式,除了Phar::GZ還有Phar::BZ2

1$phar->stopBuffering();
stopBuffering用來將打包好的Phar檔寫入磁碟

使用方式

1<?php
2Phar::mapPhar('poi.phar');
3require 'phar://poi.phar/Boot.php';
4
5$boot = new Boot();
6$boot->run();
假設在原本打包的資料夾的根目錄下有個叫做Boot.php的檔案,可以這樣呼叫並使用

1php ./pointless.phar
如果是直接當成可執行檔,可以這樣使用,如果要直接執行那麼就要在Stub中的第一行加入#!/usr/bin/env php

Example

1<?php
2$stub = <<<EOF
#!/usr/bin/env php
<?php
Phar::mapPhar('poi.phar');
require 'phar://poi.phar/Boot.php';
__HALT_COMPILER();
?>
EOF;
3
4$phar = new Phar('pointless.phar');
5$phar->setAlias('poi.phar');
6$phar->setStub($stub);
7$phar->buildFromDirectory(dirname(__FILE__) . '/pointless');
8$phar->compressFiles(Phar::GZ);
9$phar->stopBuffering();
注意

1PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'creating archive "poi.phar" disabled by the php.ini setting phar.readonly' in /path/to/build.php:20
2Stack trace:
3#0 /path/to/build.php(20): Phar->__construct('poi.phar')
4#1 {main}
5 thrown in /path/to/build.php on line 20
如果在打包Phar時發生以上錯誤,那麼就去把php.ini中的Phar設定改為以下內容

1[Phar]
2; http://php.net/phar.readonly
3phar.readonly = Off
4
5; http://php.net/phar.require-hash
6;phar.require_hash = On
7
8;phar.cache_list =
Reference

PHP: Phar
[PHP] PHP 5.3 的新特色: Phar
PHP V5.3 中的新特性,第 4 部分: 创建并使用 Phar 归档
yehlu
Site Admin
文章: 3244
註冊時間: 2004-04-15 17:20:21
來自: CodeCharge Support Engineer

Re: Phar建立與使用

文章 yehlu »

http://www.jaceju.net/blog/archives/344/

PHP 5.3 帶來很多有趣的特色,其中一個就是可以把你的 Library 打包成 phar 格式,並透過 require 敘述來引用裡面的程式碼。

首先你可以用 PHP 5.3 的新類別 Phar 來打包你想要的程式碼 (通常是類別檔案) :

1
2
3
4
5
<?php
$phar = new Phar('My.phar', 0, 'My.phar'); // 建立 My.phar 檔案
$phar->buildFromDirectory(dirname(__FILE__) . '/My', '/\.php$/'); // 打包所有 My 目錄下的 php 檔案
$phar->compressFiles( Phar::GZ ); // 以 GZ 格式壓縮
$phar->stopBuffering(); // 壓縮完成,寫入 phar 檔
然後你可以整包引入:

1
require 'My.phar';
也可以單獨引入其中的某支檔案:

1
require 'phar://My.phar/src/Test.php';
就連 PHPUnit 3.3 也試用 Phar 來打包囉了!

那麼效能呢?據 Jan Schneider 的消息指出, PHP 的開發團隊已經把這個功能的效能調整到接近 native PHP 的執行進度了!

很酷吧?期待 PHP 5.3 的來臨吧!

參考

Friday afternoon toying: eZ Components as phar
回覆文章

回到「PHP」