我正在构建一个图像处理Nginx CDN /缓存服务器,以覆盖服装jpeg上数百万个独特的SVG设计文件。类似的教程:http://sumitbirla.com/2011/11/how-to-build-a-scalable-caching-resizing-image-server/
我在这里写了一个测试脚本:
<?php
$cmd = "composite GOSHEN.svg blank-tshirt.jpg -geometry 600x700+456+335 JPG:-";
header("Content-type: image/jpeg");
passthru($cmd);
exit();
?>
以下是一个示例结果:
我的问题是ImageMagick太慢了。除了更多的CPU /内存,还有什么技巧可以让它更快吗?是否有任何替代技术可以更快地叠加图像?
非常感谢任何帮助。
答案 0 :(得分:4)
php-vips比想象的快得多。我为你做了一个测试程序:
#!/usr/bin/env php
<?php
require __DIR__ . '/vendor/autoload.php';
use Jcupitt\Vips;
for($i = 0; $i < 100; $i++) {
$base = Vips\Image::newFromFile($argv[1], ["access" => "sequential"]);
$overlay = Vips\Image::newFromFile($argv[2], ["access" => "sequential"]);
// centre the overlay on the image, but lift it up a bit
$left = ($base->width - $overlay->width) * 0.5;
$top = ($base->height - $overlay->height) * 0.45;
$out = $base->composite2($overlay, "over", ["x" => $left, "y" => $top]);
// write to stdout with a mime header
$out->jpegsave_mime();
}
使用服务器上的测试图像:
http://build9.hometownapparel.com/pics/
然后在我的桌面计算机上运行(Ubuntu 17.10,一个快速的i7 CPU),我看到了:
$ time ./overlay.php blank-tshirt.jpg GOSHEN.svg > /dev/null
real 0m2.488s
user 0m13.446s
sys 0m0.328s
每张图片约25毫秒。我看到了这个结果(显然是从第一次迭代中得到的):
我尝试了你的imagemagick示例的循环版本:
#!/usr/bin/env php
<?php
header("Content-type: image/jpeg");
for($i = 0; $i < 100; $i++) {
$cmd = "composite GOSHEN.svg blank-tshirt.jpg -geometry 600x700+456+335 JPG:-";
passthru($cmd);
}
针对IM-6.9.7-4(为Ubuntu打包的版本)运行它我看到了:
$ time ./magick.php > /dev/null
real 0m29.084s
user 0m42.289s
sys 0m4.716s
每张图片290毫秒。所以在这个测试中,php-vips的速度提高了10倍以上。这有点不公平:想象可能会比仅仅复制更快一点。
这里还有另一个基准:
https://github.com/jcupitt/php-vips-bench
在那个问题上,php-vips比imagick快4倍,内存需要少8倍。
这是打包成Dockerfile的整个东西,你应该可以在任何地方运行:
https://github.com/jcupitt/docker-builds/tree/master/php-vips-ubuntu-16.04