2012-05-29 12 views
5

फ्लैट फाइलों की समरूपता लगभग असीमित पढ़ें (अगर मैं गलत हूं तो मुझे सही करें); लेकिन लिखने के लिए सहमति कैसे है? के रूप में \nफ्लैट फ़ाइल में लॉग लिखने के लिए LOCK कैसे काम करता है?

fopen(); // in append mode 
fwrite(); 
fclose(); 

जब से हम समवर्ती आगंतुकों है, के साथ समाप्त हुआ पहुँच विस्तार की एक पंक्ति संलग्न करने के लिए PHP में एक सरल पहुँच लॉग (विज़िट के लिए) लिखने पर विचार कैसे प्रणाली (एक उपयोगकर्ता जो wbserver/php उपयोगकर्ता है) दृश्य लॉग को समवर्ती रूप से लिखें?

मेरा भ्रम है: फ़ंक्शन file_put_contents() (जो उपर्युक्त तीन कार्यों का एक रैपर है) में लॉकिंग (LOCK_EX) का विकल्प है? क्या यह लॉकिंग विकल्प का उपयोग करना फायदेमंद है? यह लॉग लेखन को कैसे प्रभावित करेगा?

अद्यतन: मेरा प्रश्न है कि LOCK आईएनजी मूल रूप से फाइल पर लॉग लिखने/प्रभावित करने के तरीके को प्रभावित करता है। मैं file_put_contents और fwrite की तुलना नहीं करता; यहां तक ​​कि मेरा प्रश्न PHP तक सीमित नहीं है। प्रश्न लिखने की प्रक्रिया के दौरान फ़ाइल लॉक करने के बारे में है।

+0

'file_put_contents()', लॉक करने के लिए एक विकल्प है की जाँच [मैनुअल] करता है (http://php.net/manual/en/function.file-put-contents.php)। – yannis

+0

@YannisRizos जैसा कि मैंने मूल प्रश्न में उद्धृत किया है, मुझे पता है कि 'file_put_contents' में 'LOCK_EX' है। मेरा सवाल यह है कि यह एक एक्सेस लॉग लिखने को कैसे प्रभावित करता है। – Googlebot

+0

हां, आप सही हैं, जाहिर है कि मेरी टिप्पणी प्रश्न के दूसरे संशोधन के लिए थी। खराब संपादन, वह एक। – yannis

उत्तर

3

file_put_contents() में लॉक करने का विकल्प होता है, लेकिन मेरी राय में, आपको इसके बजाय flock() का उपयोग करना चाहिए।

पुस्तिका से

:

उपलब्ध झंडे

FILE_USE_INCLUDE_PATH शामिल निर्देशिका में फ़ाइल नाम के लिए
खोजें। अधिक जानकारी के लिए include_path देखें।

FILE_APPEND यदि फ़ाइल फ़ाइल नाम पहले से मौजूद है, तो डेटा को ओवरराइट करने के बजाय फ़ाइल में संलग्न करें।

LOCK_EX लेखन पर आगे बढ़ते समय फ़ाइल पर एक विशेष लॉक प्राप्त करें। एक साझा ताला (पाठक) प्राप्त करने के लिए

LOCK_SH:

flock() आप अन्य विधियों का उपयोग करने के लिए अनुमति देता है।
LOCK_EX अनन्य लॉक (लेखक) प्राप्त करने के लिए। लॉक (साझा या अनन्य) जारी करने के लिए
LOCK_UN

यहाँ देखें: http://php.net/manual/en/function.flock.php और यहाँ: http://php.net/manual/en/function.file-put-contents.php

0

चेतावनी दी हो, फ़ाइल का उपयोग लॉग के लिए ताला लगा एक वातावरण है कि आसानी से एक रेस स्थिति को लागू कर सकते हैं। शायद एक और विधि में देखो? डेटाबेस में लॉगिंग, हो सकता है? समानांतर प्रक्रियाओं के साथ एक ही समय में लॉग को खोलने और लिखने का प्रयास करने के लिए एक अच्छी तरह से डिज़ाइन किए गए सिस्टम के लिए यह बहुत आसान है।

शायद मोनोलॉग पर नज़र डालें?एसिंक लॉगिंग के लिए वहां कुछ लॉगिंग हैंडलर हैं, जो एक्सेस लॉगिंग के साथ कुछ भी करने के लिए आदर्श होंगे।

https://github.com/Seldaek/monolog

+0

'monolog' के बारे में जानना अच्छा लगा; लेकिन यह एक कस्टम एक्सेस लॉग है, सिस्टम की नहीं। इसमें सत्र, कुकीज़, सदस्य लॉगिन इत्यादि से जानकारी हो सकती है। इसके अतिरिक्त, डिस्क पर लिखने के लिए मेरा प्रश्न सामान्य रूप से सामान्य है। – Googlebot

+0

@ एली आपको बहुत सावधान रहना होगा, अगर यह किसी भी चीज से जुड़ा हुआ हो; जितनी बार आप डेटा लॉगिंग करेंगे, उतना ही अधिक होगा कि आपका कोड लॉग में शामिल होने का मौका केवल फ़ाइल लॉक को दबाए और लॉग इन करने में असमर्थ हो। इस परिस्थिति में आपको या तो एसएसडी (तेज लिखने की गति, लेकिन सर्वर हार्डवेयर के रूप में होने की संभावना नहीं) पर कुछ लॉगिंग करने की आवश्यकता है, एक रैमडिस्क (तेज़ लेखन लेकिन अस्थिर; खोने की शक्ति और डेटा चला गया है), या आप लॉग इन कर सकते हैं एक पतली डिस्क और अपनी उंगलियों को पार करें और उम्मीद है कि कुछ भी फ़ाइल से लॉग इन करने के लिए लॉग-लॉक नहीं होता है। – damianb

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