Этот код создает детализированный отчет об использовании памяти в различные моменты выполнения скрипта, показывая текущее и пиковое потребление памяти, изменение памяти с начала выполнения и предупреждает о приближении к лимиту, что помогает выявлять "узкие места" в компонентах Bitrix.
Скрипт имитирует обработку данных и показывает использование памяти на разных этапах.
| Код |
|---|
<?php
// Полный мониторинг потребления памяти с детализацией по компонентам и выводом в читаемом формате
define('MEMORY_LIMIT', ini_get('memory_limit'));
function formatMemory($bytes) {
return round($bytes / 1024 / 1024, 2) . ' MB';
}
function memoryReport($label = '') {
static $startMemory;
if (!$startMemory) {
$startMemory = memory_get_usage();
}
$current = memory_get_usage();
$peak = memory_get_peak_usage();
$diff = $current - $startMemory;
echo "<div style='margin:10px; padding:10px; border:1px solid #ccc;'>";
echo "<strong>$label</strong><br>";
echo "Текущая память: " . formatMemory($current) . "<br>";
echo "Пиковая память: " . formatMemory($peak) . "<br>";
echo "Изменение: " . formatMemory($diff) . "<br>";
echo "Лимит PHP: " . MEMORY_LIMIT . "<br>";
// Предупреждение при приближении к лимиту
if ($peak > getBytes(MEMORY_LIMIT) * 0.8) {
echo "<span style='color:red;'>ВНИМАНИЕ: Близко к лимиту памяти!</span>";
}
echo "</div>";
return $current;
}
function getBytes($value) {
$unit = strtoupper(substr($value, -1));
$bytes = (int)$value;
switch ($unit) {
case 'G': $bytes *= 1024;
case 'M': $bytes *= 1024;
case 'K': $bytes *= 1024;
}
return $bytes;
}
// Начало мониторинга
memoryReport('Начало выполнения');
// Имитация работы компонента Bitrix
$bigArray = array();
for ($i = 0; $i < 10000; $i++) {
$bigArray[] = str_repeat('test_data_', 10) . $i;
}
memoryReport('После создания большого массива');
// Имитация обработки данных
$processedData = array_map(function($item) {
return md5($item);
}, $bigArray);
memoryReport('После обработки данных');
// Очистка памяти
unset($bigArray, $processedData);
memoryReport('После очистки данных');
// Имитация работы с БД (запрос мог бы быть здесь)
memoryReport('Перед выполнением "запроса к БД"');
// Конец мониторинга
memoryReport('Конец выполнения'); |