2024 年 PHP 日本会议

使用 Phar 归档:phar 流包装器

Phar 流包装器完全支持用于读写(非追加)的fopen()unlink()stat()fstat()fseek()rename()以及目录流操作opendir()rmdir()mkdir()

还可以使用流上下文操作 Phar 归档中的单个文件压缩和每个文件的元数据。

<?php
$context
= stream_context_create(array('phar' =>
array(
'compress' => Phar::GZ)),
array(
'metadata' => array('user' => 'cellog')));
file_put_contents('phar://my.phar/somefile.php', 0, $context);
?>

phar 流包装器不操作远程文件,因此即使禁用了allow_url_fopenallow_url_include INI 选项,也允许其操作。

虽然可以使用流操作从头开始创建 phar 归档,但最好使用 Phar 类中内置的功能。流包装器最适合只读操作。

添加注释

用户贡献的注释 2 条注释

pro-unreal.de 的工作人员
13 年前
请注意,phar 流包装器不适用于任何 glob。
当您决定将项目迁移到 phar 归档时,需要考虑这一点。

以下方法无效
<?php
glob
('phar://some.phar/*');
new
DirectoryIterator('glob://phar://some.phar/*');
?>

而以下方法有效
<?php
new DirectoryIterator('phar://some.phar/');
?>
carl@…com
13 年前
一些关于如何使用流包装器的示例将非常有帮助。
我的尝试只发现以下内容

<?php
$p
= new PharData(dirname(__FILE__).'/phartest.zip', 0,'phartest',Phar::ZIP) ;

$p->addFromString('testfile.txt',
'this is just some test text');

// 这有效
echo file_get_contents('phar://phartest.zip/testfile.txt');

// 这无效
file_put_contents('phar://phartest.zip/testfile.txt',
'Thist is text for testfile.txt');

$context = stream_context_create(
array(
'phar' =>array('compress' =>Phar::ZIP))
) ;

// 这无效
file_put_contents(
'phar://phartest.zip/testfile.txt',
'Thist is text for testfile.txt',0,$context);

// 这有效,但仅限于 'r' 只读模式。
$f = fopen(
'phar://C:\\Inetpub\\wwwroot\\PACT\\test\\phartest.zip\\testfile.txt',
'r') ;
?>
To Top