2009-11-07 13 views
11

मैं सोच रहा था एक उपयोगकर्ता एक अवतार की तरह छवियों को अपलोड और इतने PHP और MySQL का उपयोग करने पर स्टोर करने के लिए सबसे अच्छा तरीका क्या है? मुझे कहां से शुरू करना चाहिए? और क्या इस पर एक अच्छा लेख है?PHP और MySQL का उपयोग कर उपयोगकर्ताओं की छवियों को स्टोर करने का सबसे अच्छा तरीका क्या है?

उत्तर

0

यहाँ एक MySQL डेटाबेस पर द्विआधारी में छवि भंडारण की एक example है। मुझे यकीन नहीं है कि क्या कोई फायदे हैं या नहीं। मैं इसे टिप्पणी करने के लिए किसी और के लिए छोड़ दूंगा।

एक और तरीका है तुम कर सकते हो यह एक स्तंभ में छवि के स्थान की दुकान और संदर्भित करने के लिए क्वेरी है।

+1

हाँ, मैं, उस के खिलाफ सलाह देंगे जब तक कि वहाँ किसी कारण छवियों सुरक्षित करने की जरूरत है: आप उपयोगकर्ता का चित्र प्रदर्शित करना चाहते हैं जब भी। इसे इस तरह से करके, छवि को पहले डेटाबेस से निकाला जाना चाहिए और फिर बाइनरी संसाधित हो जाती है। इससे PHP सर्वर के साथ-साथ MySQL सर्वर पर लोड बढ़ेगा। सलाह का आपका दूसरा टुकड़ा बेहतर है; छवि को उपयोगकर्ता छवियों के फ़ोल्डर में संग्रहीत करें, शायद उन्हें uniqid() के साथ नामकरण करें और फिर संदर्भित करें कि डीबी में संबंधित यूआरएल। – BraedenP

2

यदि मैं आप थे, तो मैं आपकी साइट निर्देशिका में कहीं भी छवि को सहेज लेगा और फिर छवि को लिंक को MySQL में सहेज दूंगा, अगर आप वास्तव में इसे डेटाबेस में सहेजना चाहते हैं, तो मैं इसे एक स्ट्रिंग में पढ़ूंगा और फिर base64_encode() इसे और फिर डेटाबेस में सहेजें।

डेटाबेस में उन्हें संग्रहीत करके आपको कम परेशानी का सामना करना पड़ता है, आपको उन्हें ect वापस echo करने के लिए स्क्रिप्ट बनाना होगा, और सर्वर और डेटाबेस लोड में काफी वृद्धि होगी। अगर मैं आप थे, तो मैं सिर्फ संदर्भ संग्रहित करता हूं।

1

मैं एक मेज जहां उपयोगकर्तानाम, नाम की तरह उपयोगकर्ता डेटा स्टोर होने सुझाव देते हैं। उस तालिका में "अवतार" जैसी कुछ फ़ील्ड बनाएं जिसमें आप फ़ाइल संदर्भ संग्रहीत कर सकें।

मानते हुए अपने उपयोगकर्ता अवतारों में जमा हो जाती: htdocs/images/अवतारों/ और उपयोगकर्ता apikot अवतार "avatar.jpg" संग्रहीत खिलाफ यह डेटाबेस में उपयोगकर्ता है है, तो आप फिर निम्न url संकलन सकता है जब एक छवि टैग जेनरेट : "/htdocs/images/avatars/avatar.jpg"।

0

ब्लॉब प्रकार क्षेत्र बनाएँ, और file_get_contents ($ imagefile)

16

का परिणाम डालने "सर्वश्रेष्ठ" अपने लक्ष्य क्या है पर निर्भर करता है।

उपयोगकर्ता द्वारा अपलोड की गई छवियों को संग्रहीत करने के दो प्राथमिक तरीके या तो बाइनरी सामग्री को बीएलओबी के रूप में डेटाबेस में डाल रहे हैं, या कहीं भी ड्राइव पर छवियों को संग्रहीत कर रहे हैं और डेटाबेस में प्रवेश दर्ज करते हैं जो दर्शाता है कि कौन सी छवि संबंधित है।

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

फाइल सिस्टम पर फ़ाइल के रूप में छवियों भंडारण, पुनः प्राप्ति अत्यंत जल्दी और कुशल बनाने का अतिरिक्त लाभ है।

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

एक तालिका में प्रत्येक पंक्ति में बाइट्स का एक बहुत लाना के साथ काम करने के लिए कि तालिका बहुत धीमी गति से बनाता है। आप उन चीजों में ऐसी चीज नहीं चाहते हैं जो भारी उपयोग देखते हैं।

+0

यदि आप डेटाबेस का उपयोग करने जा रहे हैं, तो यह एक बहुत अच्छा विचार है। और छवियों की मेज पर लोड को हल्का करने के लिए, छवियों को कैश करने के लिए memcache का उपयोग करके भी मदद मिलेगी। – BraedenP

+0

अनुशासनिक: यदि आपकी फ़ाइल सामग्री को तुरंत एक्सेस करने की आवश्यकता है, तो उसे डेटाबेस में संग्रहीत न करें। –

13

छवियाँ वास्तव में कारणों की एक जोड़ी के लिए फाइल सिस्टम पर संग्रहित किया जाना चाहिए:

  • प्रॉक्सी और यदि संशोधित के बाद से वेब अनुरोध: अपाचे संसाधित कर सकते हैं आप के लिए यदि संशोधित के बाद से HTTP हेडर और एक 304 प्रतिक्रिया वापस कर दें, और यह आपके द्वारा प्राप्त किए जा सकने वाले सर्वोत्तम प्रदर्शन के बारे में है। आईएसपी में पोस्ट रिवर्स स्क्विड प्रॉक्सी और प्रॉक्सी इस का लाभ उठाने का प्रयास करेंगे।

  • वायरस स्कैनिंग: यदि आप किसी भी फ़ाइल अपलोड की अनुमति देते हैं, तो झटके यह देखने के लिए डरावनी सामग्री को आजमाएंगे और अपलोड करेंगे कि वे आपकी साइट को बर्बाद कर सकते हैं या नहीं। ClamAV को चलाने के लिए या आपके उपयोगकर्ता अपलोड के विरुद्ध की तरह यह देखना अनुचित नहीं है कि क्या कोई समस्या है या नहीं। यदि आप मैलवेयर के लिए रिकॉर्ड स्कैन करना चाहते हैं तो आप अपने डेटाबेस को जोड़ना नहीं चाहेंगे।

  • स्कीमा सादगी: यदि आप फ़ाइल अपलोड की अनुमति देते हैं, तो आपको MIME-type, फ़ाइल आकार, ऊंचाई और चौड़ाई के बारे में मेटा डेटा भी जोड़ना होगा। यदि फ़ाइल स्वयं तालिका में MIME-type से मेल नहीं खाती है, तो आपको तालिका से चयन करने और उसे /usr/bin/file में स्ट्रीम करने की आवश्यकता है। यह shell_exec("/usr/bin/file /path/to/mumble") के लिए बहुत आसान हो सकता है।

  • अँगूठा-श्रेष्ठ: उपयोगकर्ता छवि अपलोड अंगूठे के किसी न किसी को जरूरत होने की संभावना है, और यह अक्सर बहुत आसान किया वास्तविक वेब अनुरोध करने के लिए अतुल्यकालिक है। यह वास्तव में मजेदार नहीं है जब कुछ अच्छी तरह से उपयोगकर्ता अपने पेशेवर फोटोग्राफर दोस्त द्वारा दी गई 150 एमबी फोटोशॉप फ़ाइल अपलोड करने का प्रयास करते हैं, और वेब अपर्याप्त की स्मृति स्थान में ImageMagick लाइब्रेरी को लोड करने का प्रयास करते समय आपका अपाचे उदाहरण ओओएम चला जाता है। यह वास्तव में अपाचे श्रमिकों के लिए स्केल नहीं करता है। इस काम को संभालने के लिए अपाचे के बाहर एक कार्य कतार/क्रॉन नौकरी बनाएं।

  • टेबल भ्रष्टाचार: वाह, आप नहीं वास्तव में यदि आपके MySQL इंडेक्स फ़ाइल borked हो जाता है सभी उपयोगकर्ता अवतारों अपंग करना चाहते हैं और आपको लगता है कि मेज पर एक ऑफ़लाइन तालिका मरम्मत करने की जरूरत है।

  • बैकअप और बहाल: आप नहीं वास्तव में mysqldump के साथ एक बड़ी मेज लॉक करना चाहते हैं। Rsync का उपयोग करके आपको बहुत समय बचाएगा और आपको अधिक लचीलापन मिलेगा। टेबल्स को आम तौर पर एक पूरे टेबल को पुनर्स्थापित किया जाता है - टेबल को आम तौर पर छोटे टुकड़ों में बैक अप नहीं किया जाता है।

3

प्रयोक्ता आईडी निर्देशिका का नाम किया जा रहा है और इसके अंदर उपयोगकर्ता के चित्रों को सहेजने वाले प्रत्येक उपयोगकर्ता के लिए अपने सर्वर पर एक नया निर्देशिका हैं।

<img src="<path>/users_images/<user_id>/thumb.gif" /> 
संबंधित मुद्दे