2024 年日本 PHP 研討會

Phar::webPhar

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Phar::webPhar將網頁瀏覽器的請求路由至 Phar 封存檔內的檔案

說明

final public static Phar::webPhar(
    ?string $alias = null,
    ?字串 $index = null,
    ?字串 $fileNotFoundScript = null,
    陣列 $mimeTypes = [],
    ?可呼叫 $rewrite = null
):

Phar::webPhar() 的作用類似於網頁 Phar 檔案的 Phar::mapPhar()。此方法會解析 $_SERVER['REQUEST_URI'] 並將來自網頁瀏覽器的請求路由到 Phar 封存內的內部檔案。它模擬網頁伺服器,將請求路由到正確的檔案,回應正確的標頭,並根據需要解析 PHP 檔案。結合 Phar::mungServer()Phar::interceptFileFuncs(),任何網頁應用程式都可以直接從 Phar 封存中使用,無需修改。

Phar::webPhar() 應該只能從 Phar 封存的 stub 呼叫(有關 stub 的更多資訊,請參見這裡)。

參數

別名 (alias)

可用於 phar:// URL 中來參考此封存的別名,而不是其完整路徑。

索引 (index)

Phar 封存內目錄索引的位置。

找不到檔案的腳本 (fileNotFoundScript)

找不到檔案時要執行的腳本位置。此腳本應該輸出正確的 HTTP 404 標頭。

MIME 類型 (mimeTypes)

將其他檔案副檔名映射到 MIME 類型的陣列。如果預設映射已足夠,請傳遞一個空陣列。預設情況下,這些副檔名會映射到這些 MIME 類型

<?php
$mimes
= array(
'phps' => Phar::PHPS, // pass to highlight_file()
'c' => 'text/plain',
'cc' => 'text/plain',
'cpp' => 'text/plain',
'c++' => 'text/plain',
'dtd' => 'text/plain',
'h' => 'text/plain',
'log' => 'text/plain',
'rng' => 'text/plain',
'txt' => 'text/plain',
'xsd' => 'text/plain',
'php' => Phar::PHP, // parse as PHP
'inc' => Phar::PHP, // parse as PHP
'avi' => 'video/avi',
'bmp' => 'image/bmp',
'css' => 'text/css',
'gif' => 'image/gif',
'htm' => 'text/html',
'html' => 'text/html',
'htmls' => 'text/html',
'ico' => 'image/x-ico',
'jpe' => 'image/jpeg',
'jpg' => 'image/jpeg',
'jpeg' => 'image/jpeg',
'js' => 'application/x-javascript',
'midi' => 'audio/midi',
'mid' => 'audio/midi',
'mod' => 'audio/mod',
'mov' => 'movie/quicktime',
'mp3' => 'audio/mp3',
'mpg' => 'video/mpeg',
'mpeg' => 'video/mpeg',
'pdf' => 'application/pdf',
'png' => 'image/png',
'swf' => 'application/shockwave-flash',
'tif' => 'image/tiff',
'tiff' => 'image/tiff',
'wav' => 'audio/wav',
'xbm' => 'image/xbm',
'xml' => 'text/xml',
);
?>

重寫 (rewrite)

重寫函式會接收一個字串作為其唯一參數,並且必須回傳一個 字串false

如果您使用的是 fast-cgi 或 cgi,則傳遞給函式的參數是 $_SERVER['PATH_INFO'] 變數的值。否則,傳遞給函式的參數是 $_SERVER['REQUEST_URI'] 變數的值。

如果回傳一個字串,它將用作內部檔案路徑。如果回傳 false,則 webPhar() 將發送 HTTP 403 Denied Code。

回傳值

不回傳任何值。

錯誤/例外

當無法開啟要輸出的內部檔案時,或從非 stub 呼叫時,會拋出 PharException。如果將無效的陣列值傳遞給 mimeTypes 或將無效的回呼傳遞給 rewrite,則會拋出 UnexpectedValueException

變更記錄

版本 說明
8.0.0 fileNotFoundScriptrewrite 現在可以為 null。

範例

範例 #1 一個 Phar::webPhar() 的例子

在下面的例子中,建立的 phar 檔案如果瀏覽到 /myphar.phar/index.php/myphar.phar 將會顯示 Hello World,而如果瀏覽到 /myphar.phar/index.phps 則會顯示 index.phps 的原始碼。

<?php
// 建立 phar 封存檔:
try {
$phar = new Phar('myphar.phar');
$phar['index.php'] = '<?php echo "Hello World"; ?>';
$phar['index.phps'] = '<?php echo "Hello World"; ?>';
$phar->setStub('<?php
Phar::webPhar();
__HALT_COMPILER(); ?>'
);
} catch (
Exception $e) {
// 在此處理錯誤
}
?>

參見

新增筆記

使用者貢獻的筆記 1 則筆記

1
James
12 年前
在函式內呼叫 Phar::webPhar() 似乎是個壞主意。這樣做會導致被引入檔案中的全域變數失效。例如,不要嘗試這樣做

<?php
$phar
= new Phar('test.phar.php');
$phar['test.php'] = '<?php
$FOO = "globals work";
function test() {
global $FOO;
echo "test: $FOO\n";
}
test();
?>'
;
$phar->setStub('<?php
function _bootstrap() {
Phar::webPhar();
}
_bootstrap();
__HALT_COMPILER(); ?>'
);
?>

輸出將會是 "test:",而不是 "test: globals work"。
To Top