• 2 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
Fatal error: Allowed memory size
#1
با سلام و درود
من کد زیر رو نوشتم با فایل های زیر 100 کیلو مشکلی نداره همین که یه فایلی بالا حتی با حجم مثلا 200 کیلو ارسال میکنم توی local فایل اصلی رو میسازه برای ساخت فایل با حجم کوچک توی لوکال پیام زیر رو میده توی هاست که امتحان میکنم وقتی فایل رو ارسال میکنم صفحه سفید میاد و فایل اصلی رو هم توی هاست ایجاد نمیکنه .
لطفا راهنماییم کنید بدجوری گیر افتادم.
کد:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 32000 bytes) in ... line 216

کد پی‌اچ‌پی:
if ( isset($_FILES["InputImg"]) && ($_FILES["InputImg"]["size"] > 0) ) {
                        
$allowed_filetypes = array('jpg','gif','bmp','png');
                    
/// NAME
                        
$datename=date("s");
                        
$imagename $_FILES["InputImg"]["tmp_name"];
                        
$name $_FILES['InputImg']['name'];
                        
$cutname=explode('.',$name,2);
                        
$onlyname=$cutname[0].'='.$datename.'.'.$cutname[1];
                        if(!
in_array($cutname[1],$allowed_filetypes))
                            die(
'<div class="err_top cnl icon-nonacc"> نوع فایل انتخابی قابل قبول نیست</div>');
                        if(
filesize($_FILES['InputImg']['tmp_name']) > 9999999999 )
                              die(
'<div class="err_top cnl icon-nonacc"> حجم تصویر مورد نظر بالاست</div>');
                    
/// CHECK FILE
                        
$fp fopen($imagename'r');
                        
$ImageName fread($fpfilesize($imagename));
                        if(!
get_magic_quotes_gpc()) { $ImageName addslashes($ImageName); }
                        
fclose($fp);
                    
/// MOVE
                        
move_uploaded_file($_FILES['InputImg']['tmp_name'],$path $onlyname);
                    
// گرفتن سایز تصویر اصلی و محاسبه سایز تصویر کوچک
                        
$percent 0.5;
                        list(
$width$height) = getimagesize($path $onlyname);
                        
$newwidth $width $percent;
                        
$newheight $height $percent;
                    
// لود کردن تصویر اصلی
                        
$thumb imagecreatetruecolor($newwidth$newheight);
                        
$source imagecreatefromjpeg($path.$onlyname);
                    
// تولید تصویر کوچک
                        
imagecopyresized($thumb$source0000$newwidth$newheight$width$height);
                    
// ارسال اطلاعات تصویر کوچک تولید شده به بروز
                        
imagejpeg($thumb$path.$cutname[0].'='.$datename.'_small'.'.'.$cutname[1]); 
  پاسخ
تشکر شده توسط :
#2
این خطا به خاطر اینکه کتابخونه ی gd هنگام ساخت تصویر از روی فایل شما با کمبود حافظه مواجهه میشه، شما دو راه حل دارید:
1. با دستور زیر میزان حافظه مورد استفاده php رو افزایش بدین (به اندازه ی مورد نیاز):
کد:
ini_set('memory_limit', '128M');
2. از کتابخونه ی Imagick استفاده کنید( از حافظه به شکل بهتری استفاده میکنه).
به یـزدان که گر ما خرد داشتیم
کجـا این سر انجـام بد داشتیم؟
  پاسخ
تشکر شده توسط : moh3nmir
#3
اسم تاپیک رو بهتر انتخاب کنید لطفا. شاید سوال شما مشکل شخص دیگری رو هم حل کنه.
غایب
  پاسخ
تشکر شده توسط :
#4
(۱۳۹۴ خرداد ۱۱, ۰۴:۴۰ ب.ظ)sara147 نوشته:
کد:
ini_set('memory_limit', '128M');
من اینو داخل کدم گذاشتم هم لوکال و هم هاست هیچ تاثیری نداشت جای خاصی باید قرار گیره ؟
(۱۳۹۴ خرداد ۱۱, ۰۴:۴۰ ب.ظ)sara147 نوشته: 2. از کتابخونه ی Imagick استفاده کنید( از حافظه به شکل بهتری استفاده میکنه).
متاسفانه اصلا آشنایی با این کتابخانه ندارم و مجالی نیست برای یادگیری چون این کار رو باید فورا تحویل بدم ...
  پاسخ
تشکر شده توسط :
#5
توی هاست‌ها معمولا تابع ini_set رو میبندن.
یک درخواست بدین به پشتیبانی هاستتون که این مقدار رو زیاد کنن براتون.
توی لوکال هم از طریق php.ini یک آزمایش بکنید. جستجو بکنین پیدا میکنین آموزش رو.
غایب
  پاسخ
تشکر شده توسط : moh3nmir
#6
(۱۳۹۴ خرداد ۱۲, ۱۲:۰۰ ب.ظ)moh3nmir نوشته: من اینو داخل کدم گذاشتم هم لوکال و هم هاست هیچ تاثیری نداشت جای خاصی باید قرار گیره ؟
128 پیش فرضه، شما عددی بالاتر قرار بدین.
به یـزدان که گر ما خرد داشتیم
کجـا این سر انجـام بد داشتیم؟
  پاسخ
تشکر شده توسط : moh3nmir
#7
اول اینکه فکر کنم مشکل از دستورات fopen ت باشه، از اونجایی که شما داخل شرط زدی: بیشتر از 9999999999999!

در هر صورت در ادامه صحبتهای دوستان یکسری نکته بگم، اینکه می تونی مقدار memory_limit رو 1- قرار بدی تا دیگه محدودیت مموری نباشه و هرچقدر که مموری لازم داره استفاده کنه. شاید مالک هاست ازت ایراد بگیره یا اجازه نده و غیره... ولی بعضی وقتا پروژه تون واقاً به مموری زیادی احتیاج داره و ضعفی در کدنویسی تون نیست!

از داخل htaccess هم می تونی تنظیمش کنی (256 php_value memory_limit). همچنین یه فایلی هم (اگه اشتب نکنم) در public_html ت قرار داره بنام .user.ini، در اونجا هم می تونی تنظیمش کنی.

بعلاوه حالا که دیتاهات و پردازشش کمی سنگین شده، مقدار max_execution_time و max_input_time رو هم چک کن که مناسب باشه، که تا قبل از پردازش کدهات TIME OUT نشه!

در آخر بد نیست از Xdebug استفاده کنی تا ببنی دقیقا کجا این حافظه خوری رخ میده
وبلاگ: Yousha.Blog.ir


کد کمتر => خطای کمتر => قابل فهمتر => خوانایی بیشتر => نگهداری بهتر
  پاسخ
تشکر شده توسط : Alaa sara147 moh3nmir M.J
#8
با سلام و درود و تبریک اعیاد گذاشته ، شرمنده من یه ماموریت ضروری پیش اومد که نتونستم توی این سه روز کار کنم.
یه نکته درباره این پروژه بگم که این سایتی که من نوشتم cms نیست و از 0 تا 100 رو نوشتم که به مرور زمان مشکلاتی که پیش میاد رو دارم رفع میکنم.
از شما دوستان که در این زمینه منو راهنمایی میکنید خیلی ممنونم ...
(۱۳۹۴ خرداد ۱۲, ۱۰:۰۲ ب.ظ)Y.P.Y نوشته: در هر صورت در ادامه صحبتهای دوستان یکسری نکته بگم، اینکه می تونی مقدار memory_limit رو 1- قرار بدی تا دیگه محدودیت مموری نباشه و هرچقدر که مموری لازم داره استفاده کنه. شاید مالک هاست ازت ایراد بگیره یا اجازه نده و غیره... ولی بعضی وقتا پروژه تون واقاً به مموری زیادی احتیاج داره و ضعفی در کدنویسی تون نیست!
من این کد رو داخل سایت بشکل زیر حتی توی فایل start سایت که دیتابیس رو فراخوانی میکنه رو هم گذاشتم ولی باز همون خطای Fatal error توی لوکال و صفحه سفید داخل هاست میاره.
کد:
ini_set("memory_limit","256M");
(۱۳۹۴ خرداد ۱۲, ۱۰:۰۲ ب.ظ)Y.P.Y نوشته: از داخل htaccess هم می تونی تنظیمش کنی (256 php_value memory_limit). همچنین یه فایلی هم (اگه اشتب نکنم) در public_html ت قرار داره بنام .user.ini، در اونجا هم می تونی تنظیمش کنی.
بعلاوه حالا که دیتاهات و پردازشش کمی سنگین شده، مقدار max_execution_time و max_input_time رو هم چک کن که مناسب باشه، که تا قبل از پردازش کدهات TIME OUT نشه!
کدهای زیر رو من داخل htaccess گذاشتم ولی هیچ تاثیری نداشت (اگر IfModule نزارم ارور 500 میده )
کد:
<IfModule mod_php5.c>
php_value post_max_size 200M
php_value upload_max_filesize 200M
php_value memory_limit 300M
php_value max_execution_time 259200
php_value max_input_time 259200
php_value session.gc_maxlifetime 1200
</IfModule>
(۱۳۹۴ خرداد ۱۲, ۱۲:۰۷ ب.ظ)Alaa نوشته: یک درخواست بدین به پشتیبانی هاستتون که این مقدار رو زیاد کنن براتون.
با هاست هم صحبت کردم و پیام زیر رو داد بهم و باز هم هیچ تاثیر خاصی نداشت.
نقل قول:لطفا این موضوع را در نظر داشته باشید اعمال کد php_value upload_max_filesize در فایل .hcasses باعث اختلالاتی در این زمینه خواهد شد، بنابراین لازم است تا تنظیمات از سوی تیم پشتیبانی در php.ini انجام گردد. توجه فرمائید میزان حجم آپلود برروی دامنه شما تا 100 مگ افزایش یافت.
  پاسخ
تشکر شده توسط :
#9
تصاویری که آپلود میکنید و باعث خطا میشن، چه عرض و ارتفاع پیکسلی دارن؟

این کد رو در ابتدای اسکریپتتون قرار بدین.
کد پی‌اچ‌پی:
echo ini_get('memory_limit'); 
نتیجه رو اعلام کنید.
به یـزدان که گر ما خرد داشتیم
کجـا این سر انجـام بد داشتیم؟
  پاسخ
تشکر شده توسط : moh3nmir
#10
با سلام و درود
از شما sara147 ممنونم که به نکته خیلی خوبی اشاره کردین که باعث شد به چند چیز پی ببرم و مشکلم با کدی که آقای Y.P.Y دادن حل شد فقط جای اونو بد میزاشتم برای همین جواب نمیداد بهم منظورم کد زیر هست
کد پی‌اچ‌پی:
ini_set("memory_limit","-1"); 
(۱۳۹۴ خرداد ۱۶, ۰۵:۱۷ ب.ظ)sara147 نوشته: تصاویری که آپلود میکنید و باعث خطا میشن، چه عرض و ارتفاع پیکسلی دارن؟
آخرینش که مشتری آپ کردن 8000 در 6000 پیکسل هستو با حجم 3 مگ . اندازه استاندارد برای آپ عکس چقدره و دستور خاصی هست که بشه اندازه مشخصی رو برتی عکس مشخص نمود؟ وقتی شما گفتین بررسی کنید با کد بالا که گذاشتم از 3 خط زیر خطا میگرفت
کد پی‌اچ‌پی:
// لود کردن تصویر اصلی
$thumb imagecreatetruecolor($newwidth$newheight);
$source imagecreatefromjpeg($path.$onlyname);
// تولید تصویر کوچک
imagecopyresized($thumb$source0000$newwidth$newheight$width$height); 
(۱۳۹۴ خرداد ۱۶, ۰۵:۱۷ ب.ظ)sara147 نوشته: این کد رو در ابتدای اسکریپتتون قرار بدین.
کد پی‌اچ‌پی:
echo ini_get('memory_limit'); 
نتیجه رو اعلام کنید.
کد پی‌اچ‌پی:
echo 'اندازه مموری : '.ini_get('memory_limit').' ';
echo 
'اندازه فایل : '.round(filesize($_FILES['InputImg']['tmp_name'])/1024); 
نقل قول:اندازه مموری : -1 اندازه فایل : 3548
  پاسخ
تشکر شده توسط :


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان