PHP Conference Japan 2024

Phar::startBuffering

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

Phar::startBuffering開始緩衝 Phar 寫入操作,不要修改磁碟上的 Phar 物件

說明

public Phar::startBuffering(): void

雖然技術上並非必要,但 Phar::startBuffering() 方法在建立或修改包含大量檔案的 Phar 封存時,可以顯著提升效能。通常,每次在 Phar 封存中建立或修改檔案時,整個 Phar 封存都會隨著變更重新建立。如此一來,封存就能與在其上執行的活動保持同步。

然而,在單純建立新的 Phar 封存時,這可能是不必要的,因為一次寫入整個封存會更有效率。同樣地,通常需要進行一系列的變更,並在對磁碟進行任何變更之前確保所有變更都可行,類似於關聯式資料庫中的交易概念。Phar::startBuffering()/Phar::stopBuffering() 這對方法就是為此目的而提供的。

Phar 寫入緩衝是針對每個封存個別進行的,對 foo.phar Phar 封存啟用的緩衝並不會影響對 bar.phar Phar 封存的變更。

參數

此函式沒有參數。

回傳值

無回傳值。

範例

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

<?php
// 確保檔案不存在
@unlink('brandnewphar.phar');
try {
$p = new Phar(dirname(__FILE__) . '/brandnewphar.phar', 0, 'brandnewphar.phar');
} catch (
Exception $e) {
echo
'無法建立 phar:', $e;
}
echo
'新的 phar 有 ' . $p->count() . " 個項目\n";
$p->startBuffering();
$p['file.txt'] = 'hi';
$p['file2.txt'] = 'there';
$p['file2.txt']->setCompressedGZ();
$p['file3.txt'] = 'babyface';
$p['file3.txt']->setMetadata(42);
$p->setStub("<?php
function __autoload(
$class)
{
include 'phar://myphar.phar/' . str_replace('_', '/',
$class) . '.php';
}
Phar::mapPhar('myphar.phar');
include 'phar://myphar.phar/startup.php';
__HALT_COMPILER();"
);
$p->stopBuffering();
?>

參見

  • Phar::stopBuffering() - 停止緩衝 Phar 封存的寫入請求,並將變更儲存到磁碟
  • Phar::isBuffering() - 用於判斷 Phar 寫入操作是否正在被緩衝,或者是否直接寫入磁碟。

新增註解

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

anon at php dot com
4 年前
要將 ini 鍵值 phar.readonly 設定為 0,從 Unix shell 腳本中,可以即時完成,如下所示。
此頁面上提供的範例在引號方面存在一些問題:(請參閱轉換為單引號)

#!/usr/bin/php -d phar.readonly=0
<?php
print(ini_get('phar.readonly')); // 必須回傳 0
// 確保它不存在
@unlink('brandnewphar.phar');
try {
$p = new Phar(dirname(__FILE__) . '/brandnewphar.phar', 0, 'brandnewphar.phar');
} catch (
Exception $e) {
echo
'無法建立 phar:', $e;
}
echo
'新的 phar 有 ' . $p->count() . " 個項目\n";
$p->startBuffering();
$p['file.txt'] = 'hi';
$p['file2.txt'] = 'there';
$p['file2.txt']->compress(Phar::GZ);
$p['file3.txt'] = 'babyface';
$p['file3.txt']->setMetadata(42);
$p->setStub('<?php
function __autoload($class)
{
include "phar://myphar.phar/" . str_replace("_", "/", $class) . ".php";
}
Phar::mapPhar("myphar.phar");
include "phar://myphar.phar/startup.php";
__HALT_COMPILER();'
);
$p->stopBuffering();

// 測試
$m = file_get_contents("phar://brandnewphar.phar/file2.txt");
$m = explode("\n",$m);
var_dump($m);
/* 輸出:
* there
**/
To Top