2009-07-13 7 views
5

क्या PHP GD image library को स्मृति से बाहर होने से रोकने का कोई तरीका है? यदि बहुत बड़ी छवि अपलोड की जाती है, तो जीडी स्क्रिप्ट को समाप्त करने, स्मृति से बाहर निकलता है। मैं इसे पकड़ने के लिए एक आकर्षक अपवाद या कुछ फेंकना चाहता हूं, लेकिन यह नहीं है।जीडी छवि पुस्तकालय को स्मृति से बाहर होने से रोकने के लिए एक असफल-सुरक्षित तरीका? (PHP)

अभी मैं एक कोबल्ड-एक साथ लिपि का उपयोग कर रहा हूं जो पहले ini_set('memory_limit', '128M') जारी करता है, यदि यह काम करता है तो मैं आमतौर पर सभी सेट करता हूं। सर्वर कॉन्फ़िगरेशन के आधार पर हालांकि यह संभव नहीं हो सकता है, इसलिए मैं एक एल्गोरिदम पर वापस आ रहा हूं जो आवश्यक स्मृति की मात्रा का आकलन करने का प्रयास करता है (संकल्प, रंग गहराई, चैनल और खाते में एक धुंध कारक लेना), फिर इसकी तुलना करता है memory_get_usage() यदि फ़ंक्शन मौजूद है, अन्यथा कोई अनुमान है।

पूरी बात अब तक काम करती है, लेकिन यह सुरुचिपूर्ण से बहुत दूर है और कुछ किनारे के मामलों में असफल हो जाएगी, मुझे यकीन है। क्या ऐसा करने का कोई बेहतर तरीका है, यानी जीडी को सब कुछ पीसने के बजाय, अगर उसे रोकना है तो ग़लत ढंग से असफल हो सकता है?

+1

बड़े जेपीईजी छवियों (नहीं-PNG या अन्य प्रकार के) जबकि लोड हो रहा है आकार दिया जा सकता, अधिक जानकारी के लिए इस उत्तर देखें: http://stackoverflow.com/questions/12661/efficient-jpeg-image-resizing- इन-पीएचपी/4613341 # 4613341 –

उत्तर

3

अधिक मेमोरी खरीदें! :- पी

गंभीरता से हालांकि, स्मृति से बाहर होना संभालना असंभव है क्योंकि आपके द्वारा की जाने वाली किसी भी कार्रवाई के लिए अधिक स्मृति की आवश्यकता होगी।

आपकी सर्वश्रेष्ठ शर्त वर्तमान मेमोरी सेटिंग्स के आधार पर अपलोड किए जा रहे छवि के आकार को सीमित करना है।

+2

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

0

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

+0

यही वह है जो मैं करने की कोशिश कर रहा हूं, लेकिन साझा मेजबानों पर यह शायद ही कभी संभव है। उन मामलों के लिए मैं हैंग-अप को रोकने के लिए सर्वोत्तम अनुमान गणना कर रहा हूं। – deceze

+0

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

1

ऐसा करने का एक और तरीका है, लेकिन यह समय लेने वाला हो सकता है, क्योंकि छवि संपादन प्रक्रिया के कुछ हिस्सों को दोहराया जाएगा कई बार, लेकिन आप स्मृति अनुमान को अपने अनुमानित मान पर सेट कर सकते हैं, फिर छवि को संसाधित करने का प्रयास करें, अगर यह अपवाद को पकड़ने में विफल रहता है, स्मृति सीमा बढ़ाता है, फिर छवि को दोबारा संसाधित करता है - जब तक आप सफल नहीं हो जाते या किसी निश्चित स्मृति सीमा तक नहीं पहुंच जाते - उस बिंदु पर आप उपयोगकर्ता को यह बताते हुए एक त्रुटि संदेश फेंक देंगे कि उनकी छवि का उपयोग करने के लिए बहुत बड़ा है।

संपादित करें: http://au2.php.net/set_error_handler#35622

+0

फिर से पढ़ें, AFAIK कुछ भी फेंकने योग्य नहीं है। यह एक शॉट शॉट है-या-यह ऑपरेशन नहीं करता है। जब तक कि आप मुझे बता सकें कि आउट-ऑफ-मेमोरी त्रुटि कैसे पकड़ें, जो मैं पूछ रहा हूं। :) – deceze

+2

इन त्रुटियों को पकड़ने का एक तरीका है: http://au2.php.net/set_error_handler#35622 – jsnfwlr

+0

मुझे यह देखना होगा कि यह वास्तव में मदद करता है, जैसा कि निक द्वारा उल्लेख किया गया है, मुझे और मेमोरी का उपयोग करना होगा इसके बाद त्रुटि से निपटने के लिए। – deceze

0

PHP के घातक त्रुटियों को पकड़ने के लिए, "स्मृति समाप्त" या "पीएचपी गंभीर त्रुटि की तरह: की अनुमति स्मृति 8,388,608 के आकार के बाहर के स्मृति त्रुटि पकड़ने के लिए, आप इस समाधान इस्तेमाल कर सकते हैं बाइट थक गया (आवंटित करने की कोशिश की ... बाइट्स) ", यहां देखें: http://php.net/manual/en/function.set-error-handler.php#88401

+0

एक बार PHP स्क्रिप्ट स्मृति से बाहर हो जाने पर, यह शट डाउन फ़ंक्शन को कॉल नहीं कर सकता है क्योंकि उसे अधिक मेमोरी आवंटन की आवश्यकता होगी। – scotts

3

एक छवि बनाने के बाद।

imagepng($image); 
imagedestroy($image); 

स्मृति समस्या

+0

इसे उत्तर के रूप में चिह्नित किया जाना चाहिए, यह मेरे लिए एक आकर्षण की तरह काम करता था। – Vic

+0

यह ** ** ** को उत्तर के रूप में चिह्नित नहीं किया जाना चाहिए। एक छवि को नष्ट करना स्मृति उपयोग को बचाता है, लेकिन किसी भी तरह से जीडी अधिक गर्व से व्यवहार नहीं करता है। – Glutexo

0

निकाल देंगे कितना स्मृति की जाँच करने के लिए प्रत्येक gd समारोह की जरूरत कुछ परीक्षण करते हैं।

  • imagecreatetruecolorwidth*height*5 bytes जरूरत है लगता है।

  • imagepngwidth*height*4 bytes की आवश्यकता है।

+0

'imagecreatetruecolor' को प्रति पिक्सेल 5 बाइट्स क्यों चाहिए? एक विषम संख्या की तरह लगता है। – Luke

+0

क्योंकि अल्फा समर्थन imagecreate के बाद एक लंबे समय जोड़ा गया है, और कार्यों का एक बहुत शायद, मान्यताओं था 4 बाइट हमेशा से 0 तो यह प्रयोग नहीं किया जा सकता है ... या उन्होंने सोचा/देखा कि यह इसका इस्तेमाल करने की बहुत जटिल था और एक नया बनाया। – sebbu

+0

क्या आपके पास शीर्ष पर मौजूद मौजूदा छवियों को लोड करते समय भी कोई अनुभव है? जैसे जेपीजी या पीएनजी के लिए? मैं वर्तमान मेम उपयोग के शीर्ष पर, jpg के लिए x * y * ~ 5 का उपयोग करता हूं, ~ 8 पीएनजी के लिए। यदि वह मेम सीमा से अधिक है तो मैंने अपवाद सेट किया है। लेकिन: 64 एम को सीमा के रूप में सेट करना और 2 एमबी अपलोड किया गया jpg कभी-कभी ऑपरेशन तोड़ सकता है। जेपीजी कभी-कभी अधिक स्मृति का उपयोग करता प्रतीत होता है। संपीड़न? कोई अन्य exif डेटा? जहां मैं गणना में सुधार कर सकता हूं? – flobee

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