Explique cómo crear PHAR PHAR PHAR
Pregunta
Estoy tratando de crear una aplicación PHP CLI muy simple que se pueda ejecutar como un phar Archivo desde la línea de comando:
# php myProject.phar
Esto es lo que he probado hasta ahora:
Mi proyecto
Mi proyecto está en un directorio llamado MyProject
Y tiene estos dos archivos:
|-- createPhar.php
`-- bootstrap.php
bootstrap.php
los bootstrap.php
El archivo contiene esto:
<?php
print phpversion() . PHP_EOL;
print 'i am some script' . PHP_EOL;
Cuando ejecuto este script desde mi línea de comando Ubuntu:
# cd MyProject
# php bootstrap.php
Obtengo la siguiente salida:
5.3.2-1ubuntu4.9
i am some script
createPhar.php
El archivo createPhar.php está destinado a convertir el proyecto en PHAR Archive. Se parece a esto:
<?php
$phar = new Phar('MyProject.phar');
$phar->addFile('bootstrap.php');
$phar->setStub( $phar->createDefaultStub('bootstrap.php') );
Cuando ejecuto ese guión ...
# php createPhar.php
... un nuevo archivo llamado MyProject.phar
se crea en el directorio de mi proyecto.
|-- bootstrap.php
|-- createPhar.php
`-- MyProject.phar
Ahora aquí está el problema
Cuando ejecuto el archivo PHAR ...
# php MyProject.phar
... Espero ver la misma salida que obtuve cuando ejecuté el bootstrap.php
guion.
En cambio no veo nada. No hay salida en absoluto. Esto implica que mi bootstrap.php
El script no está siendo incluido por el trozo predeterminado creado por $phar->createDefaultStub('bootstrap.php')
Creo que estoy malinterpretando cómo se crean los fantasmas y sus trozos. ¿Podrías, por favor, explicar dónde me he equivocado?
Solución
Para responder mi propia pregunta.
El método descrito en mi pregunta, arriba, es una forma correcta de crear un trozo PHAR / PHAR.
La razón por la que no funcionó para mí y hizo El trabajo para Mario (vea su comentario a continuación la pregunta), es porque tenía a Suhosin instalado y necesitaba ajustar la configuración.
Arreglado usando el técnica se describe aquí:
Para arreglar, poner:
suhosin.executor.include.whitelist = "Phar"
en /etc/php5/cli/php.ini
Otros consejos
También podrías hacerlo así:
bootstrap.php;
<?php
function go() {
print phpversion() . PHP_EOL;
print 'i am some script' . PHP_EOL;
}
después:
php -r "requiere 'phar: //myproject.phar'; go ();"
O no tiene una función y ejecutará cualquier comando que tenga allí, pero generalmente tendría algunas funciones o archivos de clase en el PHAR.