代码之家  ›  专栏  ›  技术社区  ›  Ibrahim Azhar Armar

需要帮助了解此php函数的内存管理

  •  0
  • Ibrahim Azhar Armar  · 技术社区  · 14 年前

    我正在使用一个由某人编写的类来调整图像的大小并将其存储在服务器中,同时上传到这里是指向该类的链接。

    http://www.white-hat-web-design.co.uk/articles/php-image-resizing.php

    上面的类只适用于低分辨率的图像,因为我想以程序的方式(4400px X 3500px)上传高分辨率的图像,然后将其裁剪成固定大小,所以我使用了下面的php函数来增加内存大小

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

    尽管这样,我能够达到我想要的输出,我想知道这是否有任何缺点,因为我正在分配一个更大的内存空间给它,我需要在执行操作后通过某种方式释放内存。

    我正在使用以下代码调整大小。

    ini_set ( "memory_limit", "100M"); 
    $image = new SimpleImage();
    $image->load("$targetFile");
    $image->resize(940,650);
    $image->save("$targetFile");
    

    如果有人向我解释,如果我做错了,我会很感激的,还是可以这样做?

    谢谢您

    3 回复  |  直到 14 年前
        1
  •  1
  •   Arantor    14 年前

    好吧,缺点是,当然,PHP页面可能会消耗100兆字节的内存来处理请求—如果这是一个常用页面,或者一次有多次调用此页面的风险,可能会影响服务器性能(因为对并发运行的代码的10个请求将消耗1G内存)

    在php.ini或web服务器配置(例如htaccess文件)中使用ini_set而不是在其他地方更改此值,这意味着脚本消耗内存的范围可能更小-脚本需要先显式请求使用额外内存。

    在PHP中并没有一种更好的方法可以做到这一点——不过,为了获得更好的性能,您可能需要考虑使用ImageMagick来调整图像的大小。

        2
  •  0
  •   foxsoup    14 年前

    关于为什么类使用这么多内存的一些解释:

    您使用的类中的$image->load()方法调用imagecreatefromjpeg()/imagecreatefromgif()/imagecreatefrompng()(取决于原始文件的格式)并将图像加载到内存中。据我所知,GD库在内存中以位图格式存储图像,这显然比从磁盘加载的压缩文件大得多。您可以使用以下公式计算所需的内存量:

    图像宽度*图像高度*颜色深度/字节位数

    在上面的例子中,这是:

    4400*3500*24/8=46.2MB(大致)

    只需加载原始图像 更糟的 ! :p页

    若要执行大小调整,该类将创建一个具有新维度的空白真彩色图像,然后将内存中的原始图像重采样到新图像上。这意味着在脚本执行的某一点上,内存中存储了两个位图图像。将此值乘以同时运行脚本的用户数,再加上所有其他PHP内容的开销,您可能会发现您使用了大量内存!

    有关一些示例,请参见此线程: http://www.webdeveloper.com/forum/showthread.php?t=182328

        3
  •  0
  •   Stefan Gehrig    14 年前

    实际上你做错了。。。 init_set() 无法设置 memory_limit 使用速记法( 100M ),而必须使用整数值(字节)。请看 here .

    所以,你应该用

    ini_set ( "memory_limit", 100*1024*1024); 
    

    相反。

    编辑

    忘了我上面写的。即使这在PHP手册中有说明,它似乎也不适用于最新的PHP版本。我在MacOSX上用PHP5.3.3试过,它甚至可以用简写法。多亏两张海报都指出了这一点。

    推荐文章