Updated PHP Windows builds for Brotli security fix

Работа с 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 не работает с удалёнными файлами, поэтому обёртка работает даже при отключённых INI-директивах allow_url_fopen и allow_url_include.

Хотя потоковые операции умеют создавать phar-архивы с нуля, лучше обращаться к функциям класса Phar. С обёрткой потока лучше работать только для чтения.

+Добавить

Примечания пользователей 2 notes

up
4
staff at pro-unreal dot de
15 years ago
Please note that the phar stream wrapper does not work with any glob.
When you decide to move your project to phar archives you need to consider this.

The following won't work:
<?php
glob('phar://some.phar/*');
new DirectoryIterator('glob://phar://some.phar/*');
?>

While the following will work:
<?php
new DirectoryIterator('phar://some.phar/');
?>
up
0
carl at dot dot com
15 years ago
Some Examples of how to use the stream wrapper would be really helpful.  
My floundering attempts reveal only the following:

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

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

// This works
echo file_get_contents('phar://phartest.zip/testfile.txt');

//This Fails
file_put_contents('phar://phartest.zip/testfile.txt',
'Thist is text for testfile.txt');

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

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

// This works but only with 'r' readonly mode.
$f = fopen(
'phar://C:\\Inetpub\\wwwroot\\PACT\\test\\phartest.zip\\testfile.txt',
'r') ;
?>
To Top