2010-04-20 12 views

Respuesta

3

intente configurar una bandera "Hecho" después de la ejecución de un archivo y registro de una función de desconexión que verificará si esa marca está definida

+0

simplemente me pegó - estaba reescribiendo mi respuesta en estas líneas –

+0

;) es genial, su respuesta es más precisa – shfx

+0

Gracias! Eso hizo el truco. – AdamA

3

Mi respuesta original no funcionará, ya que no se puede detectar un error fatal. Si desea leerlo de todos modos, consulte el historial de revisiones.

Mi única conjetura es que podría usar register_shutdown_function. Establezca una variable al inicio de la secuencia de comandos, desactívela cuando la secuencia de comandos se haya completado correctamente. Escribir una función que comprueba que la variable y actúa sobre él si todavía está configurado, a continuación, aplicar la función usando register_shutdown_function

http://php.net/manual/en/function.register-shutdown-function.php

9

Después de leer las dos primeras respuestas aquí, tuve que probar register_shutdown_function() - no pensé que se ejecutaría. Después de todo, ¿cómo puede funcionar una función de usuario una vez que no hay más memoria o ha transcurrido el tiempo de ejecución? Me sorprendió saber que las funciones de apagado ejecutan, incluso en una situación OOM, o cuando se ha superado el tiempo de ejecución. Prueba de concepto:

Para probar límite de memoria:

<?php 
function asdf() { echo "omg\n"; } 
register_shutdown_function('asdf'); 

ini_set('memory_limit', '1000'); 

$x = ''; 
while(true) { 
$x .= 'lkajsdlfkjasldkfjlaskdfjasldkfj'; 
} 

Salida:

PHP Fatal error: Allowed memory size of 262144 bytes exhausted (tried to allocate 169540 bytes) in /home/scratch.php on line 9 
PHP Stack trace: 
PHP 1. {main}() /home/scratch.php:0 

Fatal error: Allowed memory size of 262144 bytes exhausted (tried to allocate 169540 bytes) in /home/scratch.php on line 9 

Call Stack: 
    0.0002  81360 1. {main}() /home/scratch.php:0 

omg 

Para probar el tiempo de ejecución:

cat scratch.php 
<?php 
function asdf() { echo "omg\n"; } 
register_shutdown_function('asdf'); 

set_time_limit(1); 

while(true) {} 

Salida:

PHP Fatal error: Maximum execution time of 1 second exceeded in /home/scratch.php on line 7 
PHP Stack trace: 
PHP 1. {main}() /home/scratch.php:0 

Fatal error: Maximum execution time of 1 second exceeded in /home/scratch.php on line 7 

Call Stack: 
    0.0002  80200 1. {main}() /home/scratch.php:0 

omg 

Tenga en cuenta que, para obtener su mensaje para mostrar antes de Salida de error de PHP, tendría que desactivar la salida de error de PHP por completo. Cuál es la mejor práctica para un sitio de producción de todos modos.

+0

Se alcanzó el tiempo máximo de ejecución! = Memoria permitida agotada Es difícil hacer que el script alcance el tiempo máximo de ejecución con bucles y funciones de reposo, el sueño congela el contador de tiempo de ejecución ... – shfx

+0

Malo. Edición de la publicación para probar el límite de tiempo de ejecución en lugar del agotamiento de la memoria –

0

Si no hay forma de atrapar el error desde el nivel API, el motor PHP debería poder volcar la memoria en el disco duro cada vez que ocurra un error fatal, como lo hace Windows cuando ve una 'pantalla azul'.

Cuestiones relacionadas