ImageMagickにPHP拡張機能を使用するか、PHPのExec()関数を使用して端末コマンドを実行するだけですか?

私は自分のサイトでユーザーがアップロードした画像に対して以下の画像操作を行う必要があります:

  1. イメージのサイズを変更する(特定のディメンションを超える場合)
  2. すべての画像形式をjpgに変換する
  3. すべての画像の下部にウォーターマークを追加する

MagickWandやiMagickのいずれかの拡張機能を使用する必要がありますか、PHPのexec関数内で端末コマンドを実行するだけでよいのですか?

PHPの拡張が好まれる理由はありますか?これはパフォーマンスがより速く、より優れています(このサイトには多くのユーザーがいて、ある時点で1トンの画像処理が行われます)。

3
exec()を使用すると、シェルを生成し、imagickを実行し、imagickが必要とする共有ライブラリをロードするのを待つので、オーバーヘッドが高くなります。 PHPにはワンタイムスタートアップコストがかかります。
追加された 著者 Marc B,
拡張機能を使用すると、コードを別のシステムに簡単に移動できます。
追加された 著者 k102,

3 答え

execなどの関数を使用する代わりに、PHP拡張機能を使用すると多くのメリットがあります。内蔵の拡張機能は、新しいプロセスを生成して出力を読み戻す必要がなくなるため、メモリの使用速度が速くなります。イメージオブジェクトは、ファイル出力を読み込む必要がなく、PHPで直接利用できるようになります。これにより、イメージの操作が簡単になります。

ビジー状態のサイトがある場合は、画像を編集するために多くのプロセスを作成すると、処理が遅くなり、追加のメモリが消費される可能性があります。

9
追加された
GDは画像の処理に最も一般的に使用される「拡張子」です。それは遅く、狂ったように記憶を食べる。一般に、実行されるバイナリ(例えば、イメージ・マジック)は、スピードまたはメモリの問題に遭遇しない。
追加された 著者 Salman A,
組み込みの拡張機能は高速化され、メモリを節約しますこれについての参考資料はありますか?私はそれがかなり速いかどうかを見るためにいくつかのベンチマークを見たいと思う。私は convert バイナリを呼び出すことで新しいプロセスが生成され、埋め込みライブラリを使用するよりも時間がかかりますが、このように動作する多くのビジーなサイトを管理しています。私は実際のオーバーヘッドが何であるか知りたいです。
追加された 著者 Josh,
私は直接ベンチマークを持っていません。私は、生成されたプロセスが少なくとも何らかのメモリを消費するという事実に基づいてステートメントを作成しました。 php拡張は、phpバイナリにコンパイルされ、ライブラリファイルを直接呼び出して作業するため、高速でなければなりません。この特定のケースでは、作者が画像を操作してファイルに出力し、その後、画像をブラウザに戻すためにPHPを使用してメモリに読み戻す必要があるため、メモリ使用量が少なくなると考えています。
追加された 著者 drew010,
セキュリティ上の理由から、ほとんどの(共有)ホストが exec()をブロックする方法についてのビットを含めることもできます。
追加された 著者 Bailey Parker,

私はdrew010の答えに対抗することを望みます。彼の答えでは、彼は述べています:

execを使う代わりにPHP拡張機能を使うと多くのメリットがあります   または同様の機能を有する。内蔵された拡張機能は、より速く、より少ない   新しいプロセスを生成して出力を読む必要がないので、メモリ   戻る

画像を処理する場合は、これが当てはまります。さて、PHPの exec()関数(または同様の関数)を使用してImageMagickバイナリを呼び出すと、埋め込みPHPライブラリを使用する上でオーバーヘッドがかかりますが、オーバーヘッドがあります。

But there's another side of the coin. If you embed the ImageMagick code into PHP via an extension, then every request using PHP takes more memory whether the request processes an image or not. If you're using Apache's mod_php then this becomes even more of an issue because now every request to your server has the ImageMagick libraries in memory even if it's serving an HTML file!

それは本当に依存します。あなたは本当にPHPのメモリフットプリントをできるだけ低く保つ必要があります。 ImageMagicを必要とする多数のリクエストを処理していて、FastCGIまたは php_fpm を使用している場合は、埋め込まれたImageMagickを使用する利点があります。しかし、ImageMagickやApacheの mod_php を使ってリクエストを処理することがある場合は、 exec()を使ってImageMagickを呼び出す方がパフォーマンスが向上します。

6
追加された
うわー、良い対決。ありがとうございました!
追加された 著者 Sablefoste,

I always use PHP GD http://php.net/manual/en/book.image.php

サイズ変更、JPGへの変換、イメージの透かし入れを行うことができます。あなたの記事でMagickWandやiMagickを使わなければならないと言われましたが、このオプションはあなたのために働くことを望みます。

1
追加された
GDはオプションですが、あなたが私に尋ねると最後の手段です。 GDの私の個人的な意見は、それが遅く、メモリを消費し、基本的であるということです。 GDは写真のカラープロファイルも無視しています。これは大きな欠陥です。だからプロの写真を扱う場合は、カラーの飽和写真(主にレッド)が必要な場合を除き、GDから離れてください。パフォーマンス、メモリ使用量、コードの削減、画質の向上を目指します。
追加された 著者 TheCarver,
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com