我需要上传一个大图像文件,因此需要临时编辑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函数成功输出上传的图像。