Php 小文件内存耗尽

Php 小文件内存耗尽,php,Php,以前从未遇到过这个 我上传了两个文件,一个是371kb,另一个是291kb public function useImage($image, $photoid){ $source = $image['tmp_name']; $target = "projectimages/"; //prepare the largest image $targetname = $photoid."large.jpg"; $file = $target . $targ

以前从未遇到过这个

我上传了两个文件,一个是371kb,另一个是291kb

public function useImage($image, $photoid){

    $source = $image['tmp_name'];
    $target = "projectimages/";

    //prepare the largest image

    $targetname = $photoid."large.jpg";
    $file = $target . $targetname;
    copy($source, $file);

    list($width, $height) = getimagesize($file);

    $modwidth = 800;

    $diff = $width / $modwidth;

    $modheight = $height / $diff;
    $tn = imagecreatetruecolor($modwidth, $modheight);
    $image = imagecreatefromjpeg($file);
    imagecopyresampled($tn, $image, 0, 0, 0, 0, $modwidth, $modheight, $width, $height);

    imagejpeg($tn, $file, 100);

    //prepare the smaller image

    $targetname = $photoid."small.jpg";
    $file = $target.$targetname;
    move_uploaded_file($source, $file);

    list($width, $height) = getimagesize($file);

    $modwidth = 400;

    $diff = $width / $modwidth;

    $modheight = $height / $diff;
    $tn = imagecreatetruecolor($modwidth, $modheight);
    $image = imagecreatefromjpeg($file);
    imagecopyresampled($tn, $image, 0, 0, 0, 0, $modwidth, $modheight, $width, $height);

    imagejpeg($tn, $file, 100);

}
我使用这个函数来调整它们的大小,使它们变小,这个函数是为每个图像运行的

当到达函数的较小图像部分时,照片没有调整大小,而是出现一个错误,显示:

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 10368 bytes) in /Applications/MAMP/htdocs/bs/classes/image.php on line 202
在这一行:

$image = imagecreatefromjpeg($file);
这些小图像怎么会耗尽所有的记忆


谢谢。

别忘了,那些细小的.jpg图像在被突出显示的行解压缩后,在内存位图中会变得更大


例如:px中的宽度*px中的高度*颜色深度位…

文件大小比水平和垂直分辨率以及颜色深度重要得多。。。。存储图像数据所需的内存为水平x垂直x 4(彩色)字节;所以一个1024x768像素的图像至少需要3145728字节(大约3MB),好吧,我大概分配了33mb?2600x2000是图像,这意味着它将需要大约20mb。因为我复制了图像,然后移动了原始图像,它们都是大约20mb的图像,这会让我达到40mb,并且在一个功能中超过限制吗?这就是它的工作原理吗?基本上,是的。。。。。内存中同时有$image和$tn;这就是2600x2000x4+800x615x4加上imagejpeg()调用的工作空间,加上PHP本身和脚本代码的内存,再加上其他变量的少量内存。处理图像总是一个非常需要内存的过程好吧,这是一个很好的解释,我现在100%理解这个问题了。我以前从未见过它,但我总是限制图片的大小。那么,内存中的断点在哪里?你从哪里得到清白的记录?因为当我提交一个表单来设置所有这些动作时,它将处理2个单独的图像,将它们复制成4个,然后进行调整大小等。所有这些都会发生在一个内存量中吗?图像数据只使用useImage()方法范围内的局部变量,因此,一旦方法调用完成,这些变量的内存就会被释放;所以,只要你对每一对图像都有足够的内存,那么它就不应该是一个问题。。。在处理大图像后,您还可以通过取消设置$tn和$imageOk手动释放内存,所以我大致分配了33mb?2600x2000是图像,这意味着它将需要大约20mb。因为我复制了图像,然后移动了原始图像,它们都是大约20mb的图像,这会让我达到40mb,并且在一个功能中超过限制吗?这就是它的工作原理吗?我认为你的计划是正确的。要解决这一问题,您可以尝试将null分配给任何已完成的大型对象,限制您接受的图像的像素大小,退出并使用imagemagick之类的工具来调整大小,或者干脆咬紧牙关,在php中允许更多内存。现在完全正确了!我认为答案是限制上传图像的像素大小,考虑到我将从2600降到800,这有很大的空间。在我的MAMP服务器上,更改php.ini中的内存不会是一个问题,但我想当这是在共享主机上时,这会成为一个问题!我将对此进行研究,但在编写“咬紧牙关”时分配更多内存是否存在主要缺点?分配更多内存的缺点是可能会使用大量内存;-)正如您所提到的,在共享托管环境中,这很可能是不可能的。在高流量情况下也可能是不可取的。另一方面,它可以做你想做的事情,可能与图像大小检查相结合,给用户一条消息,说图像太大,而不是我的MAMP服务器上的phpWell的一些内存错误,32mb是限制,但我的共享主机是90mb,所以我需要改变这一点,以允许额外的,这将舒适地满足我的要求。这可以在php.ini中更改吗?