我正在使用Imagick最新版本和PHP 5.3。当我尝试为图像创建缩略图(下面的代码)时,脚本使用了太多的 CPU。如何在 Imagick 上设置资源消耗限制?
$thumb = new Imagick();
$thumb->readImage($this->tmp_file);
$thumb->thumbnailImage(200, null);
$thumb->writeImage($this->thumb_file);
$thumb->destroy();
谢谢。
我相信
您可以使用setResourceLimit
更改Imagick的限制:
Imagick::setResourceLimit( $type, $limit );
可用类型常量:
Imagick::RESOURCETYPE_AREA
Imagick::RESOURCETYPE_DISK
Imagick::RESOURCETYPE_FILE
Imagick::RESOURCETYPE_MAP
Imagick::RESOURCETYPE_MEMORY
您可以使用上面列出的相同常量查看当前正在使用的限制之一getResourceLimit
:
Imagick::getResourceLimit( $type )
你想做什么?如果您尝试在每次用户访问页面时创建缩略图,您将很快在 CPU 上创建非常重的负载。您可以通过仅生成一次图像并将其保存到缩略图目录来解决此问题。
您还可以使用 PHP.ini 或 ini_set 命令将 PHP 设置为具有特定的内存限制。看这里和这里。
我认为您无法在 imagemagick 中专门设置内存限制,除非您可以自己设置命令行参数(最后答案在这里)
我的建议
一个。利用缓存
B. 不要一直生成拇指
C. 使用作业队列系统(如 Gearman
或 beanstalkd
)生成拇指,这样您就不必立即执行此操作
示例仅在原始文件被修改时生成拇指
$file = "a.jpg" ;
$thumbFile = "a.thumb.jpg" ;
$createThumb = true;
if(is_file($thumbFile))
{
if((filemtime($file) - 10) < filemtime($thumbFile));
{
$createThumb = false;
}
}
if($createThumb === true)
{
$thumb = new Imagick();
$thumb->readImage($file);
$thumb->thumbnailImage(50, null);
$thumb->writeImage($thumbFile);
$thumb->destroy();
}