2010-09-25 118 views
3

任何人都可以给我一个快速入门如何使用内存资源?我知道我可以起来在php.ini以及代码行,如PHP内存限制:PHP内存限制

ini_set("memory_limit","24M"); 

我有我写的是正在使用一个很酷的PHP的图片上传脚本脚本叫simpleImage可以在这里找到:http://www.white-hat-web-design.co.uk/articles/php-image-resizing.php

我有一个基本的形式,接受JPG和PNGs。我已经将我的PHP内存限制设置为24米,认为这会足够高,但是当我尝试上传3mb图像时,我仍然收到美丽的内存分配耗尽错误。将价值提高到240M,脚本运行良好(本地)。

我的脚本做到这一点:
1)接受的TMP图片被上传
2)运行和getimagesize()在图像上,以检查它是否是一个有效的图像。
3)将临时图像移动到最终的目标目录。
4)使用简单图像加载图像。
5)使用简单图像调整图像大小。
6)使用简单的图像脚本保存调整大小的图像。

所以我想所有的加载/检查/调整大小需要比24M多一点。但我担心可以接受的内存限制分配是多少。我希望用户能够舒适地上传〜6MB图像。这对您的普通专用服务器来说会非常紧张吗?

这是我的脚本的主旨..我个人认为它不是过度浪费资源?

if (!empty($_FILES)) { 
    // get image 
    ini_set("memory_limit","24M"); 
    require_once('simpleImage.php'); 
    require_once('db.php'); 
    $tempFile    =  $_FILES['file']['tmp_name']; 
    $originalFile  = $_FILES['file']['name']; 
    $extension    =  strtolower(end(explode(".", $originalFile))); 
    $targetFile   = "path/to/directory/"; 

    // validate image 
    $validExtensions = array('jpg', 'jpeg', 'png'); 
    if(in_array($extension, $validExtensions)) { 
     $validExtension  = true;  
    } else { 
     $validExtension  = false;  
    } 

    if(getimagesize($tempFile) == false) { 
     $validImage  = false;  
    } else { 
     $validImage  = true;  
    } 


    if($validExtension == true && $validImage == true) { 
     if(move_uploaded_file($tempFile,$targetFile)) { 

      $image = new SimpleImage(); 
      $image->load($targetFile); 
      $image->resizeToWidth(500); 
      $image->save($targetFile); 
     } 
    } 
} 

回答

3

格式诸如JPG和PNG是高度压缩的,因此一个文件3MB是说6百万像素可以很容易地扩展到24MB在存储器中。添加输出图像和PHP自己的需求可以很容易地使内存使用跨越30MB。

实际的内存需求更多取决于图片的尺寸而不是文件的大小。对于RGB图像(JPEG和不透明PNG)或对于RGBA图像(透明PNG)的megapixels * 4 MB,粗略估计将是megapixels * 3MB。不要忘了,GD库本身可能会为了各种目的而保留临时内部缓冲区,所以这个估计值的两倍应该是一个合理的内存使用限制。

2

机会是你的内存限制可能太低。

请记住,编辑图像文件时,它们通常需要在内存中进行未压缩存储。因此,虽然3000x3000 jpeg可能轻松低于3MB,但未压缩的尺寸将为3000x3000x3(3代表RGB的每个字节为1字节)或27MB,并且如果您有Alpha通道,则为36MB。 另外,当完成一个图像资源时,一定要销毁它,以便释放资源。

此外,如果您使用的是某种共享主机,则可能是ini_set功能已被禁用。如果可以的话,最好在php.ini中进行这样的配置设置。我这样说,所以你可以避免令人困惑的问题,为什么有ini_set("memory_limit","240M"),但仍然没有足够的内存可能发生。

2

你的平均服务器当然可以处理一些6meg文件的上传。大多数用户无疑将使用DSL或有线宽带,这些宽带的上传带宽相当低。 40-60kbyte /秒。大多数服务器至少有一个快速以太网链接(100mbit),理论上可以处理大约200个同时60k/s的上传。

大负载将调整图像大小,因为在调整大小时需要将未压缩的位图保存在内存中。其他答案已经涵盖了内存需求,但我想指出的是,使用PHP,内存限制必须足够高以覆盖上载文件的实际大小。

一个好的经验法则是至少比您允许上传的最大文件多1MB。除非你的代码是臃肿的,否则它应该处理大多数你想用来做上传处理的脚本,然后你可以提高限制来处理图像大小调整的开销。但是实际的上传内存空间必须在服务器的配置(Apache的php_value指令)或PHP的php.ini文件中设置 - 在您的脚本执行完毕并执行ini_set('memory_limit', ...)时,上传已完成(或由于内存不足)。

0

SimpleImage可能效率不高。程序内图像处理的事实标准是ImageMagick。它用C编写,非常高效。它也被广泛使用和测试。请参阅php.net上的this page以获取如何在PHP中安装和使用它的说明。

+0

上面写的simpleimage类使用GD,这是用php进行图像处理的事实标准。 ImageMagick可能更高效,但它不包含在像GD这样的php包中。 – 2011-04-22 18:37:22