ভূমিকা
আপনার ব্যবহার করা উচিত memory_get_usage(false)
কারণ আপনি যা চান তা মেমরির বরাদ্দ নয় used
কি পার্থক্য
আপনার Google Mail
সম্ভবত আপনার 25MB
জন্য সঞ্চয়স্থান বরাদ্দ রয়েছে তবে এর অর্থ এই নয় যে আপনি এই মুহুর্তে ব্যবহার করেছেন।
এটি ঠিক পিএইচপি ডক বলছিল
সিস্টেম থেকে বরাদ্দ মেমরির আসল আকার পেতে এটি সত্যতে সেট করুন। সেট না করা থাকলে বা মিথ্যা না হলে কেবল ইমলোক () দ্বারা ব্যবহৃত মেমরিটি রিপোর্ট করা হয়।
উভয় যুক্তি মেমরি সীমাটির তুলনায় বরাদ্দ মেমরি ফিরিয়ে দেবে তবে মূল পার্থক্যটি হ'ল:
memory_get_usage(false)
এখানে মেমোরি মাইল স্টোর প্রদর্শিত হতে পারে যা মাইলফলক প্রত্যাবর্তনের emalloc()
সময় দ্বারা ব্যবহৃত মেমরি দিনmemory_get_usage(true)
আমি জানতে চাই স্ক্রিপ্টটি কতটা সীমাবদ্ধ হয়েছিল hit
এটি কিছু গণিত নিতে পারে এবং কেবল লুপ বা নির্দিষ্ট ব্যবহারের ক্ষেত্রে কাজ করতে পারে। আমি কেন এমন কথা বললাম?
কল্পনা করুন
ini_set('memory_limit', '1M');
$data = str_repeat(' ', 1024 * 1024);
The above script would fail before you even get the chance to start start checking memory
।
যতদূর আমি জানি একমাত্র উপায় হিসাবে আমি পিএইচপি এর পরিবর্তনশীল বা নির্দিষ্ট বিভাগের জন্য ব্যবহৃত মেমরিটি পরীক্ষা করতে পারি:
$start_memory = memory_get_usage();
$foo = "Some variable";
echo memory_get_usage() - $start_memory;
ব্যাখ্যা দেখুন , তবে আপনি যদি কোনও লুপ বা পুনরাবৃত্ত ফাংশনে থাকেন তবে মেমরির উঁকি পৌঁছে যাবে আপনি নিরাপদে অনুমান করতে সর্বাধিক মেমরির ব্যবহার করতে পারেন।
উদাহরণ
ini_set('memory_limit', '1M');
$memoryAvailable = filter_var(ini_get("memory_limit"), FILTER_SANITIZE_NUMBER_INT);
$memoryAvailable = $memoryAvailable * 1024 * 1024;
$peekPoint = 90;
$memoryStart = memory_get_peak_usage(false);
$memoryDiff = 0;
$stat = array(
"HIGHEST_MEMORY" => 0,
"HIGHEST_DIFF" => 0,
"PERCENTAGE_BREAK" => 0,
"AVERAGE" => array(),
"LOOPS" => 0
);
$data = "";
$i = 0;
while ( true ) {
$i ++;
$memoryUsed = memory_get_peak_usage(false);
$memoryDiff = $memoryUsed - $memoryStart;
$memoryStart = memory_get_peak_usage(false);
$stat['HIGHEST_MEMORY'] = $memoryUsed > $stat['HIGHEST_MEMORY'] ? $memoryUsed : $stat['HIGHEST_MEMORY'];
$stat['HIGHEST_DIFF'] = $memoryDiff > $stat['HIGHEST_DIFF'] ? $memoryDiff : $stat['HIGHEST_DIFF'];
$stat['AVERAGE'][] = $memoryDiff;
$stat['LOOPS'] ++;
$percentage = (($memoryUsed + $stat['HIGHEST_DIFF']) / $memoryAvailable) * 100;
if ($percentage > $peekPoint) {
print(sprintf("Stoped at: %0.2f", $percentage) . "%\n");
$stat['AVERAGE'] = array_sum($stat['AVERAGE']) / count($stat['AVERAGE']);
$stat = array_map(function ($v) {
return sprintf("%0.2f", $v / (1024 * 1024));
}, $stat);
$stat['LOOPS'] = $i;
$stat['PERCENTAGE_BREAK'] = sprintf("%0.2f", $percentage) . "%";
echo json_encode($stat, 128);
break;
}
$data .= str_repeat(' ', 1024 * 25);
}
আউটপুট
Stoped at: 95.86%
{
"HIGHEST_MEMORY": "0.71",
"HIGHEST_DIFF": "0.24",
"PERCENTAGE_BREAK": "95.86%",
"AVERAGE": "0.04",
"LOOPS": 11
}
সরাসরি নমুনা
এটি এখনও ব্যর্থ হতে পারে
এটি ব্যর্থ হতে পারে কারণ এর পরেও if ($percentage > $peekPoint) {
স্মৃতিশক্তি গ্রাস করে অতিরিক্ত কাজ করার জন্য যুক্ত করা হয়
print(sprintf("Stoped at: %0.2f", $percentage) . "%\n");
$stat['AVERAGE'] = array_sum($stat['AVERAGE']) / count($stat['AVERAGE']);
$stat = array_map(function ($v) {
return sprintf("%0.2f", $v / (1024 * 1024));
}, $stat);
$stat['LOOPS'] = $i;
$stat['PERCENTAGE_BREAK'] = sprintf("%0.2f", $percentage) . "%";
echo json_encode($stat, 128);
break;
If the memory to process this request is grater than the memory available the script would fail.
উপসংহার
এটি একটি নিখুঁত সমাধান নয় তবে বিরতিতে মেমরি পরীক্ষা করে নিন এবং যদি এটি exit
তাত্ক্ষণিক উঁকি দেওয়া হয় (যেমন 90%) এবং অভিনব জিনিসগুলি ছেড়ে যান