0

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

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");

如果有人向我解释我的做法是否错误,我将不胜感激,或者可以这样做吗?

谢谢你

4

3 回答 3

1

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

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

在 PHP 中实际上并没有更好的方法 - 但是,为了获得更好的性能,您可能需要考虑使用 ImageMagick 来调整图像大小。

于 2010-11-25T15:40:56.103 回答
0

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

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

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

在上面的示例中,这是:

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

这只是加载原始图像,它变得更糟!:p

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

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

于 2010-11-25T16:58:34.980 回答
0

实际上你做错了......init_set()不能memory_limit使用简写符号(100M)设置,而是必须使用整数值(以字节为单位)。请看这里

所以,你应该使用

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

反而。

编辑

忘记我上面写的。即使 PHP 手册中说明了这一点,它似乎也不适用于最近的 PHP 版本。我在 Mac OS X 上使用 PHP 5.3.3 进行了尝试,它甚至可以使用简写符号。感谢两张海报指出这一点。

于 2010-11-25T17:06:08.713 回答