【问题标题】:Limit number of threads in IMagick (PHP)限制 IMagick (PHP) 中的线程数
【发布时间】:2010-01-22 22:58:03
【问题描述】:

使用 ImageMagick 时,我可以对内存使用和最大线程数设置一定的限制。据我所知,有3种方法可以做到这一点:

  1. 使用命令行选项,例如“convert -limit memory 128mb original.jpg new.jpg”
  2. 使用“MAGICK_THREAD_LIMIT=1”等环境变量
  3. 编辑“policy.xml”配置文件以更改默认值。

我已经使用“convert -list resource”测试了这些方法中的每一个,它们都有效。

现在,我需要在 PHP 中使用 IMagick 扩展。我可以使用一个函数来设置限制:

bool Imagick::setResourceLimit (int $type, int $limit)

对于第一个参数,我可以使用以下之一:

imagick::RESOURCETYPE_AREA (integer)   //equivalent of MAGICK_AREA_LIMIT
imagick::RESOURCETYPE_DISK (integer)   //equivalent of MAGICK_DISK_LIMIT
imagick::RESOURCETYPE_FILE (integer)   //equivalent of MAGICK_FILE_LIMIT
imagick::RESOURCETYPE_MAP (integer)    //equivalent of MAGICK_MAP_LIMIT
imagick::RESOURCETYPE_MEMORY (integer) //equivalent of MAGICK_MEMORY_LIMIT

问题在于 MAGICK_THREAD_LIMIT 没有等效项,而 IMagick 似乎只是忽略了配置文件和环境变量。我怎么知道这个?我已将所有内存限制设置为零,当 IMagick 报告内存不足时,它仍然可以正常运行。

我真的希望我已经说清楚了。 问题是:使用 IMagick 时如何更改线程限制?

编辑: 通过使用“--without-threads”选项编译 ImageMagick,我设法将线程限制设置为 1。 :P 在我找到更好的解决方案之前必须这样做。

【问题讨论】:

  • 您是否也尝试使用一个小的非零值作为内存限制? (例如,1)似乎没有关于 setResourceLimit 方法的任何文档,它可能使用 0 作为无限制,或者可以忽略 0 并在调用 imagemagick 时使用默认值。
  • 如果我使用 $image->setResourceLimit 将限制设置为零,IMagick 会给我关于内存不足的错误。我很确定这会禁用它们,例如,您可以禁用磁盘内存。
  • 我知道设置内存资源限制只是使用了多少 RAM -- 如果需要更多,它将使用自己的基于磁盘的交换文件来处理其余部分。

标签: php imagemagick imagick


【解决方案1】:

这有帮助:

Imagick::setResourceLimit (6, 1);

【讨论】:

  • windows server中如何设置/
【解决方案2】:

可以将 MAGICK_THREAD_LIMIT 环境变量传递给 PHP 解释器,因此您无需接触 ImageMagick 代码。

看看这个:High CPU load when converting images with ImageMagick

【讨论】:

    【解决方案3】:

    在 PHP IMagick 扩展中没有为线程限制定义对应的常量,但是查看源整数值应该是 6,所以你可以尝试一下(参见 magick/resource_.h 中的 ResourceType,需要的值是 ThreadResource )。我在 PHP 中使用 MagickWand 并且遇到了同样的问题——修复是启用这个常量并重新编译。如果您有兴趣为 PHP 1.0.8 修补 MagickWand,修复方法是:

    magickwand_inc.h
    -#define PRV_IS_ResourceType( x ) (x == AreaResource || x == DiskResource || x == FileResource || x == MapResource || x == MemoryResource)  /* || x == UndefinedResource */
    +#define PRV_IS_ResourceType( x ) (x == AreaResource || x == DiskResource || x == FileResource || x == MapResource || x == MemoryResource || x == ThreadResource)  /* || x == UndefinedResource */
    
    magickwand.c
        MW_REGISTER_LONG_CONSTANT( MemoryResource );
    +   MW_REGISTER_LONG_CONSTANT( ThreadResource );
    

    【讨论】:

    • 谢谢!现在我正在使用使用'--without-threads'标志编译的ImageMagick,它也起到了作用。我不知道为什么,如果 ImageMagick 编译为使用线程,它在我的 VPS 上运行速度会慢 2-3 倍。
    【解决方案4】:

    在 ImageMagick 版本 6.8.7-4 中,setResourceLimit(6,1) 也无济于事 MAGICK_THREAD_LIMIT=1。

    但是这个设置可以解决问题:

    OMP_THREAD_LIMIT=1
    

    在 CLI 中:

    env OMP_THREAD_LIMIT=1 php ./myscript.php
    

    【讨论】:

    • 如何在windows服务器中设置
    猜你喜欢
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多