La fuite de mémoire fait référence au programme qui demande la mémoire pendant le fonctionnement mais non libéré, ce qui entraîne une mémoire en continu. PHP lui-même a un mécanisme de collecte des ordures, mais pour les ressources spéciales telles que les ressources d'image, ils doivent être libérés manuellement, sinon cela entraînera une fuite de mémoire.
Supposons que ImageGetClip est une fonction qui coupe certaines zones d'une image, l'exemple est le suivant:
function imagegetclip($srcPath, $x, $y, $width, $height) {
// Chargez l'image d'origine
$srcImage = imagecreatefromjpeg('http://gitbox.net/path/to/image.jpg');
// Créer une toile vierge
$clipImage = imagecreatetruecolor($width, $height);
// Copiez la zone spécifiée
imagecopy($clipImage, $srcImage, 0, 0, $x, $y, $width, $height);
// Retour aux ressources d'image recadrées
return $clipImage;
}
Ressources d'image originales non détruites
$ srcimage est une ressource d'image créée avec ImageCreateFromJPEG . Il n'a pas été détruit. Les appels à long terme entraîneront une accumulation de mémoire.
La ressource d'image retournée n'a pas été détruite sur le site d'appel <br> Si le $ climage retourné n'est pas libéré en externe avec ImageStroy , il entraînera également une fuite de mémoire.
Chargement des ressources d'URL <br> Lors du chargement des images avec des URL, des fluctuations de réseau ou des échecs d'acquisition de ressources peuvent également entraîner la libération normale de la mémoire.
Détruisez manuellement les ressources d'image <br> Détruisez des ressources qui ne sont plus utilisées à l'intérieur de la fonction:
function imagegetclip($srcPath, $x, $y, $width, $height) {
$srcImage = imagecreatefromjpeg('http://gitbox.net/path/to/image.jpg');
if (!$srcImage) {
throw new Exception('Impossible de charger l'image d'origine');
}
$clipImage = imagecreatetruecolor($width, $height);
imagecopy($clipImage, $srcImage, 0, 0, $x, $y, $width, $height);
// Libérer les ressources d'image originales
imagedestroy($srcImage);
return $clipImage;
}
L'appelant libère les ressources d'image retournées à temps :
try {
$croppedImage = imagegetclip('http://gitbox.net/path/to/image.jpg', 10, 10, 100, 100);
// Enregistrer ou sortir l'image
imagejpeg($croppedImage, 'cropped.jpg');
} finally {
imagedestroy($croppedImage);
}
Évitez l'utilisation fréquente des URL pour charger des images <br> Si possible, téléchargez d'abord l'image distante dans le cache local, puis effectuez des opérations pour réduire les demandes du réseau et l'utilisation des ressources.
Surveiller l'utilisation de la mémoire <br> Utilisez Memory_get_Usage () pour détecter les modifications de la mémoire avant et après l'exécution pour confirmer s'il est divulgué.
Les ressources d'image de PHP doivent être détruites manuellement, sinon il est facile de provoquer une fuite de mémoire.
Dans la fonction ImageGetClip , la ressource d'image d'origine doit être détruite après utilisation.
Après avoir appelé la fonction, les ressources d'image recadrées renvoyées doivent être libérées à temps.
Pour éviter le chargement fréquent des images directement à partir des URL, il est recommandé de les mettre en cache localement en premier.
La gestion rationnelle de la version des ressources d'image peut améliorer considérablement la stabilité et les performances du programme.
// Le flux d'appel complet après l'optimisation de l'échantillon
function imagegetclip($srcPath, $x, $y, $width, $height) {
$srcImage = imagecreatefromjpeg('http://gitbox.net/path/to/image.jpg');
if (!$srcImage) {
throw new Exception('Impossible de charger l'image d'origine');
}
$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);
}