solucion - Con HipHop para PHP, ¿qué pasa con los errores de PHP?
undefined index php post (1)
HipHop compila PHP en un ejecutable de C. ¿Qué pasa con los errores de PHP?
¿Es eso más difícil de depurar?
Edición: Revisé la documentación pero no encontré nada.
Hice un par de pruebas rápidas (no he tenido tiempo de jugar con hiphop tanto como me gustaría, desafortunadamente ;-() ; 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á terminada
Tratando de ejecutar eso con PHP, obtengo:
$ 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
Tratando de compilar eso con hiphop, obtengo:
$ /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 se compila, lo que es razonable.
El mensaje de error tiene algunas informaciones que estaban presentes en el mensaje de error de PHP, pero no exactamente tan precisa ...
Lo que significa que es posible que desee probar con PHP antes de intentar compilar su aplicación con hiphop: el mensaje de error dado por PHP fue más descriptivo.
Ahora, probemos con algunos errores / advertencias en tiempo de ejecución; 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";
Al intentar ejecutar ese archivo desde Apache + PHP, obtendrías tres errores posibles:
(Copié el archivo a la raíz de mi documento, lo que significa que las rutas no serán las mismas para los errores con Apache)
En primer lugar, llamando a 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, al intentar http://localhost/temp/test-1.php?test=2
, obtengo:
Warning: Division by zero in /home/squale/developpement/tests/temp/test-1.php on line 10
plop
Y, finalmente, con http://localhost/temp/test-1.php?test=3
, obtengo:
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, compilando ese archivo de test-1.php
con hiphop y ejecutándolo en modo de servidor web, recibo esto 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, iniciando 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, intentemos acceder a esas tres URLs; primero, llamando a http://localhost:8080/test-1.php?test=1
Recibo:
- Nada en el navegador
-
Unhandled error: Invalid operand type was used: not ArrayAccess objects.
En la consola desde la que inicié el servidor.
Para http://localhost:8080/test-1.php?test=2
, obtengo:
- En el navegador:
plop
- En la consola desde la que inicié el navegador:
Division by zero
Y, finalmente, para http://localhost:8080/test-1.php?test=3
, obtengo:
- En el navegador:
plop
- En la consola: nada.
Aquí, también, las indicaciones de errores no son tan buenas como con PHP ... al menos con las opciones predeterminadas ...
A juzgar por la página wiki de opciones de tiempo de ejecución de hiphop, puede especificar un archivo de configuración que contenga algunas opciones.
Aquí está el contenido del config.txt
que 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
}
--config
el servidor, usando el interruptor --config
para apuntar 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
Debería obtener más información ... probemos nuevamente nuestras tres solicitudes.
Primero, llamando a http://localhost:8080/test-1.php?test=1
, obtengo:
- Igual que antes
Para http://localhost:8080/test-1.php?test=2
, obtengo:
- Igual que antes
Y, finalmente, para http://localhost:8080/test-1.php?test=3
, obtengo:
- En el navegador:
plop
- En la consola: un nuevo mensaje de error que no recibí antes:
f_file_put_contents/316: Permission denied
No probé 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 con soporte oficial; La instalación fue bastante fácil.
Lo que significa que puede probarlos, haciendo una instalación en una máquina virtual, por ejemplo: siempre que sepa un poco sobre Linux y el software de compilación, la instalación de hiphop no es una tarea imposible.