メモリリークとは、操作中にメモリを申請するプログラムを指しますが、リリースされていないため、メモリは継続的に占有されます。 PHP自体にはゴミ収集メカニズムがありますが、画像リソースなどの特別なリソースの場合、手動でリリースする必要があります。そうしないと、メモリの漏れが発生します。
ImageGetClipは、画像からいくつかの領域を切り取る関数であると仮定し、例は次のとおりです。
function imagegetclip($srcPath, $x, $y, $width, $height) {
// 元の画像をロードします
$srcImage = imagecreatefromjpeg('http://gitbox.net/path/to/image.jpg');
// 空白のキャンバスを作成します
$clipImage = imagecreatetruecolor($width, $height);
// 指定された領域をコピーします
imagecopy($clipImage, $srcImage, 0, 0, $x, $y, $width, $height);
// トリミングされた画像リソースに戻ります
return $clipImage;
}
元の画像リソースは破壊されていません
$ SRCIMAGEは、 ImageCreateFromJpegで作成された画像リソースです。破壊されていません。長期の呼び出しは、メモリの蓄積を引き起こします。
返された画像リソースはコールサイトで破壊されていません<br> 返された$クリピマージが画像で外部からリリースされない場合、メモリの漏れも引き起こします。
URLリソースの読み込み<br> URLを使用して写真をロードすると、ネットワークの変動またはリソースの取得障害も、メモリが正常にリリースされない可能性があります。
画像リソースを手動で破壊する<br> 関数内で使用されなくなったリソースを破壊します。
function imagegetclip($srcPath, $x, $y, $width, $height) {
$srcImage = imagecreatefromjpeg('http://gitbox.net/path/to/image.jpg');
if (!$srcImage) {
throw new Exception('元の画像をロードできませんでした');
}
$clipImage = imagecreatetruecolor($width, $height);
imagecopy($clipImage, $srcImage, 0, 0, $x, $y, $width, $height);
// 元の画像リソースをリリースします
imagedestroy($srcImage);
return $clipImage;
}
発信者は、返された画像リソースを時間内にリリースします。
try {
$croppedImage = imagegetclip('http://gitbox.net/path/to/image.jpg', 10, 10, 100, 100);
// 画像を保存または出力します
imagejpeg($croppedImage, 'cropped.jpg');
} finally {
imagedestroy($croppedImage);
}
URLを頻繁に使用して画像をロードしないでください<BR> 可能であれば、最初にリモート画像をローカルキャッシュにダウンロードしてから、操作を実行してネットワークリクエストとリソースの使用を削減します。
メモリの使用量を監視<BR> memory_get_usage()を使用して、実行前後のメモリの変更を検出して、漏れているかどうかを確認します。
PHPの画像リソースは手動で破壊する必要があります。そうしないと、メモリの漏れを引き起こすのは簡単です。
ImageGetClip関数では、使用後に元の画像リソースを破壊する必要があります。
関数を呼び出した後、返されたクロップド画像リソースを時間内にリリースする必要があります。
URLからの画像の頻繁な負荷を避けるために、最初に局所的にキャッシュすることをお勧めします。
画像リソースのリリースを合理的に管理すると、プログラムの安定性とパフォーマンスが大幅に向上する可能性があります。
// サンプルの最適化後の完全なコールフロー
function imagegetclip($srcPath, $x, $y, $width, $height) {
$srcImage = imagecreatefromjpeg('http://gitbox.net/path/to/image.jpg');
if (!$srcImage) {
throw new Exception('元の画像をロードできませんでした');
}
$clipImage = imagecreatetruecolor($width, $height);
imagecopy($clipImage, $srcImage, 0, 0, $x, $y, $width, $height);
imagedestroy($srcImage);
return $clipImage;
}
try {
$croppedImage = imagegetclip('http://gitbox.net/path/to/image.jpg', 10, 10, 100, 100);
imagejpeg($croppedImage, 'cropped.jpg');
} finally {
imagedestroy($croppedImage);
}