2008-10-19 15 views
8

मुझे एक बहुत ही अजीब समस्या है, जब मैं var_dump (या print_r) एक डॉक्टर ऑब्जेक्ट का प्रयास करता हूं, तो मेरे अपाचे प्रतिक्रिया रिक्त खाली पृष्ठ (200 ओके हेडर) के साथ प्रतिक्रिया करता है। मैं var_dump एक सामान्य php var जैसे:क्यों एक dictrine ऑब्जेक्ट्स var_dump मेरे अपाचे को मार डालो?

$dummy = array("a" => 1, "b" =>2); 

और यह ठीक काम करता है। लेकिन मैं किसी भी ऑब्जेक्ट क्लास से किसी ऑब्जेक्ट के साथ नहीं कर सकता, ($connection->query() से परिणाम, या सिद्धांत के साथ मेरे ऑब्जेक्ट मॉडल से कक्षा का उदाहरण)।

कोई जानता है कि ऐसा क्यों होता है?

+4

यह "सिद्धांत var_dum के लिए नंबर एक गूगल परिणाम है के लिए देखो पी "। कृपया आप सही उत्तर (http://stackoverflow.com/a/8646048/3408) स्वीकार कर सकते हैं, "स्मृति सीमा बढ़ाएं" नहीं, जो वास्तव में समस्या को हल नहीं कर रहा है। – rjmunro

उत्तर

1

मैंने कभी-कभी print_r() को स्वयं-संदर्भ ऑब्जेक्ट की कोशिश करते समय देखा है - यह एक लूप में आता है और स्मृति से बाहर चला जाता है। संभवतः यह आपके साथ क्या हो रहा है।

मेमोरी सीमा (ini_set('memory_limit', '256M');) बढ़ाने का प्रयास करें और देखें कि क्या यह ठीक करता है।

संपादित करें: मुझे नहीं लगता कि इसके लिए एक वास्तविक फिक्स है - यह PHP का आंतरिक var_dump/print_r है जो रिकर्सन पर गहराई को सीमित नहीं करता है (या कम से कम ठीक से नहीं करता है)। यदि आप XDebug एक्सटेंशन इंस्टॉल करते हैं, तो यह बिल्ट-इन var_dump को उस संस्करण के साथ प्रतिस्थापित कर सकता है जो रिकर्सन को बेहतर तरीके से संभालता है।

+11

आपको सहायक आउटपुट नहीं मिलेगा, इसलिए, बेहतर डंप \ Doctrine \ Common \ Util \ Debug :: डंप() का बेहतर उपयोग करें जो कि किसी अन्य उत्तर में वर्णित है – Gigala

+2

बढ़ती स्मृति सीमा को कभी भी एक अच्छा जवाब नहीं माना जाना चाहिए। इसकी तरह 'chmod 777' की सिफारिश है। – renoirb

8

Doctrine_Record वर्ग के toArray विधि का उपयोग करें

var_dump($doctrine_record->toArray()); 

केवल DB फ़ील्ड प्रदर्शित और पूर्ण सिद्धांत internals

49

लेज़ी लोड प्रॉक्सी हमेशा होते हैं (जो स्वयं संदर्भ/प्रत्यावर्तन btw शामिल हैं) डंपिंग से बचने जाएगा सिद्धांत की EntityManager और इसकी सभी निर्भरताओं का एक उदाहरण।

इसलिए var_dump संभवतः एक बहुत बड़ी रिकर्सिव संरचना को डंप करेगा जो प्रस्तुत करना और पढ़ना असंभव है। डंपिंग को मानव पठनीय स्तर तक सीमित करने के लिए आपको \Doctrine\Common\Util\Debug::dump() का उपयोग करना होगा। ध्यान दें कि इस फ़ंक्शन के लिए डिफ़ॉल्ट गहराई 2 पर सेट है (यह दूसरा पैरामीटर है)

+0

इस टिप के लिए बहुत बहुत धन्यवाद! – Besnik

+0

मेमोरी सीमा बढ़ाने के अलावा, इसके आसपास जाने का एक तरीका, [xdebug] (http://xdebug.org/) का उपयोग करना होगा और इसके 'xdebug.var_display_max_depth' का लाभ उठाएं, केवल सभी की एक निश्चित गहराई तक डंप करें वह रिकर्सन – ficuscr

+0

कोई अन्य तरीका है –

0

यदि आप सुनिश्चित हैं कि ऑब्जेक्ट Doctrine_Collection का उदाहरण है, तो आप Array का उपयोग कर सकते हैं। Xdebug सिद्धांत रिकॉर्ड के साथ मदद नहीं करता है।

तरह से, कि Doctrine_Record :: toArray() का उपयोग करते हैं

function var_dump_improved() 
{ 
    foreach (func_get_args() as $arg) { 
     if ($args instanceof Doctrine_Collection) { 
      print_r($arg); 
     } else if ($arg instanceof Traversable || is_array($arg)) { 
      // do a foreach and recall var_dump_improved on subelements 
     } else if (...) { 
      // other types 
     } 
    } 
} 

कुछ पुनरावर्ती क्रिया neeeded अधिकतम नेस्टिंग के स्तर के साथ डिबग करने के लिए मेरा सुझाव वस्तु मुद्रित करने के लिए एक कस्टम पुनरावर्ती क्रिया लागू कर रहा है यहाँ हैं

टिप्पणियों पर http://php.net/manual/en/function.var-dump.php

देखो, "प्रत्यावर्तन"