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 归档文件时,Phar::startBuffering() 方法可以提供显着的性能提升。通常,每次以任何方式创建或修改 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
'Could not create phar:', $e;
}
echo
'The new phar has ' . $p->count() . " entries\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 年前
要从 unix shell 脚本设置 ini 键 phar.readonly 为 0,这在运行时是可能的,请参见下文。
此页面上给出的示例在引用方面存在一些问题:(请参阅转换为单引号)

#!/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