HipHop compila PHP en un ejecutable en C. ¿Qué pasa con los errores de PHP?Con HipHop para PHP, lo que sucede con los errores de PHP
¿Es eso más difícil de depurar?
editar: Me miraba a través de la documentación, pero no encontró nada
HipHop compila PHP en un ejecutable en C. ¿Qué pasa con los errores de PHP?Con HipHop para PHP, lo que sucede con los errores de PHP
¿Es eso más difícil de depurar?
editar: Me miraba a través de la documentación, pero no encontró nada
Hice un par de pruebas rápidas (que no tiene el tiempo para jugar con hiphop tanto como me gustaría, por desgracia; - (+); aquí están los resultados que obtuve:
en primer lugar, aquí está el contenido de test-2.php
, que contiene un error de análisis:
<?php
echo "what with a parse error ?
Nota: la cadena no está terminado
Tratando de correr que con PHP, me sale:
$ php test-2.php
PHP Parse error: syntax error, unexpected $end, expecting T_VARIABLE or T_DOLLAR_OPEN_CURLY_BRACES or T_CURLY_OPEN in /home/squale/temp/hiphop-php/tests/test-2.php on line 5
Parse error: syntax error, unexpected $end, expecting T_VARIABLE or T_DOLLAR_OPEN_CURLY_BRACES or T_CURLY_OPEN in /home/squale/temp/hiphop-php/tests/test-2.php on line 5
intentar compilar que con hiphop, consigo :
$ /home/squale/temp/hiphop-php/hiphop-php/src/hphp/hphp test-2.php --keep-tempdir=1 --log=3
running hphp...
creating temporary directory /tmp/hphp_JdsWcU ...
parsing inputs...
parsing ./test-2.php...
parsing inputs took 0'00" (0 ms) wall time
running hphp took 0'00" (154 ms) wall time
Exception: Unable to parse file: ./test-2.php
(Line: 5, Char: 0): syntax error, unexpected $end
es decir, el archivo con el error de análisis no compila, lo que es lógico.
El mensaje de error tiene algunas informaciones que estaban presentes en el mensaje de error de PHP - pero no exactamente tan preciso ...
Lo que significa que tal vez quiera probar con PHP antes de compilar su aplicación con hiphop: el mensaje de error dado por PHP era más descriptivo.
Ahora, vamos a probar con algunos errores de ejecución/advertencias; aquí está el contenido de test-1.php
:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
if ($_GET['test'] == '1') {
$data = (object)array(10);
echo $data[0];
} else if ($_GET['test'] == '2') {
echo 10/0;
} else if ($_GET['test'] == '3') {
file_put_contents('/bin/non-allowed', 'hello !');
}
echo "plop\n";
Intentar ejecutar ese archivo de Apache + PHP, se obtendría tres errores posibles:
(he copiado el archivo a mi raíz de documentos - lo que significa que los caminos se no será el mismo para los errores con Apache)
en primer lugar, llamando http://localhost/temp/test-1.php?test=1
me sale:
Fatal error: Cannot use object of type stdClass as array in /home/squale/developpement/tests/temp/test-1.php on line 8
Y, tratando http://localhost/temp/test-1.php?test=2
me sale:
Warning: Division by zero in /home/squale/developpement/tests/temp/test-1.php on line 10
plop
Y, por último, con http://localhost/temp/test-1.php?test=3
, me sale:
Warning: file_put_contents(/bin/non-allowed) [function.file-put-contents]: failed to open stream: Permission denied in /home/squale/developpement/tests/temp/test-1.php on line 12
plop
Ahora, la compilación que test-1.php
archivo con hiphop y ejecutarlo en modo de servidor web, consigo este durante la fase de compilación, lo que significa que está bien:
$ /home/squale/temp/hiphop-php/hiphop-php/src/hphp/hphp test-1.php --keep-tempdir=1 --log=3
running hphp...
creating temporary directory /tmp/hphp_xXZ8US ...
parsing inputs...
parsing ./test-1.php...
parsing inputs took 0'00" (1 ms) wall time
pre-optimizing...
pre-optimizing took 0'00" (0 ms) wall time
inferring types...
inferring types took 0'00" (0 ms) wall time
post-optimizing...
post-optimizing took 0'00" (0 ms) wall time
creating CPP files...
creating CPP files took 0'00" (32 ms) wall time
compiling and linking CPP files...
compiling and linking CPP files took 0'39" (39807 ms) wall time
running executable /tmp/hphp_xXZ8US/program --file test-1.php...
plop
all files saved in /tmp/hphp_xXZ8US ...
running hphp took 0'40" (40054 ms) wall time
Y, a continuación, lanzar el servidor:
$ /tmp/hphp_xXZ8US/program -m server -p 8080
Could not mlockall
loading static content...
loading static content took 0'00" (0 ms) wall time
page server started
admin server started
all servers started
Ahora, vamos a tratar de acceder a esos tres direcciones URL; En primer lugar, llamando http://localhost:8080/test-1.php?test=1
me sale:
Unhandled error: Invalid operand type was used: not ArrayAccess objects.
en la consola desde la que empecé el servidorPara http://localhost:8080/test-1.php?test=2
, me sale:
plop
Division by zero
Y, por último, por http://localhost:8080/test-1.php?test=3
, me sale:
plop
Aquí, también, las indicaciones de errores no son tan buenas como con PHP ... al menos con las opciones predeterminadas ...
A juzgar por hiphop de Runtime options wiki page, se puede especificar un archivo de configuración que contiene algunas opciones.
Aquí está el contenido de la config.txt
utilicé:
Log {
Level = Verbose
NoSilencer = true
AlwaysLogUnhandledExceptions = true
RuntimeErrorReportingLevel = 6143
Header = false
InjectedStackTrace = true
NativeStackTrace = true
MaxMessagesPerRequest = -1
}
ErrorHandling {
CallUserHandlerOnFatals = true
NoInfiniteLoopDetection = false
NoInfiniteRecursionDetection = false
MaxStackDepth = 1000
ThrowBadTypeExceptions = true
ThrowNotices = true
NoticeFrequency = 1 # 1 out of these many notices to log
WarningFrequency = 1 # 1 out of these many warnings to log
AssertActive = false
AssertWarning = false
}
Re-iniciar el servidor, usando el interruptor --config
señalar a ese archivo:
$ /tmp/hphp_xXZ8US/program -m server -p 8080 --config=config.txt
Could not mlockall
loading static content...
loading static content took 0'00" (0 ms) wall time
page server started
admin server started
all servers started
que debería obtener más información .. . probemos nuestras tres peticiones nuevamente.
En primer lugar, llamando http://localhost:8080/test-1.php?test=1
me sale:
Para http://localhost:8080/test-1.php?test=2
, me sale:
Y, por último, por http://localhost:8080/test-1.php?test=3
, me sale:
plop
f_file_put_contents/316: Permission denied
No intenté mucho más, pero jugar con ese archivo de configuración y el interruptor --config
parece una idea interesante ;-)
Nota: Hice esas pruebas en Ubuntu 9.10 64bits - que es un sistema de apoyo oficial; la instalación fue bastante fácil.
Lo que significa que podrías probar esos, haciendo una instalación en una Máquina Virtual, por ejemplo: mientras conozcas un poco sobre Linux y compilando software, instalar hiphop no es una tarea imposible.
¡Esta es una respuesta increíble! Gracias, gran trabajo –
De nada :-) * (Había estado planeando compilar hiphop por bastante tiempo ... ahora que ya está hecho, y me divertí con los primeros pasos, podré tener un poco más divertido probarlo un poco más ^^) * –
¡Gran respuesta! Muy tentado de probar HipHop –
revise la documentación, podría estar allí (no sé, pero parece que es la manera más fácil). http://wiki.github.com/facebook/hiphop-php/hiphop-documentation – Piskvor
Me imagino que muchos errores de PHP se convierten en errores de compilación. Y el resto probablemente falle en el tiempo de ejecución. –
Creo que solo compila el php después de que el desarrollo haya finalizado. pero es interesante ver cómo manejan los errores de tiempo de ejecución – antpaw