Мне нужно загрузить большой файл изображения, поэтому мне нужно временно отредактировать PHP ini memory_limit
, чтобы предотвратить Fatal error: Allowed memory size of ... bytes exhausted
.Чтобы было понятно, это изменение должно быть временным, и я не хочу устанавливать предел -1, что означает неограниченную память.
Я вычисляю необходимый объем памяти в байтах и сравниваю его с текущим PHPограничение памяти ini в байтах.Несмотря на то, что необходимая память не превышает текущую ini-память PHP PHP_limit, я все же получил ранее упомянутую фатальную ошибку.У меня вопрос, почему я все еще получаю фатальную ошибку, несмотря на то, что памяти достаточно для вывода изображения?
// How much (extra) memory we need to load the image can be calculated by:
// ((image WIDTH * image HEIGHT) * BITS PER PIXEL = 4) / 1048576 bytes(1 MB)
// Source of this formula: https://alvarotrigo.com/blog/allocate-memory-on-the-fly-PHP-image-resizing/
$img = imagecreatefrompng($_FILES['tmp_name']);
$info = getimagesize($_FILES['tmp_name']);
$memoryLimit = ini_get('memory_limit'); // 128M
$oldMemoryLimit = (float)rtrim($memoryLimit, 'M'); // 128
$newMemoryLimit = (float)ceil((($info[0]*$info[1])*4)/1048576); // 40
if ($oldMemoryLimit != 0 && (memory_get_usage()+$newMemoryLimit) > $oldMemoryLimit)
{
ini_set('memory_limit', $oldMemoryLimit+$newMemoryLimit.'M');
}
ob_start();
imagepng($img, null); // Fatal error: Allowed memory size of ... bytes exhausted
$image = ob_get_clean();
ini_set('memory_limit', $memoryLimit);
Ожидаемый результат заключается в том, что он должен увеличить значение memory_limit ini PHP, когда необходимая память используется imagepng
превышает текущий предел памяти.Другими словами: скрипт PHP должен выделять достаточно памяти для успешного вывода загруженного изображения с помощью функции imagepng.