2008-10-19 20 views
11

कहता है कि आपके पास एक बड़ी PHP प्रोजेक्ट है और अचानक, इसे चलाने का प्रयास करते समय, आप बस एक खाली पृष्ठ के साथ समाप्त होते हैं। स्क्रिप्ट समाप्त हो जाती है और आप यह जानना चाहते हैं कि जितना संभव हो उतना कम प्रयास है।यह निर्धारित करने का सबसे तेज़ तरीका है कि PHP स्क्रिप्ट

क्या कोई टूल/प्रोग्राम/कमांड/आईडीई है जो PHP स्क्रिप्ट समाप्ति पर, आपको स्क्रिप्ट निकास का स्थान बता सकता है?

नोट: मैं अपनी खुद की पोस्ट को "स्वीकृत उत्तर" के रूप में चिह्नित नहीं कर सकता, इसलिए मेरा समाधान देखने के लिए नीचे देखें। यदि आप एक बेहतर समाधान के साथ आते हैं तो मैं आपकी पोस्ट को उत्तर के रूप में चिह्नित करूंगा।

+0

भविष्य में मरने के लिए सुनिश्चित करें कि() संदेशों ;-) साथ – Ross

+0

हाँ ... कि आम तौर पर एक अच्छा विचार है, या उपयोग अपवाद हैंडलिंग है। कोड के साथ बहुत काम करना मैंने खुद को लिखा नहीं है ...x/ –

उत्तर

3
nonworking लेकिन अभी भी RoBorg से सही दिशा जवाब से कुछ प्रेरणा के साथ

, मैं शुरुआत में निम्न कोड का प्रयोग किया:

function shutdown() { 
    global $dbg_stack_a; 
    print_r($dbg_stack_a); 
} 
register_shutdown_function('shutdown'); 

और फिर मैं (ग्लोबल = ब्रेकप्वाइंट पर मूल्यांकन किया जाता है एक वैश्विक सशर्त ब्रेकप्वाइंट बनाया प्रत्येक पंक्ति), तथ्य यह है कि यह निम्नलिखित "हालत" के साथ, कोड गर्त eval() चला सकते हैं शोषण:

eval(' 
global $dbg_stack_a, $dbg_stack_b, $dbg_stack_c; 
$dbg_stack_a = $dbg_stack_b; 
$dbg_stack_b = $dbg_stack_c; 
$dbg_stack_c = debug_backtrace(); 
return false; 
') 

शायद तेजी से नहीं बल्कि काम कर देता है! इसका उपयोग करके मैं मरने वाले सटीक फ़ाइल और रेखा स्थान को निर्धारित करने में सक्षम था()। (यह उदाहरण NuSphere में काम करता है।)

0
grep -n die filename 
+0

अच्छा जवाब, लेकिन मैं एक सामान्य समाधान (किसी भी प्रकार के बाहर निकलने के लिए) की तलाश में हूं, और न सिर्फ मरने()। यह भी मान लें कि इस परियोजना में कई मर गए हैं और बाहर निकलते हैं और उन्हें देखते हुए सभी एक बेहद कठिन कार्य होंगे। –

0

भी "बाहर निकलने" के लिए grep को मत भूलना।

0

फ़ाइल के शीर्ष करने के लिए इस जोड़ें:

function shutdown() 
{ 
    print_r(debug_backtrace()); 
} 


register_shutdown_function('shutdown'); 

देखें register_ shutdown_function()

+5

काम नहीं करता है। स्टैक के अनचाहे होने के बाद शट डाउन फ़ंक्शन होता है। डंप करने के लिए कोई ढेर जानकारी नहीं है। – troelskn

+1

हाँ, यह वही होगा जो मैं खोज रहा था, अगर PHP ने इसे कॉल करने से पहले स्टैक ट्रेस साफ़ नहीं किया था ... –

0

आप कोड से निकलने के लिए जब तक आप बाहर निकलने के बिंदु तक पहुँचने के लिए एक इंटरैक्टिव डिबगर उपयोग कर सकते हैं। इसके अलावा, मुझे लगता है कि आप exit|die के लिए कोड grep'ing करने के लिए नीचे हैं।

0

xdebug में एक अच्छी ट्रेस सुविधा है जो आपको अपने PHP एप निष्पादन के पूरे निशान को देखने की अनुमति देगी और आपको यह बताएगा कि आपका निकास कहां है।

लेकिन त्वरित और गंदे समाधान के लिए ऊपर वर्णित एक grep/find सही तरीके से करेगा।

0

Apache error_log में "memory_limit" त्रुटियों के लिए त्रुटि___logs भी जांचें।

मेमोरी सीमा> = 10M चेतावनी: (अपने php.ini फ़ाइल में 10M या बड़ा करने के लिए इस सेट)

मेरे अनुभव में, स्क्रिप्ट अचानक बिना किसी चेतावनी के अंत या नोटिस जब ऐसा होता है।

0

सुनिश्चित करें कि आपके विकास वातावरण में त्रुटियां प्रदर्शित हों (उत्पादन नहीं)।

8

मैं निम्नलिखित कोड का उपयोग करता हूं और किसी विशेष डिबगिंग वातावरण की आवश्यकता नहीं है। ध्यान दें कि यह वास्तव में लंबा हो सकता है; आप टिकों को उच्च मान सकते हैं - जो इसे तेज़ बनाता है, लेकिन धुंधला हो जाता है।

function shutdown_find_exit() 
{ 
    var_dump($GLOBALS['dbg_stack']); 
} 
register_shutdown_function('shutdown_find_exit'); 
function write_dbg_stack() 
{ 
    $GLOBALS['dbg_stack'] = debug_backtrace(); 
} 
register_tick_function('write_dbg_stack'); 
declare(ticks=1); 
संबंधित मुद्दे

 संबंधित मुद्दे