【问题标题】:reasonable PHP memory_limit for image resize图像调整大小的合理 PHP memory_limit
【发布时间】:2009-02-09 09:28:21
【问题描述】:

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

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

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

【问题讨论】:

    标签: php image gd


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      查看 CLI 转换命令:

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

      【讨论】:

        【解决方案3】:

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

        http://uk.php.net/manual/en/function.imagecreatefromjpeg.php#64155 也很有趣,它提供了一种动态分配内存限制的方法(我还没有尝试过)。

        【讨论】:

          【解决方案4】:

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

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

          代码示例

          $image
          ->open('uploaded.jpg')
          ->resize(500, 500)
          ->save('large.jpg')
          ->resize(100, 100)
          ->save('medium.jpg')
          ->resize(25, 25)
          ->save('small.jpg')
          ->close();
          

          【讨论】:

          • 我以相同的内存使用结果运行您的类/代码。 1.8Mb jpg 的内存使用量为 85Mb。我认为这取决于上传的 jpg 类型。搜索论坛后,这似乎并不少见。
          • 啊,很高兴知道。你介意在某处上传邪恶的 jpg 吗?对这种行为很好奇。
          【解决方案5】:

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

          Efficient JPEG Image Resizing in PHP

          【讨论】:

            【解决方案6】:

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

            这是一个计算所需内存的好工具。 即使对于我效率极低的编码,它也能完美运行..

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

            【讨论】:

              猜你喜欢
              • 2011-11-25
              • 2012-01-09
              • 1970-01-01
              • 2011-02-18
              • 2011-03-31
              • 2011-08-30
              • 1970-01-01
              • 2013-01-16
              • 2015-09-12
              相关资源
              最近更新 更多