Mam system programistyczny, display_errors jest włączony, Magento jest w trybie programisty i próbowałem
Mage::log($layered_navigation_filter_block); // Mage_Catalog_Block_Layer_Filter_Attribute
I wszystko zostało zapisane na ekranie zamiast pliku dziennika, dlaczego?
Wygląda to tak:
// app/Mage.php:837
if (is_array($message) || is_object($message)) {
$message = print_r($message, true);
}
ale drugi argument z print_r jest ignorowany:
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, wystąpił błąd krytyczny, nie zarejestrowano żadnej funkcji shutdown_, więc dlaczego echo print_r? :-) Nadal nie rozumiem, co się dzieje.
Odpowiedzi:
Stworzyłem naprawdę krótki i słodki, powtarzalny przypadek testowy:
Powodem, dla którego widzisz, że informacje są wypuszczane, jest
print_r
wewnętrzne buforowanie danych wyjściowych w celu przechwycenia ich informacji. Spójrz na definicjęprint_r
funkcji ze źródła PHP:Ponieważ PHP zaczyna brakować pamięci i umiera, bufor wyjściowy jest opróżniany, zanim zostanie
print_r
wyczyszczony poprzez wywołanie dophp_ob_get_buffer
Nie jestem pewien, czy i tak będzie wokół tego. Upewnij się tylko, że wyłączysz to logowanie podczas produkcji lub uruchom mod_security, aby zapobiec przejściu tego typu danych wyjściowych na stronę.
źródło
Ważne jest to, co wskazuje davidalger . Obiekt, który próbujesz zarejestrować, jest zbyt duży i powoduje, że w PHP brakuje pamięci. W zależności od limitu pamięci i wielkości bloku możesz użyć:
Wszystkie obiekty, które rozszerzają Varien_Object, mogą używać metody debug () do rekurencyjnego generowania podstawowej właściwości _data.
Sprawdź ten post na blogu jednego z moich współpracowników, aby uzyskać bardziej szczegółowe wyjaśnienia.
źródło
czy to może być powód?
/programming/9329877/using-print-r-in-ob-start
„Z dokumentacji PHP: Gdy używany jest parametr return, ta funkcja korzysta z wewnętrznego buforowania danych wyjściowych, więc nie można jej używać w funkcji wywołania zwrotnego ob_start ().” Więcej informacji tutaj: [php.net/manual/en/function.print-r.php]
źródło