2

libGD を使用して PHP で画像のサイズを変更しようとする前に、操作を実行するのに十分なメモリがあるかどうかを確認したいと思います。「メモリ不足」は PHP プロセスを完全に強制終了し、キャッチできないためです。

私の考えでは、元の画像と新しい画像の各ピクセル (RGBA) に 4 バイトのメモリが必要でした。

// check available memory
if(!is_mem_available(($from_w * $from_h * 4) + ($to_w * $to_h * 4))){
     return false;
}

テストでは、ライブラリが実際に使用しているように見えるメモリよりもはるかに多くのメモリが使用されていることが示されました。誰でもより良い方法を提案できますか?

4

2 に答える 2

2

このコメントアウトと、これもチェックしてください。

于 2010-08-24T09:43:35.013 に答える
1

のソース コードを分析することで GD のピーク メモリ使用量を見つけることができるに違いないと思いimagecopyresampledますが、これは困難であり、拡張プロファイリングが必要であり、バージョンごとに異なり、一般的に信頼性が低い可能性があります。

状況に応じて、別のアプローチが思い浮かびます。画像のサイズを変更するときは、同じサーバー上で http を使用して別の PHP スクリプトを呼び出します。

$file = urlencode("/path/to/file");
$result = file_get_contents("http://example.com/dir/canary.php?file=$file&width=1000&height=2000"); 

file(明らかにパラメータをサニタイズします)

そのスクリプトが「メモリ不足」エラーで失敗した場合、画像が大きすぎることがわかります。

画像のサイズ変更に成功した場合、サイズ変更結果を含む一時ファイルへのパスを返すことができます。そこからは普通に進んでいきます。

于 2010-08-24T08:11:00.023 に答える