2011-06-16 9 views
16

मैं बीमा करना चाहता हूं कि a custom PHP error handler का उपयोग करके कोई दौड़ की स्थिति शुरू नहीं हुई है। इसके लिए मैं जानना चाहता हूं कि क्या मैं error_log() पर भरोसा कर सकता हूं या अगर मुझे कुछ अन्य फाइल-लॉकिंग विधि का उपयोग करने की आवश्यकता है, तो बीमा त्रुटियों को ठीक से लॉग इन किया गया है।क्या पीएचपी फ़ंक्शन error_log() सुरक्षित है?

डिफ़ॉल्ट PHP त्रुटि हैंडलर कैसे काम करता है? क्या यह दौड़ की स्थिति से सुरक्षित है?

उदाहरण के लिए, मैं फ़ाइल (जो त्रुटियों के कारण हो सकता इस सरल संस्करण में खो जाएं)

function log_error($message) 
{ 
    if(! $fp = @fopen('/path/to/error.log', 'a')) 
    { 
     return FALSE; 
    } 

    flock($fp, LOCK_EX); 
    fwrite($fp, $message); 
    flock($fp, LOCK_UN); 
    fclose($fp); 

    return TRUE; 
} 

लॉक करने के लिए है या मैं सिर्फ error_log कॉल कर सकते हैं करते हैं?

error_log($message, 0); 
+1

error_log ($ message, 0) http://php.net/error-log निर्देश का उपयोग करेगा, इसलिए आपको इसे सही सेट करना होगा। यदि आप वहां syslog का उपयोग करते हैं, तो आपको ठीक होना चाहिए: http://stackoverflow.com/questions/1163194/syslog-r-for-linux, लेकिन आपको हमारे सिस्टम पर syslog संस्करण (अधिकांश सिस्टम पर सुरक्षित) जांचना चाहिए। – XzKto

उत्तर

16

आप ext/standard/basic_functions.c में त्रुटि_log कार्यान्वयन के लिए स्रोत पा सकते हैं। आप देखेंगे कि यह किसी भी परिभाषित लॉगर को बस इतना कहता है। यदि आप एकाधिक समवर्ती कॉल के कारण त्रुटि_लॉग द्वारा किसी प्रकार के डेटा के बारे में चिंतित हैं, तो इसकी आवश्यकता नहीं है। या कम से कम, PHP कोड के किसी भी अन्य टुकड़े से अधिक चिंतित नहीं है। यदि आपका कस्टम लॉगर फ़ाइल में लिख रहा है, तो आपको फ़ाइल लॉकिंग को लागू करने की आवश्यकता होगी। Error_log (प्रक्रियाओं में) के समवर्ती कॉल एक सुंदर आम परिदृश्य है।

संपादित

आप लगभग निश्चित रूप से का उपयोग कर बेहतर error_log के माध्यम से उपलब्ध प्रवेश करने में बनाया गया है।

PHP फ़्लॉक कार्यान्वयन सलाहकार लॉकिंग का उपयोग करता है, जिससे अन्य प्रक्रियाओं के लिए यह लॉक और लिखने को आसानी से अनदेखा कर देता है। इसके अतिरिक्त, अपनी प्रक्रियाओं के भीतर आप IO होने के बाध्य होंगे क्योंकि प्रक्रिया लॉक प्राप्त करने की प्रतीक्षा करती है। error_log का उपयोग करके, आप syslog लॉगिंग कॉन्फ़िगर कर सकते हैं। Syslog एसिंक्रोनस है ताकि आप लॉक अधिग्रहण से बच सकें, और इसे कर्नेल बफर द्वारा भी समर्थित किया जाता है (आमतौर पर) किसी भी syslog डिमन को किसी समस्या के बिना लगातार रिकॉर्ड लिखने की अनुमति होगी।

कई कंपनियों पर उच्च थ्रूपुट लॉगिंग लागू करने के बाद मैं दृढ़ता से सिसॉग को कॉन्फ़िगर करने या लेखक जैसे कुछ के साथ जाने की सलाह देता हूं। मेरा 2 सी

+0

तो, क्या मैं अपने हैंडलर से error_log() को कॉल कर सकता हूं या क्या मुझे एक और लॉग फ़ाइल बनाने की आवश्यकता है जिसे मैं लॉक कर सकता हूं और इसके बजाय इसका उपयोग कर सकता हूं? यदि डिफ़ॉल्ट PHP हैंडलर सिर्फ error_log() को कॉल करता है तो मैं अपने हैंडलर में इसका उपयोग करके सुरक्षित महसूस करता हूं। – Xeoncross

+2

फ़ाइल आधारित लॉगर जिसे आपके php.ini (error_log = '/tmp/log.txt') के माध्यम से निर्दिष्ट किया जा सकता है, समवर्ती कॉल के साथ भी सुरक्षित रूप से लिखा जाएगा। आप अपने हैंडलर में error_log() को कॉल कर सकते हैं। – bmatheny

+0

मुझे लगता है कि यह सुरक्षित है। –

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