¿Cómo ejecutar un archivo PHP webphar desde un servidor web PHP 5.4 incorporado?
php-5.4 (8)
Según el título, he creado un phar de prueba muy simple. Me gustaría probarlo con el servidor web incorporado (PHP 5.4) pero parece imposible.
php -S localhost:80 /path/to/myphar.php
Resultado: página en blanco (en el controlador frontal de phar está index.php
realizando alguna salida HTML).
php -S localhost:80 -t /path/to/folder_with_index_and_phar
Con script de cargador:
<?php
require ''phar://myphar.php''
Resultado en una página en blanco, de nuevo.
¿Es esto posible o tengo que usar Apache?
EDIT : después de un año necesito esto otra vez. Aquí está lo que está pasando (de las respuestas):
php -S localhost:80 -t /path/to/app.phar
php -S localhost:80 -t /path/to/app.phar
Resultados en un error: /path/to/app.phar no es un directorio.
Mientras:
php -S localhost:80 -t .
http://localost/app.phar/foo/bar
Funciona, pero no necesito el prefijo app.phar !
El uso de Apache y la configuración del índice del directorio en app.phar funciona como se esperaba.
¿Qué hay de crear un archivo index.php en el mismo directorio que app.phar? Su contenido debe ser:
<?php
require "myapp.phar";
?>
Luego acceda a él sirviendo ese archivo index.php usando el comando php -S localhost:80 /path/to/pharapp/index.php
Después de horas de perder el tiempo con el servidor web incorporado, finalmente encontró la solución a lo que está buscando. La clave es el archivo enrutador para el servidor web. Siga el procedimiento a continuación
1) Cree un archivo router.php para el servidor web incorporado con el siguiente contenido
$path = $_SERVER["REQUEST_URI"];
if($pathPosition = strpos($path,''/myapp'') !== false){
//Request has been made to Phar-ed application
$pathPosition += strlen(''/myapp'');
$file = substr($path, $pathPosition);
//Here include the base path of your Phar-ed application with file path
//I placed myphar.phar and router.php in the root directory for this example
require_once("phar://myphar.phar/$file");
exit;
}
return FALSE;
Lo que hace esto: comprueba el Uri para el nombre de su aplicación, en mi caso "/ myapp" y luego extrae la ruta del archivo al que desea acceder. Luego incluye el archivo phared deseado en el script actual y sale. De lo contrario, procesa la solicitud como de costumbre.
2) Inicie el servidor web incorporado de la siguiente manera:
php -S localhost:80 -t . router.php
Lo que hace esto: enciende el servidor web incorporado que crea el directorio actual como carpeta raíz del documento y usa router.php como archivo del enrutador (ubicado en la misma carpeta)
3) Hacer una solicitud en el navegador de esta manera:
http://localhost/myapp/foo/bar
Obtendrá el archivo Phar-ed de su aplicación .phar
Déjame saber en caso de preguntas.
Nota: también puede usar expresiones regulares para hacer coincidir el patrón Uri en router.php
En Windows, si está utilizando el servicio xampp, puede usar este comando en la línea de comandos.
C:/xampp/php>"C:/xampp/php/php.exe" "C:/xampp/php/pharcommand.phar"
Por lo tanto, no entiendo por qué necesita el servidor Apache. Despues del comando
php -S localhost:80 -t /path/to/myphar.php
PHP 5.5.9-1ubuntu4 Development Server started at Fri Jun 6 22:27:49 2014
Listening on http://localhost:80
Document root is /tmp/http
Press Ctrl-C to quit.
Significa que todo está bien, ve a la barra de direcciones de tu navegador y escribe
http://localhost:80
y ver el resultado de la ejecución del script.
Puede ejecutar una barra web con el servidor web incorporado cambiando el nombre de phar para tener una extensión .php
(por ejemplo, mv app.phar app.php
), apuntando a ese directorio:
php -S localhost:80 -t /path/to/phar
y accediendo a él como http://localhost/app.php/someroute.php
. La parte difícil suele ser configurar el código auxiliar , desechar el entorno y generar el phar .
Si está dispuesto a ser un poco más flexible, puede hacer lo que quiera al crear un archivo index.php
y luego incluir su .phar
que es posible de acuerdo con la documentación que indica que:
Usar una biblioteca de archivos Phar es idéntico a usar cualquier otra biblioteca PHP:
Por lo tanto, simplemente puedes incluirlo normalmente como tal:
<?php require_once "app.phar";
Después de ejecutar php -S localhost:80
se ejecutará el index.php y puede acceder a él a través de http://localhost
.
php -S localhost:80 -t /path/to/phar
no funcionará ya que el argumento -t
está destinado a ser utilizado para directorios. El truco es que el servidor web php admite pasar un enrutador como argumento. Por lo tanto, suponga que su phar está en / tmp (puede estar en cualquier parte), así es como crea un enrutador simple y configura el servidor web:
echo ''<?php require("/path/to/phar");''>/tmp/router.php
php -S localhost:80 /tmp/router.php
php -S localhost:8080 phpinfo.phar
Eso pareció funcionar bien para mí desde un simple archivo phpinfo();
que creé para poner phpinfo();
Noté en la documentación de PHP, al crear el archivo PHAR, que parece que necesita configurar apéndices para las interfaces CLI y WWW.
http://php.net/manual/en/phar.buildfromdirectory.php
<?php
// create with alias "project.phar"
$phar = new Phar(''project.phar'', 0, ''project.phar'');
// add all files in the project
$phar->buildFromDirectory(dirname(__FILE__) . ''/project'');
$phar->setStub($phar->createDefaultStub(''cli/index.php'', ''www/index.php''));
EDITAR
Específicamente, esto es lo que hice.
#!/usr/bin/env php
<?php
$phar = new Phar(''phpinfo.phar'', 0, ''phpinfo.phar'');
$phar->buildFromDirectory(__DIR__ . ''/phpinfo'');
$phar->setStub($phar->createDefaultStub(''index.php''));
para crear un archivo phar de un directorio:
phpinfo/
└── index.php
e index.php era justo:
<?php phpinfo();