PHP Conference Japan 2024

Phar::mapPhar

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

Phar::mapPhar讀取目前執行的檔案 (一個 phar 封存) 並註冊其清單

說明

final public static Phar::mapPhar(?string $alias = null, int $offset = 0): bool

這個靜態方法只能在 Phar 封存的載入器 stub 中使用,以便在 Phar 直接執行或包含在其他腳本中時初始化 Phar。

參數

alias(別名)

可以在 phar:// URL 中使用的別名,用於引用此封存,而不是其完整路徑。

offset(偏移量)

未使用變數,此處是為了與 PEAR 的 PHP_Archive 相容。

返回值

成功時返回 true,失敗時返回 false

錯誤/例外

如果未在 PHP 執行中直接呼叫、如果在目前的原始碼檔案中找不到 __HALT_COMPILER(); 標記,或者如果無法開啟檔案以進行讀取,則會擲出 PharException

範例

範例 #1 Phar::mapPhar() 範例

mapPhar 應該只在 phar 的載入器 stub 中使用。使用 loadPhar 將外部 phar 載入到記憶體中。

以下是一個使用 mapPhar 的 Phar 載入器 stub 範例。

<?php
function __autoload($class)
{
include
'phar://me.phar/' . str_replace('_', '/', $class) . '.php';
}
try {
Phar::mapPhar('me.phar');
include
'phar://me.phar/startup.php';
} catch (
PharException $e) {
echo
$e->getMessage();
die(
'無法初始化 Phar');
}
__HALT_COMPILER();

參見

新增註記

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

phofstetter at sensational dot ch
11 年前
使用 mapPhar 和像 opcache 之類的 opcode 快取時要小心:它們可能會根據您提供的符號名稱快取由符號名稱包含的檔案。

當伺服器託管多個不同版本的 phar 檔案,且都使用相同的符號名稱時,這會成為一個問題,因為後續在 phar 檔案中的 include() 呼叫可能會從另一個版本的 phar 檔案載入已快取的檔案。

請改為產生唯一的名稱,並在 mapPhar 和後續的 include() 呼叫中使用該名稱。

例如,請參閱 https://github.com/zendtech/ZendOptimizerPlus/issues/115#issuecomment-25612769 以瞭解 opcache 模組中的問題。
To Top