0

誰かが作成したクラスを使用して画像のサイズを変更し、サーバーに保存していますが、ここにアップロードするのはクラスへのリンクです。

http://www.white-hat-web-design.co.uk/articles/php-image-resizing.php

上記のクラスは、低解像度の画像でのみ機能しました。高解像度の画像 (4400px X 3500px) をアップロードして固定サイズにトリミングしたかったため、以下の php 関数を使用してメモリ サイズを増やしました。

ini_set ( "memory_limit", "100M");  

これで目的の出力を達成できますが、これに短所があるかどうかを知りたいのですが、より大きなメモリ空間を割り当てているので、操作を実行した後に何らかの手段でメモリを解放する必要がありますか?

次のコードを使用してサイズを変更しています。

ini_set ( "memory_limit", "100M"); 
$image = new SimpleImage();
$image->load("$targetFile");
$image->resize(940,650);
$image->save("$targetFile");

私がこれを間違った方法で行っているかどうか、誰かが私に説明してくれれば幸いです。それとも、これでいいのでしょうか?

ありがとうございました

4

3 に答える 3

1

もちろん、欠点は、PHP ページが要求を処理するために 100 メガバイトのメモリを消費する可能性があることです。これが一般的に使用されるページである場合、またはこのページを一度に複数回呼び出すリスクがある場合は、サーバーのパフォーマンスが低下する可能性があります (同時に実行されるコードへの 10 個のリクエストが 1G のメモリを消費するため)

php.ini または Web サーバー構成 (.htaccess ファイルなど) の他の場所でこの値を変更する代わりに ini_set を使用すると、メモリを消費するスクリプトの範囲が小さくなる可能性が高くなります。スクリプトは最初に余分なメモリの使用を明示的に要求する必要があります。

まだ PHP にあるより良い方法はありませんが、パフォーマンスを向上させるために、ImageMagick を使用して画像のサイズを変更することを検討することをお勧めします。

于 2010-11-25T15:40:56.103 に答える
0

クラスが大量のメモリを使用する理由についての説明:

使用しているクラスの $image->load() メソッドは、imagecreatefromjpeg() / imagecreatefromgif() / imagecreatefrompng() (元のファイルの形式に応じて) を呼び出し、画像をメモリに読み込みます。GD ライブラリはメモリ内にビットマップ形式で画像を保存することを理解しています。これは、ディスクからロードした圧縮ファイルよりも明らかに大きいものです。必要なメモリ量は次の式で計算できます。

画像の幅 * 画像の高さ * 色深度 / バイトあたりのビット数

上記の例では、これは次のとおりです。

4400 * 3500 * 24 / 8 = 46.2MB (概算)

そして、それは元の画像をロードするだけで、さらに悪化します! :p

サイズ変更を実行するために、クラスは新しい寸法で空白のトゥルーカラー イメージを作成し、メモリ内の元のイメージを新しいイメージにリサンプリングします。これは、スクリプトの実行のある時点で、2 つのビットマップ イメージがメモリに格納されていることを意味します。これに、スクリプトを実行している同時ユーザーの数を掛けて、他のすべての PHP のオーバーヘッドを追加すると、おそらく大量のメモリを使用していることがわかります!

いくつかの例については、このスレッドを参照してください: http://www.webdeveloper.com/forum/showthread.php?t=182328

于 2010-11-25T16:58:34.980 に答える
0

実際には間違っています...省略表記( )を使用してinit_set()設定することはできません。代わりに、整数値(バイト単位)を使用する必要があります。こちらをご覧ください。memory_limit100M

したがって、使用する必要があります

ini_set ( "memory_limit", 100*1024*1024); 

代わりは。

編集

上に書いたことは忘れてください。これは PHP のマニュアルに記載されていても、最近の PHP バージョンには適用されないようです。Mac OS X の PHP 5.3.3 で試してみたところ、省略形でも動作します。それを指摘してくれた両方のポスターに感謝します。

于 2010-11-25T17:06:08.713 に答える