call_user_func_array call_user_func php zend-framework caching

php - call_user_func_array vs. call_user_func



call_user_func_array php (3)

Me encontré con un tema interesante hoy. Tenemos una aplicación que utiliza la funcionalidad de caché de Zend Frameworks. Una solicitud a esta aplicación generalmente llama a un método de fábrica usando la siguiente línea

$result = call_user_func_array(array("myclass", "factory"), array($id));

La idea es devolver un objeto del método de fábrica al que podamos acceder más adelante. Cuando implementamos una función de almacenamiento en caché, esta llamada simplemente, bueno, muere. Sin errores, solo una pantalla blanca. Nada en el registro de errores. Podemos registrar el error de la línea antes de aceptar, pero tratar de error_log dentro del método de fábrica no hace nada.

Curiosamente, cambiar la línea a:

$result = call_user_func(array("myclass", "factory"), $id);

arregla el problema

Hemos pasado algunas horas buscando informes de errores y no hemos encontrado mucho para explicar este comportamiento. Pensamientos a nadie?


He tenido problemas como este que se redujeron a __autoload que no se activan correctamente cuando se invoca una clase aún no cargada a través de un comando PHP. No hay otra estrategia más que tonta de prueba y error para la que yo sepa, solo intente si una línea que invoca explícitamente la clase antes de que el comando PHP lo resuelva por usted.

$dummy = new MyClassName; call_user_func_array(array(''MyClassName'', ''method''), array($id)); unset($dummy);


¿Es segfaulting? Comprueba tus registros de Apache ''raíz'' (fuera de cualquier servidor virtual) y mira qué está pasando. Si ese hilo está segfaulting, es posible que desee persuadirlo en las listas de correo de PHP y / o en el rastreador de errores.

Alternativamente, podrías intentar ejecutar http en modo de usuario único, en GDB, con una compilación de depuración de php y ver si puedes capturarlo, pero eso es mucho trabajo :-)


¿Qué versión de php estás usando? Hubo un problema al combinar call_user_func_array con ReflectionClass en un punto. No estoy seguro de si aún está arreglado.