SunshinePHP 2020 CFP Started

Использование Phar-архивов: обертка потока phar

Обертка потока Phar полностью поддерживает fopen() для чтения и записи (не для добавления), unlink(), stat(), fstat(), fseek(), rename() и потоковые операции каталогов, такие как opendir(), а начиная с версии 2.0.0 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. Обертку потока лучше всего использовать только для чтения.

add a note add a note

User Contributed Notes 2 notes

up
4
staff at pro-unreal dot de
8 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
1
carl at dot dot com
8 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