1

ここでメモリが原因かどうかはわかりません。メモリ内のデータから GD イメージをインスタンス化しようとしています (以前はデータベースからのものでした)。私はこのような呼び出しを試みます:

my $image = GD::Image->new($image_data);

$imageとして戻ってきundefます。GD の POD は、コンストラクターがundefメモリ不足の場合に戻ると言っているので、メモリが疑わしいのはそのためです。

画像データはPNG形式です。newFromPngData を呼び出すと、同じことが起こります。

これは、30K 未満などの非常に小さな画像で機能します。ただし、〜 70K などのわずかに大きな画像は問題を引き起こします。空気を抜いた後でも、70K の画像がこれらの問題を引き起こすとは思いません。

このスクリプトは、OS 10.4 で Apache 2.0 を介して CGI で実行されています。

デフォルトで Apache によって課されるメモリ制限はありますか? それらを増やすことはできますか?

洞察をありがとう!

編集:明確にするために、GD::Image オブジェクトは作成されないため$image_data、メモリからクリアすることは実際にはオプションではありません。

4

2 に答える 2

1

GD ライブラリは、イメージ サイズのバイトごとに多くのバイトを消費します。その比率は10:1をはるかに超えています!

ユーザーが画像をシステムにアップロードすると、ファイル サイズを確認してから GD 画像に読み込みます。しきい値 (1 メガバイト) を超えている場合は使用せず、代わりにユーザーにエラーを報告します。

どうしてもディスクにダンプしたい場合は、コマンド ラインの「変換」ツールを使用して適切なサイズに再スケーリングし、出力を GD ライブラリにロードして、一時ファイルを削除します。

convert -define jpeg:size=800x800 tmpfile.jpg -thumbnail '800x800' -

800 x 800 の正方形に収まるように画像をスケーリングします。最長のエッジが 800px になり、安全にロードできるようになりました。上記のコマンドは、縮小された .jpg を STDOUT に送信します。size= オプションは、巨大な画像をメモリに保持するのではなく、800x800 にスケーリングするのに十分なだけの量を convert に指示する必要があります。

于 2009-11-28T19:19:25.047 に答える
0

私は同じ問題に数回遭遇しました。

私の解決策の 1 つは、スクリプトで使用できるメモリの量を増やすことでした。もう 1 つは、バッファをクリアすることでした。

元のスクリプト:

$src_img = imagecreatefromstring($userfile2);
imagecopyresampled($dst_img,$src_img,0,0,0,0,$thumb_width,$thumb_height,$origw,$origh);

編集されたスクリプト:

$src_img = imagecreatefromstring($userfile2);
imagecopyresampled($dst_img,$src_img,0,0,0,0,$thumb_width,$thumb_height,$origw,$origh);
imagedestroy($src_img);

最初の src_image のメモリをクリアすることで、より多くの処理を処理できるように十分に解放されました。

于 2008-12-23T05:33:09.273 に答える