2010-03-10 10 views
19

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

+0

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

+0

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. –

+0

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

Respuesta

29

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:

  • Nada en el navegador
  • Unhandled error: Invalid operand type was used: not ArrayAccess objects. en la consola desde la que empecé el servidor

Para http://localhost:8080/test-1.php?test=2, me sale:

  • En el navegador: plop
  • En la consola desde la que comienzo ed el navegador: Division by zero

Y, por último, por http://localhost:8080/test-1.php?test=3, me sale:

  • 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 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:

  • Igual que antes

Para http://localhost:8080/test-1.php?test=2, me sale:

  • Igual que antes

Y, por último, por http://localhost:8080/test-1.php?test=3, me sale:

  • En el navegador: plop
  • En la consola: un nuevo mensaje de error que no he tenido antes: 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.

+0

¡Esta es una respuesta increíble! Gracias, gran trabajo –

+0

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 ^^) * –

+0

¡Gran respuesta! Muy tentado de probar HipHop –