2009-08-09 8 views
41

कल्पना कीजिए मैं निम्नलिखित स्थिति है:कोड लाइन और फ़ाइल प्राप्त करें जो PHP में वर्तमान फ़ंक्शन को निष्पादित कर रहा है?

File1.php

<?php 
include("Function.php"); 
log("test"); 
?> 

function.php

<?php 
function log($msg) 
{ 
    echo ""; 
} 
?> 

मैं लॉग समारोह को बदलने के लिए इतना है कि यह निम्न उत्पादन होता हैं:

परीक्षण (फ़ाइल: फ़ाइल 1.एफपी, रेखा संख्या: 3)

तो, फ़ाइल नाम और PHP में वर्तमान फ़ंक्शन निष्पादित करने वाले कोड की लाइन संख्या प्राप्त करने का कोई भी तरीका है? बैकलॉग उपयोग टिप्पणियों के लिए

संपादित करें: प्रोग्रामिंग के उन्मुख तरह से जब मैं अपने वस्तु में बैकलॉग का उपयोग मैं निम्नलिखित स्थिति है।

index.php

<?php 
include("Logger.static.php"); 
include("TestClass.class.php"); 
new TestClass(); 
?> 

TestClass.class.php

<?php 
class TestClass 
{ 
    function __construct() 
    { 
    Logger::log("this is a test log message"); 
    } 
} 
?> 

Logger.static.php

<?php 
class Logger 
{ 
    static public function log($msg) 
    { 
    $bt = debug_backtrace(); 
    $caller = array_shift($bt); 
    echo $caller['file']; 
    echo $caller['line']; 
    } 
} 
?> 

इस उदाहरण के रूप में फ़ाइल "index.php" वापस आ जाएगी और लाइन नंबर 4 के रूप में, यह वह जगह है जहां कक्षा शुरू की जाती है। हालांकि, यह फ़ाइल TestClass.class.php और लाइन नंबर 6 को वापस करना है। किसी भी विचार को कैसे ठीक किया जाए?

उत्तर

73

आप debug_backtrace() का उपयोग कर सकते हैं।

http://us3.php.net/manual/en/function.debug-backtrace.php

तो, अपनी लॉग समारोह में, आप फ़ाइल नाम और लाइन नंबर है जहाँ से लॉग समारोह बुलाया गया था को पुनः प्राप्त करने में सक्षम होगा।

मैं अपने लॉगिंग कक्षाओं में इस दृष्टिकोण का उपयोग कर रहा हूं और इसमें सार्थक लॉग डेटा प्राप्त करने के लिए आवश्यक कोड की मात्रा में काफी कमी आई है। एक अन्य लाभ पठनीयता होगी। तारों के साथ मिश्रित होने पर जादू स्थिरांक काफी बदसूरत हो जाते हैं।

यहां एक त्वरित उदाहरण है:

function log($msg) 
{ 
    $bt = debug_backtrace(); 
    $caller = array_shift($bt); 

    // echo $caller['file']; 
    // echo $caller['line']; 

    // do your logging stuff here.  
} 
+1

वास्तव में, एक समस्या है। मैं ऑब्जेक्ट उन्मुख तरीके से कोडिंग कर रहा हूं और यह उस रेखा और स्क्रिप्ट को वापस कर रहा है जो ऑब्जेक्ट को कॉल कर रहा है जिसमें फ़ंक्शन कहा जाता है। इसके बजाय, मुझे मुझे उस वर्ग फ़ाइल के भीतर शामिल वर्ग और रेखा का नाम देना चाहिए। कोई उपाय? – Tom

+0

आपको यहां और अधिक विशिष्ट होने की आवश्यकता है। क्या आप मुझे दिखा सकते हैं कि आप क्या प्राप्त कर रहे हैं और आप इसके बजाय क्या उम्मीद कर रहे हैं? –

+0

हैलो लिओर कोहेन, क्या आप कृपया मेरी संपादित मूल पोस्ट देख सकते हैं? मैंने सब कुछ विस्तार से समझाया। धन्यवाद! – Tom

21

debug_backtrace() कॉल स्टैक के माध्यम से वापस पता लगाने के लिए उपयोग किया जा सकता है। हालांकि यह धीमा हो सकता है, इसलिए यदि आप बहुत सारे लॉगिंग कर रहे हैं तो इसके साथ सावधान रहें।

आप PHP 5.3 का उपयोग कर रहे हैं, तो आप late static binding का लाभ ले सकता है और log() का एक आधार वर्ग विधि है, और अपने बच्चे कक्षाओं यह __FILE__ और __LINE__ करने के लिए कॉल, लेकिन अभी भी बनाए रख सकता स्थिर संदर्भ।

अंतिम विकल्प __FILE__ औरपैरामीटर के रूप में पास होगा जब आप अपना log() फ़ंक्शन कॉल करते हैं।

+0

'__FILE__' और' __LINE__' अधिक कुशल हो सकता है, हालांकि यह कोड अव्यवस्था जोड़ता है। वैसे, उचित आवश्यकता होने पर उचित डीबगिंग फ़ाइल/लाइन लॉगिंग को प्रतिस्थापित कर सकती है। – christopheml

+0

'debug_backtrace()' '__LINE__' से 2 गुना धीमा है, लेकिन यह औसत कंप्यूटर के लिए 1 एमएस में 100 कॉल या शक्तिशाली सर्वर के लिए 1 एमएस में 1000 कॉल की अनुमति देता है। तो यह इतना धीमा नहीं हो सकता है। – Enyby

1

यह एक पुराने सवाल लेकिन कैसे मेरे यहाँ समाधान नहीं है के रूप में देख रहा है मैं इसे भावी पीढ़ी

 try{ 
     throw new Exception(); 
    }catch (Exception $e){ 
     $trace = $e->getTrace(); 
    } 

    $length = 0; 

    foreach ($trace as $t){ 
     if($t['file'] != __FILE__){ 
      break; 
     } 
     ++$length; 
    } 
    return array_slice($trace, ($length - count($trace))); 

आप फेंक कर सकते हैं/पकड़ के लिए प्रदान करेंगे एक साफ स्टैक ट्रेस प्राप्त करने के लिए, आपको उस फ़ाइल को देखने की आवश्यकता है जिसमें इस फ़ाइल को शामिल किया गया है (आमतौर पर वह कहां से कहा जाता है) यदि आप इसे जानते हैं, या फ़ंक्शन को ट्रेस की अनुक्रमणिका का भी उपयोग कर सकते हैं।

अपवाद स्टैक ट्रेस debug_backtrace(true) करने जैसा ही है।

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