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".
Phar::webPhar
(PHP >= 5.3.0, PECL phar >= 2.0.0)
Phar::webPhar — mapPhar para archivos phar basados en web. Controlador principal para aplicaciones web
Descripción
$alias
[, string $index = "index.php"
[, string $f404
[, array $mimetypes
[, callable $rewrites
]]]]] )Phar::mapPhar() para archivos phar basados en web. Este método procesa $_SERVER['REQUEST_URI'] y direcciona una petición de un navegador web a un fichero interno dentro de un archivo phar. En esencia, simula un servidor web, direccionando las peticiones al fichero correcto, enviando las cabeceras correctas y procesando ficheros PHP según sea necesario. Este poderoso método es parte de lo que hace sencillo convertir una apliación PHP existene en un archivo phar. Combinado con Phar::mungServer() y Phar::interceptFileFuncs(), cualquier aplicación web se puede utilizar sin modificaciones desde un archivo phar.
Phar::webPhar() debería llamarse solamente desde la rutina de interoperabilidad (stub) de un archivo phar (aquí hay más información de lo que es una rutina de interorperabilidad).
Parámetros
-
alias -
El alias que puede usarse en las URL phar:// para referirse a este archivo, en vez de su ruta completa.
-
index -
La ubicación dentro del phar del índice de directorios.
-
f404 -
La ubicación del script a ejecutar cuando no se encuentra el fichero. Este script debería mostrar las cabeceras HTTP 404 apropiadas.
-
mimetypes -
Un array que mapea extensiones de fichero adicionales a tipos de MIME. Si el mapeo predeterminado es suficiente, se ha de pasar un array vacío. Por omisión, estas extensiones son mapeadas a estos tipos de MIME:
<?php
$mimes = array(
'phps' => Phar::PHPS, // pasa a 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, // procesado como PHP
'inc' => Phar::PHP, // procesado como 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',
);
?> -
rewrites -
A la función rewrites se le proporciona un string como único parámetro y debe devolver un string o
FALSE.Si se está utilizando fast-cgi o cgi, el parámetro pasado a la función es el valor de la variable $_SERVER['PATH_INFO']. De otro modo, el parámetro pasado a la función es el valor de la variable $_SERVER['REQUEST_URI'].
Si se devuelve un string, este se usa como la ruta de fichero interno. Si se devuelve
FALSE, webPhar() enviará un código de rechazo HTTP 403.
Valores devueltos
No devuelve ningún valor.
Errores/Excepciones
Lanza una excepción de tipo PharException cuando no se puede abrir el fichero
interno para salida, o si se llama desde un lugar que no sea
una rutina de interoperabilidad. Si se pasa un array no válido a
mimetypes o se proporciona una llamada de retorno no válida a rewrites,
se lanza una excepción de tipo UnexpectedValueException.
Ejemplos
Ejemplo #1 Un ejemplo de Phar::webPhar()
Con el ejemplo siguiente, el phar creado mostrará Hola Mundo si uno explora /miphar.phar/index.php o /miphar.phar, y mostrará la fuente de index.phps si uno explora /miphar.phar/index.phps.
<?php
// creating the phar archive:
try {
$phar = new Phar('miphar.phar');
$phar['index.php'] = '<?php echo "Hola Mundo"; ?>';
$phar['index.phps'] = '<?php echo "Hola Mundo"; ?>';
$phar->setStub('<?php
Phar::webPhar();
__HALT_COMPILER(); ?>');
} catch (Exception $e) {
// manejar errores
}
?>
Ver también
- Phar::mungServer() - Definir una lista de hasta 4 variables $_SERVER que debería ser modificadas para la ejecución
- Phar::interceptFileFuncs() - Ordenar a phar interceptar fopen, file_get_contents, opendir, y todas las funciones relacionadas con estadísticas
It appears that the $rewrites parameter is a callback not an array. The implementation seems to be more in tune with this note http://www.mail-archive.com/internals@lists.php.net/msg33627.html , although, I was unable to figure out when or if a parameter gets passed to that function. I implemented it as follows:
<?php
$phar_name = 'mysite.phar';
function phar_rewrites()
{
$r = $_SERVER['REQUEST_URI'];
if (file_exists("phar://$phar_name$r")) return $r;
else return 'index.php';
}
$phar = new Phar();
/*
* do stuff to set up phar
*/
$phar->webPhar($phar_name, 'index.php', '404.php', $mimes, 'phar_rewrites');
?>
The above implementation will also stop the phar from sending out a 301 redirect to the index file when you rewrite (in apache) all requests to the phar.
