Uncaught PHP Exception Symfony\Component\ErrorHandler\Error\OutOfMemoryError

Иногда при запросах время от времени возникает следующая ошибка:

[2020-04-23 11:41:22] request.CRITICAL: Uncaught PHP Exception Symfony\Component\ErrorHandler\Error\OutOfMemoryError: "Error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 17844416 bytes)" at /home/wgpavell/symfony-blog/vendor/symfony/cache/Traits/FilesystemTrait.php line 100 {"exception":"[object] (Symfony\Component\ErrorHandler\Error\OutOfMemoryError(code: 0): Error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 17844416 bytes) at /home/wgpavell/symfony-blog/vendor/symfony/cache/Traits/FilesystemTrait.php:100)"} []

В редких случаях вариация ошибки бывает такой:

[2020-04-24 16:56:25] request.CRITICAL: Uncaught PHP Exception Symfony\Component\ErrorHandler\Error\OutOfMemoryError: "Error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 10489856 bytes)" at /home/wgpavell/symfony-blog/vendor/graze/guzzle-jsonrpc/src/functions.php line 82 {"exception":"[object] (Symfony\Component\ErrorHandler\Error\OutOfMemoryError(code: 0): Error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 10489856 bytes) at /home/wgpavell/symfony-blog/vendor/graze/guzzle-jsonrpc/src/functions.php:82)"} []

Не могу понять в чем дело, но подозреваю этот участок кода у себя:

$cache = new FilesystemAdapter();
$maps = $cache->get('zabbix_maps', function (ItemInterface $item) use ($client) {
    $item->expiresAfter(3600);
    $response = $client->request('map.get', [
        "output" => "extend",
        "selectSelements" => "extend",
    ]);
    return $response->getResult();
});

С чем это может быть связано и как это можно вылечить? Использую Symfony 4.4.5, в качестве клиента ZabbixClient. Мне нужно иметь данные о картах с заббикса, но вытаскивать их при каждом запросе долго, поэтому я кэширую данные на час. Возможно, я неверно это делаю? Ошибка возникает редко, с периодичностью 2-4 раза в день.


Ответы (1 шт):

Автор решения: zalex

В php.ini у вас есть параметр memory_limit который по умолчанию составляет 128 мегабайт. Попросту иногда памяти для хранения данных у вас требуется больше нежели выделено одному процессу. Это совершенно ни какая не ошибка с вашей стороны, естественно.

Соответственно решение проблемы банально донельзя. Увеличьте значение данного параметра.

p.s. Достаточно хорошей практикой является создание отдельного файла с измененными вами параметрами, который вы потом помещаете в conf.d папку в настройках вашего php. По сути они перезаписывают стандартные параметры. Ну, а удобство в том что вы всегда знаете что именно у вас изменено вами и можете там же произвести дополнительные манипуляции с параметрами и ища их в php.ini

→ Ссылка