PHP-计算所需的内存以覆盖内存限制

时间:2019-02-09 19:01:46

标签: php memory limit

我需要上传一个大图像文件,因此需要临时编辑PHP的ini memory_limit以防止Fatal error: Allowed memory size of ... bytes exhausted。需要明确的是,此更改必须是临时的,我不想将限制设置为-1,这意味着内存不受限制。

我以字节为单位计算所需的内存量,并将其与当前PHP ini的内存限制(以字节为单位)进行比较。尽管所需的内存超出了当前PHP的ini的memory_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);

预期结果是,imagepng使用的所需内存超过当前memory_limit时,应增加PHP ini的memory_limit。换句话说:PHP脚本应该分配足够的内存,以便通过imagepng函数成功输出上传的图像。

0 个答案:

没有答案