PHP - рассчитать необходимую память, чтобы перезаписать ограничение памяти - PullRequest
0 голосов
/ 09 февраля 2019

Мне нужно загрузить большой файл изображения, поэтому мне нужно временно отредактировать 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.

...