Mage :: log ghi vào màn hình


21

Tôi có một hệ thống phát triển, display_errors đang bật, Magento ở chế độ nhà phát triển và tôi đã cố gắng để

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

Và mọi thứ đã được ghi vào màn hình thay vì tệp nhật ký, tại sao?

Có vẻ như trường hợp này:

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

nhưng đối số thứ hai từ print_r bị bỏ qua:

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, một lỗi nghiêm trọng xảy ra, không có shutdown_feft được đăng ký, vậy tại sao print_r lại lặp lại? :-) Tôi vẫn không hiểu chuyện gì đang xảy ra.


Là đầu ra bạn nhận được trên màn hình khối kết xuất đối tượng khối hay nó là một ngoại lệ? Bạn có thể bắt gặp một ngoại lệ trước khi Mage :: log được gọi.
mybluevan

Chính xác thì cái gì được viết lên màn hình?
Alan Storm

đã cập nhật câu hỏi
Fabian Blechschmidt

Bạn đang sử dụng phiên bản Stack, Magento và / hoặc PHP nào?
B00mer

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

Câu trả lời:


29

Tôi đã tạo ra một trường hợp thử nghiệm có thể tái tạo thực sự ngắn và ngọt ngào cho việc này:

<?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);
}

Lý do bạn thấy thông tin đưa ra là do print_rsử dụng bộ đệm đầu ra bên trong để nắm bắt thông tin. Hãy xem định nghĩa của print_rhàm từ nguồn 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;
    }
}

Vì PHP sắp hết bộ nhớ và sắp chết, bộ đệm đầu ra đang bị print_rxóa trước khi xóa nó thông qua lệnh gọi đếnphp_ob_get_buffer

Tôi không chắc chắn sẽ có bất cứ điều gì xung quanh này. Chỉ cần đảm bảo rằng bạn vô hiệu hóa việc đăng nhập trong sản xuất hoặc chạy mod_security để ngăn loại đầu ra này đi đến trang.


Cảm ơn bạn rất nhiều vì câu trả lời chi tiết này. Tôi nên khởi động lại việc học C và đọc php sourcecode :)
Fabian Blechschmidt

6

Những gì davidalger chỉ ra là quan trọng. Đối tượng bạn đang cố gắng đăng nhập quá lớn và khiến PHP hết bộ nhớ. Tùy thuộc vào giới hạn bộ nhớ và kích thước khối của bạn, bạn có thể sử dụng:

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

Tất cả các đối tượng mở rộng Varien_Object có thể sử dụng debug () để xuất ra thuộc tính _data bên dưới một cách đệ quy.

Kiểm tra bài đăng trên blog này bởi một trong những đồng nghiệp của tôi để được giải thích chi tiết hơn.


2

Điều này có thể là lý do?

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

"Từ tài liệu PHP: Khi tham số trả về được sử dụng, hàm này sử dụng bộ đệm đầu ra bên trong để không thể sử dụng nó trong hàm gọi lại ob_start ()." Thêm thông tin ở đây: [php.net/manual/en/feft.print-r.php]

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.