PHP内存限制

PHP内存限制,php,memory,file-upload,Php,Memory,File Upload,有谁能给我一个关于如何使用内存资源的快速入门?我知道我可以在PHP.ini中以及通过以下代码行提高PHP内存限制: ini_set("memory_limit","24M"); 我正在编写一个图像上传脚本,它使用了一个非常酷的PHP脚本simpleImage,可以在这里找到: 我有一个接受JPG和PNG的基本表单。我已经将我的PHP内存限制设置为24m,我认为这已经足够高了,但是当我试图上传3mb图像时,我仍然收到了漂亮的内存分配错误。将该值增加到更大的240M,脚本就可以(本地)正常

有谁能给我一个关于如何使用内存资源的快速入门?我知道我可以在PHP.ini中以及通过以下代码行提高PHP内存限制:

    ini_set("memory_limit","24M");
我正在编写一个图像上传脚本,它使用了一个非常酷的PHP脚本simpleImage,可以在这里找到:

我有一个接受JPG和PNG的基本表单。我已经将我的PHP内存限制设置为24m,我认为这已经足够高了,但是当我试图上传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);
        }
    } 
}

JPG和PNG等格式是高度压缩的,因此3MB文件(即600万像素)很容易在内存中扩展到24MB。添加输出图像和PHP自身的需求很容易使内存使用量超过30MB


实际内存需求更多地取决于图像尺寸,而不是文件大小。对于RGB图像(JPEG和不透明PNG),粗略估计为
megapixels*3
MB;对于RGBA图像(透明PNG),粗略估计为
megapixels*4
MB。不要忘记,GD库本身可能出于各种目的维护临时内部缓冲区,因此,将此估计值加倍应该是合理的内存限制使用。

您的内存限制可能太低了

请记住,编辑图像文件时,通常需要将其未压缩存储在内存中。因此,虽然3000x3000 jpeg可能很容易低于3MB,但未压缩的将是3000x3000x3(3表示RGB的每个字节)字节或27MB,如果您有alpha通道,则为36MB。 此外,在完成图像资源的处理后,请确保将其销毁,以便释放资源


此外,如果您正在使用某种共享主机,则
ini\u set
功能可能已被禁用。如果可以的话,最好在php.ini中进行这样的配置设置。我这样说是为了让你不必担心为什么设置了
ini\u(“内存限制”,“240M”)
却仍然没有足够的内存。

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

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


一个好的经验法则是至少比允许上传的最大文件多1兆。除非您的代码过于臃肿,否则它应该可以处理您想要用来进行上传处理的大多数脚本,并且从中您可以提高处理图像大小开销的限制。但实际上传内存空间必须在服务器的配置(Apache的
php\u值
指令)或php的php.ini文件中设置-当脚本执行并执行
ini\u集('memory\u limit',…)
时,上传已经完成(或由于内存不足而中止).

SimpleImage可能效率不高。程序内部图像处理的实际标准是。它是用C写的,因此非常有效。它也得到了广泛的应用和良好的测试。有关如何在php中安装和使用它的说明,请参见php.net上的。

上面编写的simpleimage类使用GD,GD是php图像处理的实际标准。ImageMagick可能更高效,但它不像GD is那样包含在php包中。