PHP

2016-01-01 6 views
6

में किसी उपयोगकर्ता की बैंडविड्थ खपत की निगरानी कैसे करें ठीक है मुझे पता है कि यह एक अजीब समस्या है और संभव नहीं है, इसलिए विचारों की सराहना की जाएगी।PHP

वैसे भी, मैं यह जानना चाहता हूं कि मैं प्रत्येक उपयोगकर्ता को कितनी बैंडविड्थ दे रहा हूं। जब वह वेबसाइट पर लॉग इन करता है तो मैं उपयोगकर्ता की पहचान करता हूं।

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

कोडनिर्देशक का उपयोग करेगा, हालांकि मुझे संदेह है कि इससे कोई फर्क पड़ता है।

सब कुछ कम से कम अब तक अपाचे के साथ एक ही लिनक्स आधारित सर्वर पर होगा।

आदर्श रूप से मुझे ऐसा समाधान चाहिए जो होस्टिंग के प्रकार तक ही सीमित न हो।

या तो Google क्लाउड या अमेज़ॅन एडब्ल्यूएस का उपयोग करेगा। यदि समाधान Google क्लाउड या aws तक सीमित है, तो यह काम करेगा।

+0

एक ही सर्वर पर सब कुछ है:

apache_setenv('PHP_USER_ID', $userId, TRUE); 

तो फिर तुम इस LogFormat निर्देश का प्रयोग करेंगे लॉग इन करने की? – Clay

+0

और, आप किस वेब सर्वर पर चल रहे हैं? अमरीका की एक मूल जनजाति? या दूसरा एक? देर से प्रतिक्रिया के लिए – Clay

+0

@Clayton क्षमा करें। हां सब कुछ एक ही सर्वर पर है और अपाचे –

उत्तर

2

जब से तुम ने कहा कि आप अपाचे पर हैं, यहाँ 2 विचार कर रहे हैं।

पहले विचार (तथा इसलिए यह विचार लेकिन मज़ा के बारे में सोचना ...):

कुकीज़ (सभी छवियों आदि सहित) सर्वर पर प्रत्येक अनुरोध के साथ भेजा जाता है। जब उपयोगकर्ता PHP के साथ एक कुकी सेट करने में लॉग इन करता है और इसे USERTOKEN नाम देता है तो उसके मान को उस उपयोगकर्ता की आईडी के md5 + नमक पर सेट करें।

कस्टम LogFormat निर्देश में %{USERTOKEN}C और %B डालें।

LogFormat "%B %{USERTOKEN}C" php_bandwidth_log 
CustomLog "logs/php_bandwidth_log" php_bandwidth_log 

उसके बाद, आप php_bandwidth_log पार्स और मूल उपयोगकर्ता के आईडी से मैप करने के लिए करने के लिए एक स्क्रिप्ट बनाने:

%{Foobar}C The contents of cookie Foobar in the request sent to the server. 
      Only version 0 cookies are fully supported. 

%B   Size of response in bytes, excluding HTTP headers. 

अब, आपको लगता है कि इस तरह दिखता है एक कस्टम लॉग प्रारूप पैदा करते हैं।

दुर्भाग्यवश यह विचार मूर्खतापूर्ण नहीं है क्योंकि कोई भी कुकी (शायद) को पारित करके साइट सामग्री का अनुमान लगा सकता है। वैसे भी, आपकी स्थिति के आधार पर यह आपके लिए काम कर सकता है, यदि नहीं, तो वैकल्पिक और बेहतर विचार मूल रूप से सभी सामग्री को PHP स्क्रिप्ट के माध्यम से रूट करना है ताकि आप किसी भी तरह की लॉगिंग कर सकें।

दूसरा विचार (बेहतर):

तो, एक PHP फ़ाइल है कि इस प्रकार /files.php?path=/blah/blah.jpg (इस उदाहरण के लिए oversimplified, एक mod_rewrite नियम के साथ prettied जा सकता है) कहा जा सकता है बनाने के तो आप इसके अंदर उस उपयोगकर्ता की आईडी लॉग कर सकते हैं और एक्सेस की गई फ़ाइलों को ट्रैक कर सकते हैं। यह माना जाता है कि आप केवल फाइलों को ट्रैक करना चाहते हैं। यह पृष्ठ पर जेनरेट किए गए HTML का ट्रैक नहीं रखेगा - आप शायद पहले निर्दिष्ट कस्टम अपाचे लॉगिंग विचार का उपयोग कर सकते हैं लेकिन उस जानकारी को प्राप्त करने के लिए इसे थोड़ा सा संशोधित कर सकते हैं।

यहाँ आप विचार प्राप्त करने में मदद करने के लिए कुछ छद्म कोड है:

if (!$hasSession) { 
    die("Invalid session"); 
} 
$size = filesize($path); 
insert_into_bandwidth_table($userId, $size); 
header("Content-Type: ..."); 
readfile($path); 

निम्नलिखित कैसे आप निष्पादित PHP स्क्रिप्ट के लिए सिर्फ प्रतिक्रिया आकार ट्रैक कर सकते हैं, लेकिन यह केवल आप के रूप में पीएचपी चला रहे हैं काम करेंगे है एक मॉड्यूल

आपके PHP में ऐसा कुछ जोड़ें। मूल रूप से इस लॉग लेखन प्रयोजनों के लिए इस चर को पढ़ने के लिए अपाचे अनुमति देता है:

apache_note("PHP_USER_ID", 1234); 

apache_note - apache_note - जाओ और सेट अपाचे अनुरोध नोट

विवरण: यह समारोह अपाचे के table_get और table_set के लिए एक आवरण है। यह नोट्स की तालिका को संपादित करता है जो अनुरोध के दौरान मौजूद होता है। तालिका का उद्देश्य अपाचे मॉड्यूल को संवाद करने की अनुमति देना है। डॉक्स से नोट पर

LogFormat "%B %{PHP_USER_ID}n" php_bandwidth_log 
CustomLog "logs/php_bandwidth_log" php_bandwidth_log 

जानकारी::

Read more here

अपने httpd.conf लॉग विन्यास में

फिर कुछ इस तरह करते हैं

%{Foobar}n The contents of note Foobar from another module. 

और ... बस एहसास हुआ कि अगर आप इसे मॉड्यूल के रूप में नहीं चला रहे हैं तो apache_note का एक विकल्प है। आपका PHP कोड के बजाय इस करना होगा:

LogFormat "%B %{PHP_USER_ID}e" php_bandwidth_log 
+1

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

+0

यदि आप दूसरे विचार के साथ जाना चाहते थे, तो मैंने निष्पादित किए गए PHP स्क्रिप्ट के लिए अनुरोध आकार कैसे बना सकते हैं। डाउनसाइड यह है कि यह आपको एक मॉड्यूल के रूप में PHP का उपयोग करने के लिए मजबूर करेगा जो वांछित नहीं हो सकता है। हमने पिछले काम में यह किया था हालांकि यह ठीक काम करता था। तो, वह + फ़ाइल रूटिंग इसे बनाएगा ताकि आपके पास हमेशा उपयोगकर्ता आईडी हो। – Clay

+0

आह ... ऐसा लगता है कि आप 'apache_note' के बजाय' apache_setenv' का उपयोग कर सकते हैं, जिसका मानना ​​है कि PHP को मॉड्यूल के रूप में रखने की आवश्यकता को बाईपास करना होगा। फिर, apache_note/apache_setenv केवल PHP स्क्रिप्ट्स के आकार को लॉग करने में सक्षम होगा जो सत्र के भीतर चल रहे हैं, बाहरी रूप से लोड की गई फ़ाइलों को नहीं, जो PHP स्क्रिप्ट नहीं हैं। – Clay

0

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

Source: 

संभव समाधान:

Limiting Membership By Bandwidth

Track User Bandwidth With PHP Application

+1

कभी भी उपयोगकर्ता के लिए एक नई बाल्टी? Yeesh। एडब्ल्यूएस आपको डिफ़ॉल्ट रूप से 100 बाल्टी तक सीमित करता है। – ceejayoz

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