2

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 より良い解決策が見つかるまでやらなければなりません。

4

4 に答える 4

5

これは役に立ちました:

Imagick::setResourceLimit (6, 1);
于 2013-02-05T22:08:17.943 に答える
2

MAGICK_THREAD_LIMIT環境変数をPHPインタープリターに渡すことができるため、ImageMagickコードに触れる必要はありません。

これをチェックしてください:ImageMagickで画像を変換するときの高いCPU負荷

于 2012-03-13T15:30:43.190 に答える
1

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
于 2014-01-16T12:44:34.007 に答える
1

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 );
于 2010-07-13T06:24:49.673 に答える