মারাত্মক ত্রুটি: অনুমোদিত মেমরির আকার 134217728 বাইট শেষ হয়ে গেছে (কোডইগনিটার + এক্সএমএল-আরপিসি)


617

আমার কাছে একগুচ্ছ ক্লায়েন্ট পয়েন্ট অফ সেল (পিওএস) সিস্টেম রয়েছে যা পর্যায়ক্রমে একটি কেন্দ্রীভূত ডাটাবেসে নতুন বিক্রয় ডেটা প্রেরণ করে, যা তথ্য উত্সার জন্য ডেটাটিকে একটি বড় ডাটাবেসে সংরক্ষণ করে।

ক্লায়েন্ট POS পিএইচপিপোস উপর ভিত্তি করে, এবং আমি একটি মডিউল প্রয়োগ করেছি যা পরিষেবাগুলিতে বিক্রয় ডেটা প্রেরণে স্ট্যান্ডার্ড এক্সএমএল-আরপিসি লাইব্রেরি ব্যবহার করে। সার্ভার সিস্টেমটি কোডইগনিটারে নির্মিত এবং ওয়েবসারস উপাদানটির জন্য এক্সএমএল-আরপিসি এবং এক্সএমএল-আরপিসিএস লাইব্রেরি ব্যবহার করে। যখনই আমি প্রচুর বিক্রয় ডেটা প্রেরণ করি (বিক্রয় টেবিল থেকে 50 টি সারি এবং বিক্রয়ের প্রতিটি আইটেমের সাথে সম্পর্কিত বিক্রয়_items থেকে স্বতন্ত্র সারি) আমি নিম্নলিখিত ত্রুটিটি পাই:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 54 bytes)

128M এর মধ্যে ডিফল্ট মান php.ini, তবে আমি ধরে নিই যে এটি একটি বিশাল সংখ্যা break প্রকৃতপক্ষে, আমি এই মানটি 1024 এম তে সেট করার চেষ্টা করেছি এবং এটি সমস্ত কিছু ত্রুটি থেকে বেরিয়ে যেতে আরও বেশি সময় নেয়।

আমি যে পদক্ষেপ নিয়েছি সেগুলি সম্পর্কে, আমি সার্ভার-সাইডে সমস্ত প্রক্রিয়াকরণ অক্ষম করার চেষ্টা করেছি এবং ইনপুট নির্বিশেষে একটি ক্যানড প্রতিক্রিয়া ফিরিয়ে দেওয়ার জন্য তাড়িত করেছি। তবে আমি বিশ্বাস করি যে সমস্যাটি ডেটা প্রকৃত প্রেরণের মধ্যে রয়েছে in এমনকি আমি পিএইচপি-র জন্য সর্বোচ্চ স্ক্রিপ্ট প্রয়োগের সময়টি অক্ষম করার চেষ্টা করেছি এবং এটি এখনও ত্রুটি থেকে যায়।


5
আমি কিছুটা বিভ্রান্ত ... ত্রুটিটি কোথায় ঘটে - ক্লায়েন্ট বা সার্ভারে? এবং কোন পর্যায়ে ... ক্লায়েন্ট প্রেরণ, সার্ভার গ্রহণ, সার্ভার প্রসেসিং, সার্ভার প্রেরণ, ক্লায়েন্ট গ্রহণ বা ক্লায়েন্ট প্রসেসিং?
গ্রেগ

2
ক্লায়েন্ট প্রেরণের সময় বা সার্ভার গ্রহণের সময় ত্রুটিটি ঘটেছে বলে মনে হচ্ছে। আমি সমস্ত সার্ভারসাইড প্রসেসিং নিষ্ক্রিয় করার চেষ্টা করেছি এবং প্রেরিত ডেটা নির্বিশেষে একটি ক্যানড প্রতিক্রিয়া প্রেরণের জন্য তা ছড়িয়ে দিয়েছি। যদি আমি নির্দিষ্ট পরিমাণে ডেটা প্রেরণ করি তবে ত্রুটি ঘটে। আমি PHP.ini সেটিংস পরিবর্তন করছি।
আর্কটিক জিরো

42
মেমরির সীমা 128MB, এটিকে স্যাবল করুন:ini_set('memory_limit', '256M');

9
সংক্ষিপ্তসারটি "কেবলমাত্র ফাঁস উপেক্ষা করুন" উত্তরগুলিকে, জনগণকে যারা কোডআইগনিটারকে দ্রুপালের সাথে বিভ্রান্ত করেছিল এবং পয়েন্ট পেতে অন্য লোকের উত্তরগুলি কেবল অনুলিপি করে এবং পেস্ট করেছে এমন লোকদের, সর্বস্বান্ত করেছে। এটির মধ্যে উত্তরের গুণমানটি অত্যন্ত অস্বাভাবিক।
মট্টি ভির্ককুনেন

উত্তর:


697

পরিবর্তন memory_limitদ্বারা ini_set('memory_limit', '-1');হয় না একটি সঠিক সমাধান। দয়া করে এটি করবেন না।

আপনার পিএইচপি কোডটিতে কোথাও একটি মেমরি ফাঁস হতে পারে এবং আপনি সার্ভারকে যা চান তার সমস্ত মেমরি ব্যবহার করতে বলছেন। আপনি সমস্যাটি একেবারেই স্থির করবেন না। আপনি যদি নিজের সার্ভারটি নিরীক্ষণ করেন তবে আপনি দেখতে পাবেন এটি এখন সম্ভবত বেশিরভাগ র‍্যাম ব্যবহার করছে এবং এমনকি ডিস্কে অদলবদল করছে।

আপনার সম্ভবত আপনার কোডের আপত্তিকর কোডটি ট্র্যাক করে এটি ঠিক করার চেষ্টা করা উচিত।


173
@ জেফ আপনি সম্ভবত 95% সময় ঠিক করেছেন। যাইহোক, এমন অনেক সময় আসে যখন আপনার আসলে আরও মেমরির প্রয়োজন হয়। উদাহরণস্বরূপ, আসুন আমরা বলি যে আপনার অ্যাপ্লিকেশন প্রসেসিংয়ের জন্য মেমরিতে প্রচুর পরিমাণে ডেটা লোড করছে (15 কে উপাদানযুক্ত একটি বিলের উপাদান বলুন)। কোডটি বাগিচা হয়ে থাকে এমন ক্ষেত্রে সবসময় হয় না, কখনও কখনও আপনার আরও কিছুটা মেমোরি প্রয়োজন (যেমন 128 এম এর পরিবর্তে 256 এম)। তবে আমি সম্মত হই যে এটি -1 এ সেট করা মারাত্মক খারাপ। তবে রান-টাইমে যুক্তিসঙ্গত পরিস্থিতিতে মেমরি সীমাটি সামঞ্জস্য করা পুরোপুরি গ্রহণযোগ্য ইমো।
পাইরেট

24
@ স্প্রিট হ্যাঁ আপনি ঠিক বলেছেন যে কখনও কখনও কোনও প্রক্রিয়াটির জন্য আরও মেমরির প্রয়োজন হয় তবে আপনার মেমরির সীমাটি 256MB এর মতো কিছু যৌক্তিক পরিমাণে বাড়ানো উচিত বা 512 এমবি কেন নয় -1;)
লুকাস লুকাক

9
@ জেফ আমি পুরোপুরি একমত, এর মান পরীক্ষার উদ্দেশ্যে কেবলমাত্র পরিবেশের -1ক্ষেত্রে কার্যকর হতে পারে ।
এসোলিটোস

4
@ পাইরাইট যে ক্ষেত্রে আপনি বাকী 5% নাম রেখেছেন সেগুলিতে খণ্ডগুলিতে ডেটা পড়ুন এবং আরও মেমরি ব্যবহার করার পরিবর্তে কোনও কর্মী এটি প্রক্রিয়াতে ব্যবহার করুন। এই সমাধানটি তত্ক্ষণাত্ স্কেল হবে যখন ডেটা বৃদ্ধি পেলে আপনার পরামর্শটি আপনার সার্ভারে আরও বেশি পরিমাণে মেমরি স্টাফ করা বাদ দিয়ে কাজ করবে না।
বুড়জুম

2
খুব সাধারণ উপায়ে এই সমস্যাটি যখন আপনি খুব বেশি পিএইচপি মেমরির সীমাবদ্ধ করে সমস্ত ডেটা আনার চেষ্টা করেন তখন ORM এ সমস্যা। উদাহরণস্বরূপ আপনি যখন মাসিক প্রতিবেদন উত্পন্ন করার চেষ্টা করবেন।
স্টেপচিক

213

ini_set('memory_limit', '-1');ডিফল্ট পিএইচপি মেমরি সীমা ওভাররাইড করে ।


16
@williamcarswell; এই প্রসঙ্গে -1পিএইচপি একটি সীমাহীন হিসাবে বোঝে ।
অ্যালিক্স অ্যাক্সেল

7
@ আর্সেনিয়াসজিওজিিকি - এটি সার্ভারকে ছাড়িয়ে দিতে পারে না এমন সংস্থানগুলিও ব্যবহার করবে ।
কেন উইলিয়ামস

124
লজ্জাজনক যে এটি অনেক উপকার পেয়েছে। যখন php.ini সম্পাদনা বা ini_set হয় তার সাথে একটি সঠিক মান হিসাবে সেট করা একটি সঠিক বৈধ সমাধান যখন লোকদের আরও মেমরির প্রয়োজন হয়। সীমাহীন এ সেট করা একটি বিপজ্জনক হ্যাক :(
জেফ ডেভিস

24
@ ব্যবহারকারী 1767586 এরপরে এটি একটি বুদ্ধিমান মানতে সেট করুন। আপনি স্ক্রিপ্টটি 1024 এম তে সেট করে ত্রুটিটি ছুঁড়ে ফেলতে বাধা দিতে পারেন। যদি এই উত্তরটি ইনআই_সেট বলে ('মেমোরি_মিলিট', '1024 এম'); আপনি এটি অনুলিপি করতে পারেন এবং ঠিক আছে। এটি -1 এ সেট করে আপনি নিজেকে একটি স্ক্রিপ্ট তৈরি করতে যা সমস্ত স্মৃতি গ্রাস করে। বিশেষত যদি আপনি এটি নিয়মিত করেন। উদ্ধৃতিগুলিতে "বিপজ্জনক" রাখা এটিকে কম বিপজ্জনক করে তোলে না। আপনি সত্যিই আপনার হোস্ট সার্ভার হোস করতে পারেন। হতে পারে ডেটা ধ্বংস করা শুরু করুন। আমি জানি না, হয়ত তোমার চাকরিটা হারাবে? আমার কাছে বেশ বিপজ্জনক মনে হচ্ছে। : |
জেফ ডেভিস

3
দুঃখের সাথে দেখে যে +161 ভোট এবং -3 ভোটের উত্তর একই :(
আকার্থিক 10

130

সঠিক উপায় হ'ল আপনার php.iniফাইলটি সম্পাদনা করা । memory_limitআপনার ইচ্ছা মানটি সম্পাদনা করুন ।

আপনার প্রশ্ন হিসাবে, 128M(যা পূর্বনির্ধারিত সীমা) অতিক্রম করা হয়েছে, সুতরাং আপনার কোডের সাথে মারাত্মক কিছু ভুল রয়েছে কারণ এটি এতটা গ্রহণ করা উচিত নয়।

আপনি যদি জানেন যে এটি কেন এত বেশি লাগে এবং আপনি এটি সেট memory_limit = 512Mবা উচ্চতরটিকে মঞ্জুরি দিতে চান এবং আপনার ভাল হওয়া উচিত।


7
সত্যিই, যদি আপনার কিছু গুরুতর পরিমাণে ডেটা ক্যাশে করা হয় তবে এটি সঠিক উত্তর। নির্দিষ্ট স্ক্রিপ্টগুলির জন্য 128 এম যথেষ্ট নয়। 512 এম বা 1024 এম প্রায়শই যথেষ্ট হবে তবে আপনাকে কেস কেসে সিদ্ধান্ত নিতে হবে।
জেফ ডেভিস

2
ইয়াহা, তবে বিশাল মেমরির ব্যবহার এড়াতে চেষ্টা করুন, যদি ব্যবহারকারীর সংখ্যা আরও বেশি হতে থাকে
বাসভ

2
মেমরি_লিমিট = -1; php.ini

2
@ ইউয়্যুইম ইউম এটি মেমোরি_লিটকে সরিয়ে দেয়, যা আপনি কেবলমাত্র যদি চান অন্য কোনও উপায়ে মেমরির ব্যবহার নিরীক্ষণ করেন। কোনও কোনও উপায়ে বিপুল পরিমাণ মেমরি নিলে ওএস প্রক্রিয়াটি হারাবে।
ফ্লিম

সুতরাং আপনি যদি কোনও স্ক্রিপ্ট চালাচ্ছেন যা প্রচুর স্মৃতি ব্যবহার করে তবে আপনার কেবল এটি একবার চালানো দরকার, আপনি কি মৃত্যুদন্ড কার্যকর করার সময় প্রক্রিয়াটির জন্য মেমরির সীমাটি বাড়িয়ে দিতে পারেন, তারপরে আপনার এক সময়ের পরে আবার আপনার স্মৃতি সীমাটি কমিয়ে দিতে পারেন? স্ক্রিপ্ট চলে?
ক্রোমক্রিস

95

পিএইচপি জন্য মেমরি বরাদ্দ স্থায়ী বা সাময়িকভাবে সামঞ্জস্য করা যেতে পারে।

স্থায়িভাবে

আপনি স্থায়ীভাবে পিএইচপি মেমরির বরাদ্দ দুটি উপায় পরিবর্তন করতে পারেন।

আপনার যদি আপনার php.iniফাইলে অ্যাক্সেস থাকে তবে আপনি memory_limitনিজের ইচ্ছার মানটির জন্য মানটি সম্পাদনা করতে পারেন ।

আপনার যদি আপনার php.iniফাইলে অ্যাক্সেস না থাকে (এবং আপনার ওয়েবহোস্ট এটি অনুমতি দেয়) তবে আপনি নিজের .htaccessফাইলের মাধ্যমে মেমরি বরাদ্দকে ওভাররাইড করতে পারেন । যোগ করুন php_value memory_limit 128M(বা আপনার কাঙ্ক্ষিত বরাদ্দ যাই হোক না কেন)।

অস্থায়ী

আপনি পিএইচপি ফাইলের মধ্যে থেকে ফ্লাইতে মেমরি বরাদ্দ সামঞ্জস্য করতে পারেন। আপনার কেবল কোড রয়েছে ini_set('memory_limit', '128M');(বা আপনার পছন্দসই বরাদ্দ যা কিছু হোক)। আপনি মানটিকে "-1" এ সেট করে মেমরি সীমাটি সরিয়ে ফেলতে পারেন (যদিও মেশিন বা উদাহরণসীমা সীমা এখনও প্রয়োগ হতে পারে)।


2
আপনাকে ধন্যবাদ, আমি php.ini কে ওভাররাইড করছে এমন .htaccess এ কোনও মান নির্ধারণ করেছিলাম কিনা তা যাচাই করতে ভাবিনি এবং কেন +1
হোস্টমাইবাস

61

পিএইচপি স্ক্রিপ্টে মেমরি ফাঁস পাওয়া খুব সহজ - বিশেষত যদি আপনি বিমূর্ততা ব্যবহার করেন যেমন একটি ওআরএম। আপনার স্ক্রিপ্টটি প্রোফাইলে এক্সডিবুগ ব্যবহার করে দেখুন এবং সমস্ত স্মৃতি কোথায় গেছে তা খুঁজে বার করুন।


1
আমি এক্সডিবুগ চেষ্টা করব। আমি এটি আগে কখনও ব্যবহার করি নি, তাই আমাকে এটি পড়তে হবে। উত্তর দেওয়ার জন্য আপনাকে ধন্যবাদ! আশা করি আমি খুব শীঘ্রই এর উত্তরটি
পেয়েছি

34
মনে রাখবেন যে পিএইচপি মেমরি পরিচালনা করার জন্য রেফারেন্স গণনা ব্যবহার করে। সুতরাং আপনার যদি বিজ্ঞপ্তি সংক্রান্ত রেফারেন্স বা বৈশ্বিক ভেরিয়েবল থাকে তবে সেই জিনিসগুলি পুনর্ব্যবহারযোগ্য হবে না। এটি সাধারণত পিএইচপি-তে মেমরি ফাঁসের মূল।
আফ্রোস্কেন

এক্সডিবাগ দেখায় যে সিআই এর এক্সএমএলআরপিসি.পিএফ লাইব্রেরি আমার স্মৃতি ফাঁসির জন্য দায়ী। যে কোনও সুযোগে, কোডইগিনিটারের এক্সএমএল-আরপিসি লাইব্রেরি সম্পর্কে আমার কি জানা উচিত? আমি সমস্ত প্রসেসিং সার্ভার-সাইডটি অক্ষম করার চেষ্টা করেছি এবং আমি যদি পর্যাপ্ত ডেটা ফিড করি তবে এটি মেমরির বাইরে চলে যায়।
আর্টিকজিরো

1
আমি সিআই জানি / ব্যবহার করি না, তাই আমি জানি না। তবে আপনার সম্ভবত এমন একটি বিষয় অনুসন্ধান করার চেষ্টা করা উচিত যা ব্যবহারের পরে মুক্তি পায় না - সম্ভবত চক্রীয় রেফারেন্সের কারণে। এটি গোয়েন্দা-কাজ।
18:58

1
এখানে কেবলমাত্র এটিই উত্তর যা সমস্যাটি সমাধান করার পরামর্শ দেয়। অন্যান্য উত্তর একটি ওভার ব্যাণ্ডেজ মেমরি আপ ঢিলা উপসর্গ এবং উপেক্ষা রোগ
ক্রিস বেকার

56

অ্যারে_পুষ্প সহ একটি এ্যারে 22.5 মিলিয়ন রেকর্ড যুক্ত করার সময় আমি পিএইচপি.এনইআই 4Gফাইলটিতে মেমরির সীমা হিসাবে ব্যবহার করে প্রায় 20 এম রেকর্ডে "স্মৃতিশক্তি অবসন্ন" মারাত্মক ত্রুটি পেতে থাকি । এটি ঠিক করার জন্য, আমি বিবৃতিটি যুক্ত করেছি

$old = ini_set('memory_limit', '8192M');

ফাইলের শীর্ষে। এখন সবকিছু ঠিকঠাক চলছে। পিএইচপি-র কোনও স্মৃতি ফাঁস আছে কিনা তা আমি জানি না। এটি আমার কাজ নয়, আমিও যত্ন নিচ্ছি না। আমাকে শুধু আমার কাজ শেষ করতে হবে, এবং এটি কাজ করেছে।

প্রোগ্রামটি খুব সহজ:

$fh = fopen($myfile);
while (!feof($fh)) {
    array_push($file, stripslashes(fgets($fh)));
}
fclose($fh);

মারাত্মক ত্রুটি 3 ম লাইনের দিকে নির্দেশ করে যতক্ষণ না আমি মেমরি সীমাটি বাড়িয়েছি, যা ত্রুটিটি দূর করেছে।


10
মানে ini_set('memory_limit', '8192M');?
গোগল

2
এরকম কোনও কিছুর জন্য কোনও স্ক্রিপ্টকে অনুকূলিতকরণ এবং সময় দেওয়ার জন্য কত বিলাসিতা হবে। অথবা গবেষণা এবং তুলনা এবং ETL সরঞ্জাম বা এই জাতীয় কিছু শিখুন। বাস্তব বিশ্বে আমরা মেমরি ভাতাটি জ্যাক করি, কাজটি করি এবং এগিয়ে যাই।
ম্যাথু পোয়ার

45

আমি এই ত্রুটিটি memory_limitসেট করে রেখেছি php.iniএবং মানটি সঠিকভাবে পাঠিয়েছি phpinfo()

এটি থেকে এটি পরিবর্তন করে:

memory_limit=4G

এটি:

memory_limit=4096M

এটি পিএইচপি 7 এ সমস্যাটি সংশোধন করেছে।


23

আপনি যখন উপরের ত্রুটিটি দেখেন - বিশেষত যদি এটি (tried to allocate __ bytes)নিম্ন মানের হয় তবে এটি কোনও অসীম লুপের সূচক হতে পারে, এমন কোনও ফাংশনের মতো যা নিজেকে ছাড়িয়ে না ডাকে:

function exhaustYourBytes()
{
    return exhaustYourBytes();
}

19

এই দুটি লাইন সক্ষম করার পরে, এটি কাজ শুরু করে:

; Determines the size of the realpath cache to be used by PHP. This value should
; be increased on systems where PHP opens many files to reflect the quantity of
; the file operations performed.
; http://php.net/realpath-cache-size
realpath_cache_size = 16k

; Duration of time, in seconds for which to cache realpath information for a given
; file or directory. For systems with rarely changing files, consider increasing this
; value.
; http://php.net/realpath-cache-ttl
realpath_cache_ttl = 120


19

আপনি memory_limitফাস্টসিজি / এফপিএম এ পরিবর্তন করে সঠিকভাবে এটি ঠিক করতে পারেন :

$vim /etc/php5/fpm/php.ini

128 থেকে 512 এর মতো স্মৃতি পরিবর্তন করুন নীচে দেখুন

; Maximum amount of memory a script may consume (128 MB)
; http://php.net/memory-limit
memory_limit = 128M

প্রতি

; Maximum amount of memory a script may consume (128 MB)
; http://php.net/memory-limit
memory_limit = 512M

18

আপনার সাইটের মূল ডিরেক্টরি:

ini_set('memory_limit', '1024M');

1
এটি আমার জন্য কাজ করেছে। এক লাইন সমাধান ভালবাসা। সরলতার জন্য +1
স্টিভ সি

14

Php.ini ফাইলটিতে মেমরির সীমা পরিবর্তন করুন এবং অ্যাপাচি পুনরায় চালু করুন। পুনঃসূচনা করার পরে, phpinfo () চালান ; memory_limitপরিবর্তনের নিশ্চয়তার জন্য যে কোনও পিএইচপি ফাইল থেকে ফাংশন করুন ।

memory_limit = -1

মেমরি সীমা -১ এর অর্থ মেমরির সীমা নেই। এটি এখন সর্বোচ্চ।


13

দ্রুপাল ব্যবহারকারীদের জন্য, ক্রিস লেনের এই উত্তর:

ini_set('memory_limit', '-1');

কাজ করে তবে খোলার ঠিক পরে আমাদের এটি রাখা দরকার

<?php

আপনার সাইটের মূল ডিরেক্টরিতে সূচি.এফপি ফাইলটিতে ট্যাগ করুন।


13

ড্রুপাল 7 এ, আপনি আপনার সাইট / ডিফল্ট ফোল্ডারে অবস্থিত সেটিংস.এফপি ফাইলে মেমরি সীমাটি পরিবর্তন করতে পারেন। ২ line০ লাইনের চারপাশে, আপনি এটি দেখতে পাবেন:

ini_set('memory_limit', '128M');

এমনকি যদি আপনার php.ini সেটিংস পর্যাপ্ত পরিমাণে থাকে তবে আপনি যদি আপনার ড্রুপাল সেটিংস.এফপি ফাইলটিতে সেট না করে থাকেন তবে আপনি 128 এমবি এর বেশি ব্যবহার করতে পারবেন না।


1
দ্রুপাল in এ নয়, সেটিংস.এফপি-তে কোডের মতো স্ট্রিং নেই
ফ্লাই করুন


12

memory_limitআপনার php.iniফাইলের মান পরিবর্তন করার পরিবর্তে , যদি আপনার কোডের এমন কোনও অংশ থাকে যা প্রচুর মেমরি ব্যবহার করতে পারে তবে আপনি memory_limitএই বিভাগটি চালানোর আগে সরিয়ে ফেলতে পারেন এবং তারপরে এটি প্রতিস্থাপন করতে পারেন।

$limit = ini_get('memory_limit');
ini_set('memory_limit', -1);
// ... do heavy stuff
ini_set('memory_limit', $limit);

7

পিএইচপি 5.3+ আপনাকে ফোল্ডারে কোনও .user.iniফাইল রেখে মেমরি সীমাটি পরিবর্তন করতে দেয় public_html। কেবল উপরের ফাইলটি তৈরি করুন এবং এতে নিম্নলিখিত লাইনটি টাইপ করুন:

memory_limit = 64M

কিছু সিপ্যানেল হোস্ট কেবল এই পদ্ধতিটি গ্রহণ করে।


7

ক্রাশ পৃষ্ঠা?

এখানে চিত্র বিবরণ লিখুন

(এটা ঘটবে ক্যোয়ারী বৃহৎ সারি যখন মাইএসকিউএল হয়েছে। ডিফল্টভাবে, memory_limitছোট, যা হার্ডওয়্যারের জন্য নিরাপদ ছিল সেট করা হয়।)

বাড়ানোর আগে আপনি আপনার সিস্টেমে বিদ্যমান মেমরির স্থিতি পরীক্ষা করতে পারেন php.ini:

# free -m
             total       used       free     shared    buffers     cached
Mem:         64457      63791        666          0       1118      18273
-/+ buffers/cache:      44398      20058
Swap:         1021          0       1021

এখানে আমি নীচের মতো এটি বাড়িয়েছি এবং তারপরে service httpd restartক্র্যাশ পৃষ্ঠার সমস্যাটি সমাধান করতে চাই।

# grep memory_limit /etc/php.ini
memory_limit = 512M

কোন free -mনতুন মেমরি_লিমিটের বিষয়ে সিদ্ধান্ত নিতে কমান্ডটি চালানোর পরে কোন সংখ্যা (সারি এবং কলাম?) দেখা উচিত ?
কিরাদোটি

7

ini_set('memory_limit', '-1');আপনার ওয়েব পৃষ্ঠার শীর্ষে একটি লাইন যুক্ত করুন ।

এবং আপনি আপনার প্রয়োজন অনুসারে -1, থেকে 16M, ইত্যাদি জায়গায় আপনার স্মৃতি সেট করতে পারেন ..


6
এটি বিদ্যমান বিদ্যমান অনেক উত্তর হিসাবে একই জিনিস বলে মনে হচ্ছে। কেবলমাত্র নতুন উপাদানের কোনও উপন্যাস দেওয়া থাকলে একটি জনপ্রিয় প্রশ্নের উত্তর যুক্ত করা ভাল।
অর্ধেক

6

যারা তাদের মাথার উপর আঁচড় দিচ্ছেন তারা কেন পৃথিবীতে এই ছোট্ট ফাংশনটির কারণে স্মৃতি ফাঁস হওয়া উচিত তা জানতে, কখনও কখনও কিছুটা ভুল করেও কোনও ফাংশন পুনরাবৃত্তি করে নিজেকে চিরতরে কল করে।

উদাহরণস্বরূপ, একটি প্রক্সি শ্রেণীর যার সাথে প্রক্সি চলছে সেই অবজেক্টটির কোনও ফাংশনের একই নাম রয়েছে name

class Proxy {

    private $actualObject;

    public function doSomething() {

        return $this->actualObjec->doSomething();
    }
}

কখনও কখনও আপনি সেই সামান্য প্রকৃত ওবজেক সদস্যকে আনতে ভুলে যেতে পারেন এবং প্রক্সিটির প্রকৃতপক্ষে doSomethingপদ্ধতিটি হ'ল , পিএইচপি আপনাকে কোনও ত্রুটি দেয় না এবং একটি বৃহত শ্রেণীর জন্য, এটি কয়েক মিনিটের জন্য চোখ থেকে আড়াল হতে পারে এটি কেন তা জানতে স্মৃতি ফাঁস হয়।


এবং অন্য টিপ: আপনি die('here')নিজের কোডটি লিখতে পারেন এবং পুনরাবৃত্তিটি কোথা থেকে শুরু হয় তা দেখতে এই বিবৃতিটিকে চারদিকে নিয়ে যেতে পারেন।
টুডমো

6

আগের মতো কাজ করা ডেটাসেটে চালানোর সময় আমার তলটি ছিল।

মারাত্মক ত্রুটি: সি: in ওয়ার্কস্পেস \ image_management.php লাইনে 134217728 বাইটের অনুমোদিত মেমরির আকার (4096 বাইট বরাদ্দ করার চেষ্টা করা হয়েছে)

ত্রুটির অনুসন্ধানটি আমাকে এখানে আনার সময় আমি ভেবেছিলাম যে আমি এটি উল্লেখ করব যে এটি পূর্বের উত্তরগুলির প্রযুক্তিগত সমাধান নয়, তবে আরও সহজ কিছু। আমার ক্ষেত্রে এটি ছিল ফায়ারফক্স। আমি প্রোগ্রামটি চালানোর আগে এটি ইতিমধ্যে 1,157 মেগাবাইট ব্যবহার করছিল।

দেখা যাচ্ছে যে আমি বেশ কয়েকদিন ধরে একটি সময়ে 50 মিনিটের ভিডিও দেখছিলাম এবং এতে গোলমাল হয়েছে। এটি এমন এক ধরণের সমাধান যা বিশেষজ্ঞরা এটি সম্পর্কে চিন্তা না করেও সংশোধন করে, তবে আমার পছন্দগুলির জন্য এটি মনে রাখা উচিত।


গুগল ক্রোমে আমার আজ একই ঘটনা ছিল had আমি এই উত্তরটির জন্য অত্যন্ত সন্দেহবাদী ছিলাম ... তবে এটি প্রকাশ করেছিল যে আমি ছদ্মবেশী উইন্ডোটি খোলার পরে আবার একই স্ক্রিপ্টটি বরখাস্ত করার পরে আমার বাইট ক্লান্তি অদৃশ্য হয়ে গেল! গবেষণা অব্যাহত আছে।
মিকম্যাকুসা

2

স্ক্রিপ্টটি এভাবে চালানো (উদাহরণস্বরূপ ক্রোন কেস): php5 /pathToScript/info.phpএকই ত্রুটি তৈরি করে।

সঠিক উপায়: php5 -cli /pathToScript/info.php


2

আপনি যদি ডাব্লুএইচএম-চালিত ভিপিএস (ভার্চুয়াল প্রাইভেট সার্ভার) চালাচ্ছেন তবে আপনি দেখতে পাবেন যে আপনার কাছে সরাসরি পিএইচপি.আইএনআই সম্পাদনা করার অনুমতি নেই; সিস্টেম এটি করা উচিত। ডাব্লুএইচএম হোস্ট নিয়ন্ত্রণ প্যানেলে পরিষেবা কনফিগারেশনপিএইচপি কনফিগারেশন সম্পাদক এ যান এবং সংশোধন করুন memory_limit:

WHM 11.48.4 এ মেমরি_লিমিট আপডেট করা হচ্ছে


2

শিরোনামটি অন্তর্ভুক্ত না করে আসলে প্রক্রিয়াকরণ করা ফাইলগুলি অন্তর্ভুক্ত করা বা প্রয়োজনীয়করণের সময় _dbconnection.php_এবং দরকারী হওয়াতে আমি এটি দরকারী _functions.phpবলে মনে করি। যা নিজেই অন্তর্ভুক্ত।

সুতরাং যদি আপনার শিরোনাম এবং পাদলেখ অন্তর্ভুক্ত থাকে তবে শিরোনাম অন্তর্ভুক্ত করার আগে আপনার সমস্ত কার্যকরী ফাইলগুলি কেবল অন্তর্ভুক্ত করুন।


2

ব্যবহার yieldহিসাবে একটি সমাধান হতে পারে। জেনারেটর সিনট্যাক্স দেখুন ।

PHP.iniবড় মেমরি স্টোরেজের জন্য ফাইলটি পরিবর্তনের পরিবর্তে , কখনও কখনও yieldলুপের অভ্যন্তরে প্রয়োগ করা সমস্যার সমাধান করতে পারে। ফলনটি যা করে তা সমস্ত ডেটা একবারে ফেলে দেওয়ার পরিবর্তে এটি একে একে পড়ে, প্রচুর মেমরির ব্যবহার সাশ্রয় করে।


2
PHP.ini? তাই না php.ini?
পিটার মর্টেনসেন

1

এই ত্রুটিটি কখনও কখনও পিএইচপি কোডের একটি বাগের কারণে ঘটে থাকে যার ফলে ব্যতিক্রম হ্যান্ডলিং এবং সম্ভবত অন্যান্য ক্রিয়াকলাপগুলিতে জড়িত পুনরাবৃত্তি ঘটে। দুর্ভাগ্যক্রমে, আমি একটি ছোট উদাহরণ তৈরি করতে সক্ষম হইনি।

এই ক্ষেত্রে, যা আমার জন্য বেশ কয়েকবার ঘটেছে, set_time_limit ব্যর্থ হয় এবং ব্রাউজার পিএইচপি আউটপুট লোড করার চেষ্টা চালিয়ে যায়, হয় অসীম লুপের সাথে বা মারাত্মক ত্রুটি বার্তায় যা এই প্রশ্নের বিষয়।

যোগ করে অনুমোদিত বরাদ্দ আকার হ্রাস করে

ini_set('memory_limit','1M');

আপনার কোডের শুরুতে আপনার মারাত্মক ত্রুটি রোধ করতে সক্ষম হওয়া উচিত।

তারপরে আপনি এমন একটি প্রোগ্রাম রেখে যেতে পারেন যা সমাপ্ত হয়, তবে ডিবাগ করা এখনও কঠিন।

এই মুহুর্তে BreakLoop()নিয়ন্ত্রণ অর্জনের জন্য আপনার প্রোগ্রামের অভ্যন্তরে কলগুলি সন্নিবেশ করান এবং আপনার প্রোগ্রামে কী লুপ বা পুনরাবৃত্তি সমস্যা সৃষ্টি করছে তা সন্ধান করতে।

ব্রেকলুপের সংজ্ঞাটি নিম্নরূপ:

function BreakLoop($MaxRepetitions=500,$LoopSite="unspecified")
    {
    static $Sites=[];
    if (!@$Sites[$LoopSite] || !$MaxRepetitions)
        $Sites[$LoopSite]=['n'=>0, 'if'=>0];
    if (!$MaxRepetitions)
        return;
    if (++$Sites[$LoopSite]['n'] >= $MaxRepetitions)
        {
        $S=debug_backtrace(); // array_reverse
        $info=$S[0];
        $File=$info['file'];
        $Line=$info['line'];
        exit("*** Loop for site $LoopSite was interrupted after $MaxRepetitions repetitions. In file $File at line $Line.");
        }
    } // BreakLoop

Code লুপসাইট আর্গুমেন্টটি আপনার কোডের কোনও ক্রিয়াকলাপের নাম হতে পারে। এটি সত্যিই প্রয়োজনীয় নয়, যেহেতু ত্রুটি বার্তাটি আপনি পেয়ে যাবেন তা আপনাকে ব্রেকলুপ () কলযুক্ত লাইনের দিকে নির্দেশ করবে।


-1

আমার ক্ষেত্রে এটি কোনও ফাংশনটি যেভাবে লেখা হয়েছিল তা নিয়ে একটি সংক্ষিপ্ত সমস্যা ছিল। কোনও ফাংশনের ইনপুট ভেরিয়েবলের জন্য একটি নতুন মান নির্ধারণের ফলে একটি মেমরি ফাঁস হতে পারে, যেমন:

/**
* Memory leak function that illustrates unintentional bad code
* @param $variable - input function that will be assigned a new value
* @return null
**/
function doSomehting($variable){
    $variable = 'set value';
    // Or
    $variable .= 'set value';
}

-6

আমি যখন আমার কোড থেকে নিম্নলিখিত লাইনগুলি সরিয়েছি, সমস্ত ঠিক আছে!

set_include_path(get_include_path() . get_include_path() . '/phpseclib');
include_once('Net/SSH2.php');
include_once('Net/SFTP.php');

আমি যে ফাইল চালাচ্ছিলাম তাতে এই লাইনগুলি অন্তর্ভুক্ত ছিল। একের পর এক ফাইল চালানোর সময়, সবাই ঠিকঠাক কাজ করেছিল, কিন্তু সমস্ত ফাইল একসাথে চালানোর সময় আমি মেমরি ফাঁসের বিষয়টি পেয়েছি। কোনওভাবে "অন্তর্ভুক্ত_অনস" একবারে জিনিসগুলি অন্তর্ভুক্ত করছে না, বা আমি কিছু ভুল করছি ...


set_include_path(get_include_path() . get_include_path().'/phpseclib'); এতে লাইন থাকা প্রতিটি ফাইলের জন্য একবার '/ phpseclib' পাথ যুক্ত হবে ... সুতরাং এটি এটি বহুবার যুক্ত করতে পারে! আমি এটিকে একটি সেটিংস ফাইল এবং সেটিংস ফাইলটিতে রাখার পরামর্শ দেব include_once
ফারফ্রুমুনিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.