這裡有一個 apache2 htaccess 範例,可防止使用者下載 phar 封存檔
RewriteEngine on
RewriteRule ^(.*)\.phar$ - [F]
它會觸發「403 - 禁止」訊息,而不是傳送封存檔。
這裡有一個 apache2 htaccess 範例,可防止使用者下載 phar 封存檔
RewriteEngine on
RewriteRule ^(.*)\.phar$ - [F]
它會觸發「403 - 禁止」訊息,而不是傳送封存檔。
如果您嘗試存取 phar 網頁時出現空白頁面,則可能是您的 PHP 上有 Suhosin (如在 Debian 和 Ubuntu 中),您需要將此加入您的 php.ini 中,以允許執行 PHAR 封存檔
suhosin.executor.include.whitelist="phar"
使用者應設定 `sys_temp_dir` 指令。
PHAR 會將暫存檔儲存在 `sys_temp_dir` 或目前的工作目錄 (CWD) 中。
如果您的 CWD 位於遠端檔案系統上,這點尤其重要。網頁伺服器叢集通常會在每個網頁伺服器之間共用一個通用檔案系統(使用 NFS、DFS 等)。在這種情況下,如果您不將 `sys_temp_dir` 設定為本機目錄,PHAR 將會在網路上建立暫存檔,這將導致效能和功能問題。
這裡有一個使用 CLI 建立 phar 檔案的非常簡單的程式。請注意,這需要在 php.ini 中將 phar.readonly 設定為 false (Off)。
<?php
$filename = "default";
$dir = "./";
$regex = "/^(?!.*build\\.php)(?:.*)$/";
$main = "main.php";
$shebang = "#!/usr/bin/env php";
$chmod = true;
for ($i = 0; $i < $argc; $i++) {
switch ($argv[$i]) {
case "-o":
$i++;
if ($i >= $argc) {
echo "缺少輸出檔案名稱" . PHP_EOL;
exit(1);
}
$filename = $argv[$i];
break;
case "-i":
$i++;
if ($i >= $argc) {
echo "缺少輸入目錄名稱" . PHP_EOL;
exit(1);
}
$dir = $argv[$i];
break;
case "-p":
$i++;
if ($i >= $argc) {
echo "缺少正規表示式模式" . PHP_EOL;
exit(1);
}
$regex = $argv[$i];
break;
case "-m":
$i++;
if ($i >= $argc) {
echo "缺少主要檔案" . PHP_EOL;
exit(1);
}
$main = $argv[$i];
break;
case "-b":
$i++;
if ($i >= $argc) {
echo "缺少檔案的 Shebang" . PHP_EOL;
exit(1);
}
$shebang = $argv[$i];
break;
case "--no-chmod":
$chmod = false;
break;
}
}
if (file_exists($filename)) unlink($filename);
$phar = new Phar($filename);
$phar->buildFromDirectory($dir, $regex);
$phar->setStub(($shebang ? $shebang . PHP_EOL : "") . $phar->createDefaultStub($main));
if ($chmod) {
chmod($filename, fileperms($phar) | 0700);
}
當透過 phar:// 讀取時,串流會將物件 (包括 phar 檔案) 還原序列化
使用此方法建立 phar
<?php
// 建立新的 Phar
$phar = new Phar('lemon.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub('<?php __HALT_COMPILER(); ? >');
// 新增任何類別的物件做為中繼資料
class AnyClass {}
$object = new AnyClass;
$object->data = 'Chanh';
$phar->setMetadata($object);
$phar->stopBuffering();
?>
並使用以下方法讀取
<?php
class AnyClass {
function __destruct() {
echo $this->data;
}
}
// 輸出:Chanh
file_get_contents('phar://test.phar');
?>
這裡有一個非常簡單的類別,可從給定的來源目錄建置 phar 檔案。您可以將其用於您自己的專案和簡單的部署。
但我主要目的是示範如何以簡單的方式使用 PHAR 函式。
<?php
class BuildPhar
{
private $_sourceDirectory = null;
private $_stubFile = null;
private $_outputDirectory = null;
private $_pharFileName = null;
/**
* @param $_sourceDirectory // 這是您的專案存放的目錄。
* @param $stubFile // 設定您的 phar 檔案的進入點。這個檔案必須在來源目錄內。
* @param null $_outputDirectory // phar 檔案將被放置的目錄。
* @param string $pharFileName // 您最終的 *.phar 檔案名稱。
*/
public function __construct($_sourceDirectory, $stubFile, $_outputDirectory = null, $pharFileName = 'myPhar.phar') {
if ((file_exists($_sourceDirectory) === false) || (is_dir($_sourceDirectory) === false)) {
throw new Exception('未提供有效的來源目錄。');
}
$this->_sourceDirectory = $_sourceDirectory;
if (file_exists($this->_sourceDirectory.'/'.$stubFile) === false) {
throw new Exception('您提供的 stub 檔案不存在。');
}
$this->_stubFile = $stubFile;
if(empty($pharFileName) === true) {
throw new Exception('您提供的 phar 檔案輸出名稱為空。');
}
$this->_pharFileName = $pharFileName;
if ((empty($_outputDirectory) === true) || (file_exists($_outputDirectory) === false) || (is_dir($_outputDirectory) === false)) {
if ($_outputDirectory !== null) {
trigger_error ( '您的輸出目錄無效。我們將回退到:"'.dirname(__FILE__).'" 。', E_USER_WARNING);
}
$this->_outputDirectory = dirname(__FILE__);
} else {
$this->_outputDirectory = $_outputDirectory;
}
$this->prepareBuildDirectory();
$this->buildPhar();
}
private function prepareBuildDirectory() {
if (preg_match('/.phar$/', $this->_pharFileName) == FALSE) {
$this->_pharFileName .= '.phar';
}
if (file_exists($this->_pharFileName) === true) {
unlink($this->_pharFileName);
}
}
private function buildPhar() {
$phar = new Phar($this->_outputDirectory.'/'.$this->_pharFileName);
$phar->buildFromDirectory($this->_sourceDirectory);
$phar->setDefaultStub($this->_stubFile);
}
}
//END Class
//範例用法:
$builder = new BuildPhar(
dirname(__FILE__).'/_source',
'my_default_stub.php',
dirname(__FILE__).'/_output',
'my-phar-file.phar'
);