Mage :: लॉग स्क्रीन पर लिखता है


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

ठीक है, एक घातक त्रुटि होती है, कोई शटडाउन_फंक्शन पंजीकृत नहीं होता है, तो क्यों प्रिंट_र प्रतिध्वनित होता है? :-) मुझे अभी भी समझ नहीं आ रहा है कि क्या हो रहा है।


क्या आपको स्क्रीन पर ब्लॉक ऑब्जेक्ट डंप का आउटपुट मिल रहा है या यह एक अपवाद है? Mage :: लॉग को कॉल करने से पहले आप एक अपवाद को पकड़ सकते हैं।
मायब्लूवन

क्या, वास्तव में, स्क्रीन पर क्या लिखा है?
एलन स्टॉर्म

इस सवाल को अद्यतन किया गया
फेबियन ब्लेसस्मिट

क्या ढेर, Magento और / या PHP संस्करण आप उपयोग कर रहे हैं?
B00MER

MAMP PRO (Apache / 2.2.22, PHP 5.4.3) मैगनेटो 1.7.0.2
फैबियन ब्लेसस्मिट

जवाबों:


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_rPHP स्रोत से फ़ंक्शन की परिभाषा पर एक नज़र डालें :

/* {{{ 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 का विस्तार करने वाले सभी ऑब्जेक्ट डीबग () का उपयोग अंतर्निहित _data संपत्ति को पुनरावर्ती रूप से आउटपुट करने के लिए कर सकते हैं।

अधिक विस्तृत विवरण के लिए मेरे एक सहकर्मी द्वारा इस ब्लॉग पोस्ट को देखें।


2

क्या इसका कारण हो सकता है?

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

"PHP प्रलेखन से: जब वापसी पैरामीटर का उपयोग किया जाता है, तो यह फ़ंक्शन आंतरिक आउटपुट बफ़रिंग का उपयोग करता है इसलिए इसे एक ob_start () कॉलबैक फ़ंक्शन के अंदर उपयोग नहीं किया जा सकता है।" यहाँ अधिक जानकारी: [php.net/manual/en/function.print-r.php]

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.