【问题标题】:PHP WideImage - performance issuesPHP WideImage - 性能问题
【发布时间】:2012-09-17 16:24:59
【问题描述】:

我在使用 PHP 的 WideImage 库 - http://wideimage.sourceforge.net/ 时遇到了严重的性能问题。使用 WideImage::load() 加载 2.2 MB .png 文件的内存使用量峰值为 93 MB!此外,加载、调整大小和写入 750 KB .jpg 的文件系统需要将近 30 秒。我已经在两台不同的服务器上运行了这些基准测试,结果相似。

还有其他人遇到过这些问题吗?只是 WideImage 是资源猪吗?如果我用直接 GD 而不是 WideImage 重写我的图像处理,我可以期待更好的性能,还是差不多?我知道 PHP 不是图像处理的最佳语言,但我宁愿不必在 C 中编译一些东西然后从 PHP 中调用它:(

感谢您的宝贵时间 - 安迪

【问题讨论】:

  • 你的问题是什么?它似乎工作。您多久使用 93 MB 左右的内存调整大小?每张图只有一次?我也认为 93 MB 可以用于处理大图像,无论是什么库或语言。
  • 真的吗? 93MB 内存来操作 2.2MB 图像? 30 秒调整 1MB 以下的 jpg 大小并将其写入文件系统?这种性能不可能在生产环境中发挥作用,尤其是在 PHP 分配了有限内存的托管环境中。我不能指望用户在等待 jpg 调整大小时起床泡茶。我已经看到很多 PHP 代码可以更快、更精简地执行此类操作,最近一次是在我正在使用的 WordPress 插件中。我想我会用直接的GD重写例程并比较性能。
  • 由于我们对系统/CPU一无所知...

标签: php image-manipulation


【解决方案1】:

运行了一些简化的基准测试,我想我明白了。 WideImage 的调整大小方法不是持久的。示例:

$image = WideImage::load('path/to/file.png');
$image->getWidth();   <-- lets say that returns a width of 2000 pixels
$image->resize(100, 100);
$image->getWidth();   <-- that will still return a width of 2000 pixels, the original $image has not been altered

WideImage 操作返回一个新的图像实例,并保持之前的图像完好无损,因此要获得操作结果,您需要将其分配给一个变量:

$image = WideImage::load('path/to/file.png');
$image->getWidth();        // 2000 px
$resizedImage = $image->resize(100, 100);
$image->getWidth();        // still 2000 px
$resizedImage->getWidth(); // 100 px

所以我在比我想象的要大得多的图像周围移动,因为我的调整大小方法实际上并没有改变我的源图像。

【讨论】:

  • 顺便说一句,我了解到 PHP 的内存使用在图像之间会发生巨大变化,即使它们具有相同的大小和文件格式。我有一个 2.2MB .jpg 在调整大小时达到 71MB 的内存使用峰值,但一个 4MB .jpg 的峰值只有 32MB。不知道为什么。
  • 另外,我确定 WideImage 为图像处理增加了最小的开销。我尝试的最大图像在使用纯 GD 函数时使用了 90.4MB 内存,在使用 WideImage 时使用了 92.7MB。希望所有这些对偶然发现此线程的人有所帮助。
【解决方案2】:

也许您应该使用自定义解决方案。 WideImage 可能存在一些性能问题。这是有趣的调查WideImage performance and memory issues

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-14
    • 2016-09-05
    • 2011-03-20
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    相关资源
    最近更新 更多