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();
?>

参见

添加备注

用户贡献的备注 1 则备注

anon at php dot com
3 年前
要从 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