Saya memiliki sistem pengembangan, display_errors aktif, Magento dalam mode pengembang dan saya mencoba
Mage::log($layered_navigation_filter_block); // Mage_Catalog_Block_Layer_Filter_Attribute
Dan semuanya ditulis di layar alih-alih file log, mengapa?
Ini terlihat seperti ini:
// app/Mage.php:837
if (is_array($message) || is_object($message)) {
$message = print_r($message, true);
}
tetapi argumen kedua dari print_r diabaikan:
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, kesalahan fatal terjadi, tidak ada shutdown_function terdaftar, jadi mengapa print_r digaungkan? :-) Saya masih tidak mengerti apa yang sedang terjadi.
Jawaban:
Saya membuat test case yang benar-benar pendek dan manis untuk ini:
Alasan Anda melihat informasi dikeluarkan karena
print_r
menggunakan buffering output secara internal untuk menangkap informasi itu. Lihatlah definisiprint_r
fungsi dari sumber PHP:Karena PHP kehabisan memori dan sekarat, buffer output sedang disiram sebelum
print_r
membersihkannya melalui panggilan ituphp_ob_get_buffer
Saya tidak yakin akan ada lagi hal ini. Pastikan Anda menonaktifkan produksi log in, atau menjalankan mod_security untuk mencegah jenis output ini pergi ke halaman.
sumber
Apa yang ditunjukkan davidalger adalah penting. Objek yang Anda coba masuk terlalu besar dan menyebabkan PHP kehabisan memori. Bergantung pada batas memori Anda dan ukuran blok Anda, Anda mungkin dapat menggunakan:
Semua objek yang memperluas Varien_Object dapat menggunakan debug () untuk menampilkan properti _data yang mendasarinya secara rekursif.
Lihat posting blog ini oleh salah satu rekan kerja saya untuk penjelasan lebih rinci.
sumber
Dapatkah ini menjadi alasan?
/programming/9329877/using-print-r-in-ob-start
"Dari dokumentasi PHP: Ketika parameter return digunakan, fungsi ini menggunakan buffering output internal sehingga tidak dapat digunakan di dalam fungsi panggilan balik ob_start ()." Info lebih lanjut di sini: [php.net/manual/en/function.print-r.php]
sumber