Mage :: log เขียนไปยังหน้าจอ


21

ฉันมีระบบการพัฒนา display_errors เปิดอยู่ Magento อยู่ในโหมดนักพัฒนาซอฟต์แวร์และฉันพยายาม

Mage::log($layered_navigation_filter_block); // Mage_Catalog_Block_Layer_Filter_Attribute

และทุกอย่างถูกเขียนลงบนหน้าจอแทนที่จะเป็นไฟล์บันทึกทำไม?

ดูเหมือนว่ากรณีนี้:

// app/Mage.php:837
if (is_array($message) || is_object($message)) {
    $message = print_r($message, true);
}

แต่อาร์กิวเมนต์ที่สองจาก print_r จะถูกละเว้น:

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

ตกลงเกิดข้อผิดพลาดร้ายแรงไม่มีการลงทะเบียน shutdown_function ดังนั้นเหตุใด print_r จึงดังขึ้น :-) ฉันยังไม่เข้าใจว่าเกิดอะไรขึ้น


เอาต์พุตที่คุณได้รับบนหน้าจอเป็นบล็อกการถ่ายโอนข้อมูลบล็อกหรือเป็นข้อยกเว้นหรือไม่ คุณอาจจะได้รับการยกเว้นก่อนที่ Mage :: log จะถูกเรียก
mybluevan

อะไรนะสิ่งที่เขียนไปยังหน้าจอ?
อลันสตอร์ม

อัปเดตคำถาม
Fabian Blechschmidt

คุณใช้ Stack, Magento และ / หรือ PHP รุ่นใด
B00MER

MAMP PRO (Apache / 2.2.22, PHP 5.4.3) magento 1.7.0.2
Fabian Blechschmidt

คำตอบ:


29

ฉันสร้างกรณีทดสอบที่ทำซ้ำได้สั้นและน่ารักสำหรับสิ่งนี้:

<?php

error_reporting(-1);
ini_set('display_errors', true);
ini_set('memory_limit', '1M');

$chunk = base64_encode(openssl_random_pseudo_bytes(1024));

while (true) {
    $a[] = print_r($chunk, true);
}

เหตุผลที่คุณเห็นข้อมูลที่นำออกมานั้นเกิดจากการprint_rใช้เอาต์พุตบัฟเฟอร์ภายในเพื่อเก็บข้อมูล ดูคำจำกัดความของprint_rฟังก์ชั่นจากแหล่ง PHP:

/* {{{ proto mixed print_r(mixed var [, bool return])
   Prints out or returns information about the specified variable */
PHP_FUNCTION(print_r)
{
    zval *var;
    zend_bool do_return = 0;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|b", &var, &do_return) == FAILURE) {
        RETURN_FALSE;
    }

    if (do_return) {
        php_start_ob_buffer (NULL, 0, 1 TSRMLS_CC);
    }

    zend_print_zval_r(var, 0 TSRMLS_CC);

    if (do_return) {
        php_ob_get_buffer (return_value TSRMLS_CC);
        php_end_ob_buffer (0, 0 TSRMLS_CC);
    } else {
        RETURN_TRUE;
    }
}

เนื่องจาก PHP มีหน่วยความจำไม่เพียงพอและกำลังจะตายบัฟเฟอร์เอาต์พุตจึงถูกล้างออกก่อนที่จะprint_rล้างออกด้วยการเรียกใช้php_ob_get_buffer

ฉันไม่แน่ใจว่าจะมีรอบนี้ เพียงให้แน่ใจว่าคุณปิดการใช้งานการเข้าสู่ระบบการผลิตหรือเรียกใช้ mod_security เพื่อป้องกันไม่ให้ประเภทของการส่งออกนี้ไปที่หน้า


ขอบคุณมากสำหรับคำตอบอย่างละเอียด ฉันควรจะเริ่มต้นใหม่ในการเรียนรู้ C และอ่าน PHP sourcecode :)
Fabian Blechschmidt

6

สิ่งที่davidalgerชี้ให้เห็นนั้นสำคัญ วัตถุที่คุณพยายามเข้าสู่ระบบใหญ่เกินไปและทำให้ PHP มีหน่วยความจำไม่เพียงพอ ทั้งนี้ขึ้นอยู่กับขีด จำกัด หน่วยความจำของคุณและขนาดของบล็อกของคุณคุณสามารถใช้:

Mage::log($layered_navigation_filter_block->debug());

วัตถุทั้งหมดที่ขยาย Varien_Object สามารถใช้ debug () เพื่อส่งออกคุณสมบัติ _data พื้นฐานซ้ำ

ลองอ่านโพสต์บล็อกนี้โดยหนึ่งในเพื่อนร่วมงานของฉันเพื่อรับรายละเอียดเพิ่มเติม


2

นี่อาจเป็นเหตุผลหรือไม่

/programming/9329877/using-print-r-in-ob-start

"จากเอกสาร PHP: เมื่อใช้พารามิเตอร์ส่งคืนฟังก์ชันนี้ใช้บัฟเฟอร์ภายในเอาต์พุตดังนั้นจึงไม่สามารถใช้ภายในฟังก์ชันการเรียกกลับ ob_start ()" ข้อมูลเพิ่มเติมที่นี่: [php.net/manual/en/function.print-r.php]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.