0

我想让我网站上的用户能够将图像上传到他们的帐户。图像被调整为整个站点所需的 4 种不同尺寸。

我一直在使用 Pear Image_Transform,但在某些类型的 jpg 文件(所有文件都在 2mb 以下)上一直出现“字节耗尽”致命错误。所以我搬到了一台配备奔腾双核 E5200 @ 2.50GHz 和 2GB 内存的专用服务器。上传了相同的图像大小调整代码 - 同样的错误。我将 php.ini 中的 RAM 增加到 64M,但网站在某些类型的 jpg 上遇到了同样的问题。还尝试了wideimage类-相同的错误(错误总是与imagecreatefromjpeg()有关)。(使用 GD2)。在我的 Mac 上本地一切正常。

这真的是内存问题吗,我的设置 + 图像调整大小的合理 memory_limit 是多少?

4

6 回答 6

3

可以这样计算您需要多少内存的粗略指南

$imageInfo = getimagesize( $sourceImagePath );

// a check to make sure we have enough memory to hold this image
$requiredMemoryMB = ( $imageInfo[0] * $imageInfo[1] * ($imageInfo['bits'] / 8) * $imageInfo['channels'] * 2.5 ) / 1024;

这是相当粗略的,包括一个软糖因子 2.5,您可能想尝试一下。

于 2009-02-09T12:13:15.240 回答
2

如果图像大小可能是任意大小,则没有安全的方法可以为 PHP 设置足够的(或安全的、不崩溃的)内存限制以调整图像大小。

最好的解决方案是通过命令行 PHP CLI 通过已安装的 ImageMagic 调整大小 - 这样不使用 PHP 内存,而是使用操作系统内存。

请参阅 CLI 转换命令:

http://www.imagemagick.org/script/convert.php

于 2013-05-06T12:47:59.457 回答
1

似乎 ini_set("memory_limit","256M"); 已经覆盖了它。此外,使用 memory_get_peak_usage() 我发现我的图像调整大小(有问题 jpgs)在 90mb 区域内使用 1.8mb 图像。

同样有趣的是http://uk.php.net/manual/en/function.imagecreatefromjpeg.php#64155用于动态分配内存限制的方法(我还没有尝试过)。

于 2009-02-09T10:00:38.413 回答
1

1-2 Mb jpeg 的 90 Mb 内存似乎很奇怪。我还没有看到你的代码,但也许你为每个大小实例多次打开文件?尝试打开文件一次,(调整大小,保存)X 4,然后关闭它。

我目前有一个用户上传图片的网站,并且没有遇到错误,我的 PHP 脚本设置为 16Mb,文件上传限制为 2Mb,我使用这个库而不是 pear

代码示例

$image
->open('uploaded.jpg')
->resize(500, 500)
->save('large.jpg')
->resize(100, 100)
->save('medium.jpg')
->resize(25, 25)
->save('small.jpg')
->close();
于 2009-02-09T10:22:25.147 回答
0

http://www.dotsamazing.com/en/labs/phpmemorylimit

这是一个计算所需内存的好工具。即使对于我非常低效的编码,它也能完美地工作..

它还有一些关于如何分配更多内存的提示。

于 2012-01-12T15:17:05.707 回答
0

Image_Transform库错过了 ImageMagick 和libjpeg. 您可以通过在读取之前指定大小来有效地调整 JPEG 的大小,例如在这个答案中:

PHP 中高效的 JPEG 图像大小调整

于 2011-01-06T09:34:25.383 回答