2008-10-08 17 views
11

मेरे पास एक डेटाबेस संचालित वेबसाइट है जो लगभग 50,000 पृष्ठों की सेवा करती है।PHP के माध्यम से फ़ाइल लॉग इन करें या MySQL डेटाबेस पर लॉग इन करें - जो तेज़ है?

मैं प्रत्येक वेबपेज/रिकॉर्ड हिट ट्रैक करना चाहते हैं। मैं लॉग बनाकर ऐसा करूँगा, और फिर दिन में एक बार लॉग को प्रोसेस कर रहा हूं। मुझे इस बात से कोई फर्क नहीं पड़ता कि मैं बैच प्रक्रिया कैसे करूंगा, केवल लॉग इन करने के सबसे तेज़ तरीके से।

आप कैसे लॉग इन करेगा, जो आपको लगता है ऐसा तेज है:

क) पीएचपी उपयोग एक पाठ लॉग फ़ाइल के अंत में संलग्न करने के लिए।

ख) एक गैर सूचीबद्ध लॉग तालिका में डालने के लिए MySQL का उपयोग करें।

उत्तर

2

मेरा मानना ​​है कि यह होगा कि एक फ्लैट फ़ाइल तेजी से करने के लिए लिखने के लिए किया जाएगा।

0

फ़ाइल में जल्दी होगा, लेकिन डीबी में बेहतर होगा।

4

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

आप डेटाबेस खुला तो मुझे लगता है कि यह एक ही पंक्ति सम्मिलित करने के लिए शायद जल्दी होगा मिल गया है, तो निवारण होता है।

सुनिश्चित करने के लिए एक ही रास्ता संबंधित यह सब प्रदर्शन के साथ

हालांकि एक साधारण परीक्षण लिख सकते हैं और यह मापने के लिए ....

अद्यतन है: मैं एक त्वरित परीक्षण किया है - और काफी यकीन है कि अगर आप के लिए है खोलने के लिए और 10,000 लाइनों का एक परीक्षण का उपयोग कर फ़ाइल यह बंद एक ही गति या धीमी के बारे में:

लेकिन जब आप इस यह धीमा नीचे के रूप में देखा जा सकता है कर रही है कई प्रक्रियाओं के लिए शुरू करते हैं। यह 10 समवर्ती प्रक्रियाओं (सेकंड में आपके सभी समय)

DB time: 2.1695 
DB time: 2.3869 
DB time: 2.4305 
DB time: 2.5864 
DB time: 2.7465 
DB time: 3.0182 
DB time: 3.1451 
DB time: 3.3298 
DB time: 3.4483 
DB time: 3.7812 
File open time: 0.1538 
File open time: 0.5478 
File open time: 0.7252 
File open time: 3.0453 
File open time: 4.2661 
File open time: 4.4247 
File open time: 4.5484 
File open time: 4.6319 
File open time: 4.6501 
File open time: 4.6646 
Open close file time: 11.3647 
Open close file time: 12.2849 
Open close file time: 18.4093 
Open close file time: 18.4202 
Open close file time: 21.2621 
Open close file time: 22.7267 
Open close file time: 23.4597 
Open close file time: 25.6293 
Open close file time: 26.1119 
Open close file time: 29.1471 

function debug($d) 
{ 
    static $start_time = NULL; 
    static $start_code_line = 0; 

    if($start_time === NULL) 
    { 
     $start_time = time() + microtime(); 
     $start_code_line = $code_line; 
     return 0; 
    } 

    printf("$d time: %.4f\n", (time() + microtime() - $start_time)); 
    $fp = @fopen('dbg.txt','a'); 
    fprintf($fp,"$d time: %.4f\n", (time() + microtime() - $start_time)); 
    fclose($fp); 

    $start_time = time() + microtime(); 
    $start_code_line = $code_line; 
} 

function tfile() 
{ 
    $fp = @fopen('t1.txt','a'); 
    for ($i=0;$i<10000;$i++) 
    { 
     $txt = $i."How would you log, which do you think is quicker:How would you log, which do you think is quicker:"; 
     fwrite($fp,$txt); 
    } 
    fclose($fp); 
} 
function tfile_openclose() 
{ 
    for ($i=0;$i<10000;$i++) 
    { 
     $fp = @fopen('t1.txt','a'); 
     $txt = $i."How would you log, which do you think is quicker:How would you log, which do you think is quicker:"; 
     fwrite($fp,$txt); 
     fclose($fp); 
    } 
} 

function tdb() 
{ 
    $db = mysql_connect('localhost','tremweb','zzxxcc'); 

    $select_db = mysql_select_db('scratch'); 

    if (!$select_db) 
     die('Error selecting database.'); 

    for ($i=0;$i<10000;$i++) 
    { 
     $txt = $i."How would you log, which do you think is quicker:How would you log, which do you think is quicker:"; 
     mysql_query("INSERT INTO tlog values('".$txt."')"); 
    } 
} 

debug(""); 

tfile(); 
debug("File open"); 

tfile_openclose(); 
debug("Open close file"); 

tdb(); 
debug("DB"); 
+0

यही कारण है कि विभिन्न प्रक्रियाओं को अलग-अलग फ़ाइलों को लिखना चाहिए ... बाद में। खोलने/समापन के साथ आपको चिंता करने की ज़रूरत है, जब आप लॉगिंग अंतराल पर फ़ाइलों को घुमाते हैं तो लॉग को बफर करना होता है (एक बार एक घंटे इस तरह के भार के लिए ठीक है)। – SquareCog

+0

दरअसल - हालांकि मैं लॉग फ़ाइल में बिल्कुल नहीं लिखूंगा। एक बार जब आप कुल और घूर्णन करने जैसी चीजें करना शुरू कर देते हैं - यह प्रक्रिया की तरह बन जाती है जो गलत हो जाएगी - और पहले मामले में सीपीयू के मामले में थोड़ा लाभ के लिए। डाटाबेस डेटा संग्रहित करने और पुनर्प्राप्त करने में अच्छे हैं .... –

+0

ओपी यहां, यह मुझे विश्वास दिलाता है, देरी से सम्मिलित –

0

मैं तुम्हें कुछ परीक्षण मामलों के साथ दोनों का परीक्षण की सलाह देते हैं के साथ है।

मैं ग्रहण करेंगे एक फ्लैट फ़ाइल, तेजी से होगा b/c कि वास्तव में क्या डीबी कर रही है - यह सिर्फ एक फ़ाइल में लिख रही। एकमात्र लाभ मैं सोच सकता हूं कि यदि डेटाबेस समवर्ती रूप से चल सकता है, तो आपको बेहतर परिणाम मिल सकते हैं।

6

मैं MySQL में एक विलंबित सम्मिलित प्रयोग करेंगे। इस तरह आपको सम्मिलित करने के लिए सम्मिलित होने की प्रतीक्षा नहीं करनी पड़ेगी।

+0

दिलचस्प है, मुझे इन विलंबित प्रविष्टियों के बारे में नहीं सुना होगा, वे लॉगिंग के लिए बिल्कुल सही लगते हैं। –

+3

इसके अलावा कोई गारंटी नहीं है कि वे वास्तव में डालेंगे। अधिकांश समय, वे करेंगे .. लेकिन चूंकि यह लॉगिंग कर रहा है, इसलिए आप शायद असाधारण मामलों के बारे में नियमित रूप से जानना चाहते हैं! – SquareCog

+0

यह सच है कि उसे पता नहीं चलेगा कि सम्मिलन विफल रहता है या नहीं। लेकिन अगर लॉग केवल पृष्ठों के आंकड़ों के आंकड़ों के लिए हैं और उनके पास पहले से ही एक डीबी कनेक्शन देरी डालने वाला होना अच्छा होना चाहिए। यदि उनके लिए लॉग महत्वपूर्ण हैं, तो यह एक अच्छा समाधान नहीं है। –

0

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

7

आप log4php का उपयोग कर दोनों तरीकों से कोशिश कर सकते हैं, जो समर्थन करता है: एक्सएमएल के माध्यम से

  • विन्यास और गुण (log4j रूप में एक ही संरचना) फ़ाइल।
  • फ़ाइल, RollingFile, DailyFile, इको, कंसोल, मेल, नाशपाती :: Db, पीएचपी त्रुटि, Syslog या NT घटनाओं और सॉकेट appenders।
  • सरल, टीटीसीसी, पैटर्न, एचटीएमएल और एक्सएमएल लेआउट।
  • नेस्टेड (एनडीसी) और मैप (एमडीसी) डायग्नोस्टिक संदर्भ।
  • स्विच करने योग्य आंतरिक डीबग।

फ़ाइल में लॉग इन करने के संबंध में, आप लेखन अनुरोधों को बफर करके प्रदर्शन में सुधार कर सकते हैं।

17
  1. फ़ाइल में लिखें। लॉग घुमाएं।

  2. बैच निर्धारित समय पर डेटाबेस पर फ़ाइल लोड करें।

वहाँ कई, कई कारणों से इस वास्तुकला चुनने के लिए - स्केलिंग में आसानी डेटाबेस में एक SPOF पर निर्भरता की कमी (कई लॉग के लिए, लिखने उन्हें लोड db से), (कुछ गलत हो जाता है, तो आप बस थोड़ी देर के लिए लॉग जमा करें), लोडिंग समय पर सफाई और गैर-तुच्छ पार्सिंग करने की क्षमता आपके उत्पादन सर्वर को बोझ किए बिना, और भी बहुत कुछ।

0

कुछ विचार:

  1. आपको लगता है कि आप डेटाबेस में अन्य डेटा के साथ लॉग डेटा शामिल करना चाहते हैं जाएगा है? यदि ऐसा है, तो डीबी डालने के ऊपरी हिस्से को उचित ठहराया जा सकता है ताकि मौजूदा रिश्तों को आसानी से लीवरेज किया जा सके।
  2. डेटाबेस में डेटा लॉगिंग करने से आप डेटा की मात्रा को कम कर सकते हैं जो आप लॉगिंग कर रहे हैं (डीबी में मौजूदा रिश्तों के कारण)? उदाहरण के लिए, उपयोगकर्ता गतिविधि के डेटाबेस में एक लॉग बस एक सारणी हो सकती है जिसमें उपयोगकर्ता आईडी, गतिविधि, और टाइमस्टैम्प होता है। फ़ाइल में इस दुबला एक लॉग फ़ाइल मानव पठनीय नहीं होगी। आपकी ज़रूरतों के आधार पर, आपको लॉग फ़ाइल में कम से कम उपयोगकर्ता के डेटा को कैप्चर करने की आवश्यकता होगी ताकि यह सुनिश्चित किया जा सके कि यह उपयोगी और मानव स्वयं को पठनीय हो सकता है।
  3. कोई भी मौका आप इस लॉग डेटा को सामने के अंत में या सड़क के नीचे एक व्यवस्थापक उपकरण के माध्यम से लेना चाहते हैं? यदि ऐसा है, तो डीबी लिखने की संभावना बेहतर है।
0

दूसरों के रूप में उल्लेख किया है - यह इस तरह के यातायात, डिस्क की गति इत्यादि वस्तुओं की बहुत सारी पर निर्भर करता है आप दोनों परिदृश्यों का परीक्षण करना होगा।

MySQL का परीक्षण करते समय, MyISAM और INNODB दोनों को आजमाएं। सिद्धांत रूप में, इनोडब बेहतर प्रदर्शन करेगा क्योंकि इसमें पंक्ति स्तर लॉकिंग है।

1

मैंने कुछ ऐसा ही किया है। मैं प्रत्येक रिकॉर्ड को एक अलग फ़ाइल में लॉग करता हूं, फिर मेरे पास बैच प्रक्रिया होती है जो फ़ाइलों को पकड़ती है, उन्हें एक टैर फ़ाइल में डालती है और उन्हें केंद्रीय लॉग सर्वर (मेरे मामले में, एस 3 :) में अपलोड करती है)।

मैं प्रत्येक लॉग प्रविष्टि के लिए यादृच्छिक फ़ाइल नाम उत्पन्न करता हूं। मैं रोटेशन के लिए फ़ाइलों को लॉक करने से बचने के लिए ऐसा करता हूं। इस तरह से संग्रह/हटाना वास्तव में आसान है।

मैं सामान्य सफेद स्पेस सीमांकित लॉग फ़ाइलों के बजाय जेसन को अपने लॉग प्रारूप के रूप में उपयोग करता हूं। इससे भविष्य में क्षेत्रों को पार्स करना और जोड़ना आसान हो जाता है। इसका मतलब यह भी है कि प्रति फाइल एकाधिक रिकॉर्ड जोड़ने से फ़ाइल प्रति प्रविष्टि लिखना मेरे लिए आसान है।

मैंने वास्तविक समय में लॉगिंग को केंद्रीकृत करने के लिए log4php + syslog-ng भी उपयोग किया है। मेरे पास syslog पर log4php लॉग है, जो उसके बाद मेरे केंद्रीय सर्वर पर लॉग के लिए आगे बढ़ता है। यह बड़े समूहों पर वास्तव में उपयोगी है। एक चेतावनी यह है कि syslog संदेशों की लंबाई सीमा है, इसलिए आप लंबे संदेशों को छोटा कर देते हैं।

0

यदि यह एक डेटाबेस संचालित साइट के लिए है, क्यों तुम सिर्फ अपाचे या आईआईएस, और AWStats के रूप में और उस से परे एक उपयुक्त रिपोर्टिंग उपकरण इस तरह की लॉगिंग क्षमताओं में बनाया उपयोग नहीं कर रहे, वहाँ हमेशा Google Analytics

AWStats है और वेबसर्वर लॉगिंग मेरी वरीयता है - आप अनिवार्य रूप से इसे मुफ्त में प्राप्त कर सकते हैं - भले ही आप यातायात विश्लेषण के बाद न हों, फिर भी आप जो भी बैच प्रोसेसिंग करने के लिए अपाचे एक्सेस लॉग फ़ाइल को पार्स करने पर विचार कर सकते हैं।

2

आपको SQLite का प्रयास करना चाहिए। यह आपको फ़ाइल के साथ-साथ डेटाबेस की शक्ति दोनों को लिखने की गति देगा।

+0

मैंने SQLLite को समान चीजों के लिए कुछ बार उपयोग किया है - उदाहरण जहां मैं डेटाबेस में कुछ रखना चाहता हूं लेकिन सिस्टम नहीं डेटाबेस - यह कई तरीकों से वास्तव में साफ समाधान है और एक जो अधिक व्यापक रूप से जाना जाने योग्य है। – Cruachan

1

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

यदि यह आपके लिए उपयोगी है तो मैं आलेख संदर्भ खोद सकता हूं।

1

यदि आप या तो फ़ाइल आधारित लॉगिंग या डेटाबेस आधारित लॉगिंग का उपयोग कर रहे हैं, तो आपकी सबसे बड़ी प्रदर्शन हिट फ़ाइल/टेबल लॉकिंग होगी। असल में, यदि क्लाइंट ए और क्लाइंट बी अपेक्षाकृत कम समय के फ्रेम के भीतर जुड़ता है, तो क्लाइंट बी जारी रखने से पहले हिट फ़ाइल/टेबल पर लॉक को रिलीज़ करने के लिए प्रतीक्षा कर रहा है।

फ़ाइल आधारित तंत्र के साथ समस्या यह है कि आपकी हिट दूषित नहीं होने के लिए फ़ाइल लॉकिंग आवश्यक है। फ़ाइल के देरी से लिखने के लिए कतार को लागू करना एकमात्र तरीका है।

डेटाबेस प्रवेश के साथ, आप कम से कम निम्न [MyISAM का उपयोग कर MySQL] कर सकते हैं:

INSERT DELAYED INTO `hits` ... 

अधिक जानकारी के लिए 12.2.5.2. INSERT DELAYED Syntax देखें।

+1

हालांकि, MySQL v5.6 के अनुसार, अब बहिष्कृत है –

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