调整图像大小的合理 PHP 内存限制

发布于 2024-07-13 07:37:56 字数 419 浏览 6 评论 0原文

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

我一直在使用 Pear Image_Transform,但在某些类型的 jpg 上我不断收到“字节耗尽”致命错误(所有尝试过的文件都在 2mb 以下)。 因此,我转向了配备 Pentium Dual Core E5200 @ 2.50GHz 和 2GB RAM 的专用服务器。 上传了相同的图像调整大小代码 - 相同的错误。 我将 php.ini 中的 RAM 提高到 64M,但网站在某些类型的 jpg 上遇到同样的问题。 还尝试了 Wideimage 类 - 同样的错误(错误始终与 imagecreatefromjpeg() 相关)。 (使用 GD2)。 在我的 Mac 上本地一切正常。

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

I want to enable users on my site to upload images to their accounts. The images get resized into 4 different sizes required across the site.

I have been using Pear Image_Transform but I kept getting "bytes exhausted" fatal errors on certain types of jpgs (all files tried under 2mb). So I moved to a dedicated server with Pentium Dual-Core E5200 @ 2.50GHz and 2GB ram. Uploaded the same image resize code - same error. I upped the RAM in php.ini to 64M but site get the same problem on certain types of jpg. Also tried wideimage class - same error (error is always with imagecreatefromjpeg()). (Using GD2). All works fine locally on my mac.

Is this really a memory issue, what's a reasonable memory_limit for my set up + image resizing?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

冷情妓 2024-07-20 07:37:56

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

$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,您可能想尝试一下。

A rough guide to how much memory you're going to need can be calculated like this

$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;

This is quite rough and includes a fudge factor, 2.5, which you may want to experiment with.

东北女汉子 2024-07-20 07:37:56

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

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

请参阅 CLI 转换命令:

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

There is no safe way of setting sufficient (or safe, not crashing) memory limit for PHP for image resizing, if the image size may be of arbitrary size.

The best solution would be resizing via command line PHP CLI via installed ImageMagic - this way no PHP memory is used, instead OS memory will be used.

See CLI convert command:

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

帅哥哥的热头脑 2024-07-20 07:37:56

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

同样感兴趣的是 http://uk.php.net/manual/ en/function.imagecreatefromjpeg.php#64155 动态分配内存限制的方法(我尚未尝试)。

It seems that ini_set("memory_limit","256M"); has covered it. Also, using memory_get_peak_usage() I discovered that my image resize (with problem jpgs) were using in the region of 90mb for a 1.8mb image.

Also of interest is http://uk.php.net/manual/en/function.imagecreatefromjpeg.php#64155 for a way to dynamically assign a memory limit (which I have yet to try).

猥︴琐丶欲为 2024-07-20 07:37:56

90Mb 的内存对于 1-2 Mb jpeg 来说似乎很奇怪。 我还没有看到你的代码,但也许你为每个大小实例多次打开文件? 尝试打开文件一次(调整大小,保存)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();

90Mb of memory for a 1-2 Mb jpeg seems odd. I haven't seen your code, but perhaps you're opening the file multiple times for each size instance? Try opening the file once, (resize it, save it) X 4, then close it.

I currently have a site where users upload images, and not running into an error, my settings are 16Mb for PHP scripts and 2Mb file upload limit and I use this library instead of pear

code example

$image
->open('uploaded.jpg')
->resize(500, 500)
->save('large.jpg')
->resize(100, 100)
->save('medium.jpg')
->resize(25, 25)
->save('small.jpg')
->close();
空城仅有旧梦在 2024-07-20 07:37:56

Image_Transform 库缺少 ImageMagick 和 libjpeg 提供的重要调整大小优化功能。 您可以在加载时通​​过在读取之前指定大小来有效地调整 JPEG 大小,例如此答案:

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

The Image_Transform library misses an important resizing optimization available with ImageMagick and libjpeg. You can resize a JPEG efficiently whilst loading by specifying the size before reading, example in this answer:

Efficient JPEG Image Resizing in PHP

如若梦似彩虹 2024-07-20 07:37:56

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

这是一个不错的用于计算您所需内存的工具。
即使对于我效率极低的编码,它也能完美工作。

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

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

Here is a nice tool for calculating the memory you will need.
It worked perfectly even for my terribly inefficient coding..

It also has some tips about how allocate more memory.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文