PHP workshop for 2 days with Shopware, Sylius, PHPUnit and Codeception in Duisburg

Phar::webPhar

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

Phar::webPharНаправляет запрос из браузера во внутренний файл в phar-архиве

Описание

final public static Phar::webPhar(
    ?string $alias = null,
    ?string $index = null,
    ?string $fileNotFoundScript = null,
    array $mimeTypes = [],
    ?callable $rewrite = null
): void

Phar::webPhar() служит Phar::mapPhar() для веб-архивов phar. Метод анализирует $_SERVER['REQUEST_URI'] и направляет запрос из браузера во внутренний файл в phar-архиве. Он имитирует веб-сервер, направляет запросы к нужному файлу, отображает правильные заголовки и анализирует файлы PHP по мере необходимости. В сочетании с Phar::mungServer() и Phar::interceptFileFuncs(), любое веб-приложение можно использовать без изменений из phar-архива.

Phar::webPhar() должен вызываться только из заглушки (stub) phar-архива (о том, что такое заглушка и как с ним работать, читайте тут).

Список параметров

alias

Псевдоним для использования в обёртках phar://.

index

Местоположение в phar-архиве индексного файла.

fileNotFoundScript

Местоположение скрипта, отвечающего за обработку ошибки HTTP 404. Скрипт должен возвращать корректные заголовки для этой ошибки.

mimeTypes

Массив сопоставления расширений файлов типам MIME. Если достаточно сопоставления по умолчанию, то передайте сюда пустой массив. По умолчанию используются такие сопоставления:

<?php
$mimes 
= array(
    
'phps' => Phar::PHPS// передаётся в highlight_file()
    
'c' => 'text/plain',
    
'cc' => 'text/plain',
    
'cpp' => 'text/plain',
    
'c++' => 'text/plain',
    
'dtd' => 'text/plain',
    
'h' => 'text/plain',
    
'log' => 'text/plain',
    
'rng' => 'text/plain',
    
'txt' => 'text/plain',
    
'xsd' => 'text/plain',
    
'php' => Phar::PHP// разбирается как PHP
    
'inc' => Phar::PHP// разбирается как PHP
    
'avi' => 'video/avi',
    
'bmp' => 'image/bmp',
    
'css' => 'text/css',
    
'gif' => 'image/gif',
    
'htm' => 'text/html',
    
'html' => 'text/html',
    
'htmls' => 'text/html',
    
'ico' => 'image/x-ico',
    
'jpe' => 'image/jpeg',
    
'jpg' => 'image/jpeg',
    
'jpeg' => 'image/jpeg',
    
'js' => 'application/x-javascript',
    
'midi' => 'audio/midi',
    
'mid' => 'audio/midi',
    
'mod' => 'audio/mod',
    
'mov' => 'movie/quicktime',
    
'mp3' => 'audio/mp3',
    
'mpg' => 'video/mpeg',
    
'mpeg' => 'video/mpeg',
    
'pdf' => 'application/pdf',
    
'png' => 'image/png',
    
'swf' => 'application/shockwave-flash',
    
'tif' => 'image/tiff',
    
'tiff' => 'image/tiff',
    
'wav' => 'audio/wav',
    
'xbm' => 'image/xbm',
    
'xml' => 'text/xml',
);
?>

rewrite

Функция перезаписи, которой передаётся единственный строковый параметр и которая должна также вернуть строку, либо false.

Если вы используете fast-cgi или cgi, то параметром, передаваемым в эту функцию будет значение переменной $_SERVER['PATH_INFO']. В ином случае передаваться будет значение переменной $_SERVER['REQUEST_URI'].

Если будет возвращена строка, то она будет использована как путь к файлу внутри архива. Если вернётся false, то webPhar() пошлёт код ошибки HTTP 403.

Возвращаемые значения

Функция не возвращает значения после выполнения.

Ошибки

Выбросит исключение PharException, если будет невозможно открыть какой-либо файл, либо если вызывать её не из заглушки. Если в параметре mimeTypes указать некорректный MIME-тип, или в rewrite будет передана некорректная функция обратного вызова, то будет выброшено исключение UnexpectedValueException.

Список изменений

Версия Описание
8.0.0 fileNotFoundScript, mimeTypes и rewrite теперь допускают значение null.

Примеры

Пример #1 Пример использования Phar::webPhar()

В примере ниже, созданный phar отобразит Hello World при обращении из браузера к /myphar.phar/index.php или к /myphar.phar, и отобразит исходный код index.phps при обращении к /myphar.phar/index.phps.

<?php
// создаём архив:
try {
    
$phar = new Phar('myphar.phar');
    
$phar['index.php'] = '<?php echo "Hello World"; ?>';
    
$phar['index.phps'] = '<?php echo "Hello World"; ?>';
    
$phar->setStub('<?php
Phar::webPhar();
__HALT_COMPILER(); ?>'
);
} catch (
Exception $e) {
    
// обработка ошибок
}
?>

Смотрите также

  • Phar::mungServer() - Определить список до четырёх $_SERVER-переменных, которые должны быть изменены для запуска
  • Phar::interceptFileFuncs() - Указывает phar перехватывать fopen, file_get_contents, opendir и все stat-функции

add a note add a note

User Contributed Notes 1 note

up
1
James
9 years ago
It seems that calling Phar::webPhar() from inside a function is a bad idea.  Doing so will cause global variables in included files to not be global.  For instance, do NOT try this:

<?php
$phar
= new Phar('test.phar.php');
$phar['test.php'] = '<?php
$FOO = "globals work";
function test() {
  global $FOO;
  echo "test: $FOO\n";
}
test();
?>'
;
$phar->setStub('<?php
function _bootstrap() {
Phar::webPhar();
}
_bootstrap();
__HALT_COMPILER(); ?>'
);
?>

The output will be "test:", not "test: globals work".
To Top