Tengo un sistema de desarrollo, display_errors está activado, Magento está en modo desarrollador e intenté
Mage::log($layered_navigation_filter_block); // Mage_Catalog_Block_Layer_Filter_Attribute
Y todo fue escrito en la pantalla en lugar del archivo de registro, ¿por qué?
Se parece a este caso:
// app/Mage.php:837
if (is_array($message) || is_object($message)) {
$message = print_r($message, true);
}
pero el segundo argumento de print_r se ignora:
Mage_Catalog_Block_Layer_Filter_Category Object ( [_filter:protected] => ...
[28-Jan-2013 22:48:43 UTC] PHP Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 241434624 bytes) in /var/www/app/code/local/MyCompany/Motif/Model/Observer.php on line 47
[28-Jan-2013 22:48:43 UTC] PHP Stack trace:
[28-Jan-2013 22:48:43 UTC] PHP 1. {main}() /var/www/index.php:0
[28-Jan-2013 22:48:43 UTC] PHP 2. Mage::run() /var/www/index.php:87
[28-Jan-2013 22:48:43 UTC] PHP 3. Mage_Core_Model_App->run() /var/www/app/Mage.php:683
[28-Jan-2013 22:48:43 UTC] PHP 4. Mage_Core_Controller_Varien_Front->dispatch() /var/www/app/code/core/Mage/Core/Model/App.php:354
[28-Jan-2013 22:48:43 UTC] PHP 5. Mage_Core_Controller_Varien_Router_Standard->match() /var/www/app/code/core/Mage/Core/Controller/Varien/Front.php:176
[28-Jan-2013 22:48:43 UTC] PHP 6. Mage_Core_Controller_Varien_Action->dispatch() /var/www/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php:250
[28-Jan-2013 22:48:43 UTC] PHP 7. Mage_Catalog_CategoryController->viewAction() /var/www/app/code/core/Mage/Core/Controller/Varien/Action.php:419
[28-Jan-2013 22:48:43 UTC] PHP 8. Mage_Core_Controller_Varien_Action->generateLayoutBlocks() /var/www/app/code/core/Mage/Catalog/controllers/CategoryController.php:146
[28-Jan-2013 22:48:43 UTC] PHP 9. Mage_Core_Model_Layout->generateBlocks() /var/www/app/code/core/Mage/Core/Controller/Varien/Action.php:344
[28-Jan-2013 22:48:43 UTC] PHP 10. Mage_Core_Model_Layout->generateBlocks() /var/www/app/code/core/Mage/Core/Model/Layout.php:210
[28-Jan-2013 22:48:43 UTC] PHP 11. Mage_Core_Model_Layout->_generateBlock() /var/www/app/code/core/Mage/Core/Model/Layout.php:205
[28-Jan-2013 22:48:43 UTC] PHP 12. Mage_Core_Model_Layout->addBlock() /var/www/app/code/core/Mage/Core/Model/Layout.php:239
[28-Jan-2013 22:48:43 UTC] PHP 13. Mage_Core_Model_Layout->createBlock() /var/www/app/code/core/Mage/Core/Model/Layout.php:472
[28-Jan-2013 22:48:43 UTC] PHP 14. Mage_Core_Block_Abstract->setLayout() /var/www/app/code/core/Mage/Core/Model/Layout.php:456
[28-Jan-2013 22:48:43 UTC] PHP 15. Mage::dispatchEvent() /var/www/app/code/core/Mage/Core/Block/Abstract.php:239
[28-Jan-2013 22:48:43 UTC] PHP 16. Mage_Core_Model_App->dispatchEvent() /var/www/app/Mage.php:447
[28-Jan-2013 22:48:43 UTC] PHP 17. Mage_Core_Model_App->_callObserverMethod() /var/www/app/code/core/Mage/Core/Model/App.php:1317
[28-Jan-2013 22:48:43 UTC] PHP 18. MyCompany_Motif_Model_Observer->coreBlockAbstractPrepareLayoutAfter() /var/www/app/code/core/Mage/Core/Model/App.php:1338
[28-Jan-2013 22:48:43 UTC] PHP 19. print_r() /var/www/app/code/local/MyCompany/Motif/Model/Observer.php:47
Ok, ocurre un error fatal, no se registra ninguna función de apagado, entonces ¿por qué se hace eco de print_r? :-) Todavía no entiendo lo que está sucediendo.
Respuestas:
Creé un caso de prueba reproducible realmente corto y dulce para esto:
La razón por la que está viendo la información se debe al
print_r
uso interno de la memoria intermedia de salida para capturar su información. Eche un vistazo a la definición de laprint_r
función desde la fuente PHP:Debido a que PHP se está quedando sin memoria y está muriendo, el búfer de salida se vacía antes de
print_r
borrarlo a través de su llamada aphp_ob_get_buffer
No estoy seguro de que va a haber de todos modos alrededor de esto. Solo asegúrese de deshabilitar ese inicio de sesión en producción, o ejecute mod_security para evitar que este tipo de salida vaya a la página.
fuente
Lo que davidalger señala es importante. El objeto que intenta registrar es demasiado grande y hace que PHP se quede sin memoria. Dependiendo de su límite de memoria y del tamaño de su bloque, puede usar:
Todos los objetos que extienden Varien_Object pueden usar debug () para generar la propiedad subyacente _data de forma recursiva.
Consulte esta publicación de blog de uno de mis compañeros de trabajo para obtener una explicación más detallada.
fuente
¿Podría ser ésta la razón?
/programming/9329877/using-print-r-in-ob-start
"De la documentación de PHP: cuando se utiliza el parámetro de retorno, esta función utiliza el almacenamiento intermedio de salida interno, por lo que no se puede utilizar dentro de una función de devolución de llamada ob_start ()". Más información aquí: [php.net/manual/en/function.print-r.php]
fuente