Bei der Verwendung von PHP für die Bildverarbeitung wird die Funktion der ImageCropauto () häufig verwendet, um nutzlose Bereiche in Bildern automatisch zu erfassen, insbesondere bei der Verarbeitung großer Bilder. Diese Funktion tritt jedoch manchmal während des tatsächlichen Gebrauchs auf Speicherüberlaufprobleme auf, insbesondere wenn es um große, hochauflösende Bilder geht. In diesem Artikel wird untersucht, warum der Speicherüberlauf auftritt und einige Lösungen bereitstellt.
ImageCropauto () ist eine Bildfunktion in PHP und Teil der GD -Bibliothek. Diese Funktion kann automatisch die Kanten von transparentem oder einfarbenem Bild um das Bild kultivieren und wird häufig verwendet, um überschüssige Teile des Bildes zu säubern. Dies ist besonders nützlich, um gescannte Bilder, Alben, Screenshots und andere Arten von Bildern zu behandeln. Seine Verwendung ist wie folgt:
<span><span><span class="hljs-variable">$image</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecreatefromjpeg</span></span><span>(</span><span><span class="hljs-string">'path/to/image.jpg'</span></span><span>);
</span><span><span class="hljs-variable">$cropped_image</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecropauto</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>);
</span></span>
In der Regel treten in der Regel bei den Bildern mit großen oder hochauflösenden Bildern auf, insbesondere bei der Durchführung von Bildanbausvorgängen auf, die die Speicherbedarf dramatisch zugenommen haben. PHP lädt das Bild bei der Ausführung der Bildverarbeitung vollständig in den Speicher. Wenn das Bild sehr groß ist oder die Speicherkonfiguration des Systems niedrig ist, kann es die von PHP zulässige Speichergrenze überschreiten, was zu einem ausgeschöpften Speicherfehler führt.
Beim Anschneiden des Bildes muss die Funktion der ImageCropauto () jeden Pixelpunkt des Bildes berechnen und das Bild verarbeiten. Bei großen Bildern führt diese Verarbeitung zu einem erheblichen Speicherverbrauch, der wiederum Probleme mit dem Speicherüberlauf auslöst.
PHP verfügt über ein Standardspeicherlimit, bei dem Skripte vermieden werden, die zu viele Serverressourcen verbrauchen. Wenn Sie beim Arbeiten mit größeren Bildern den Speicherüberlauf erleben, können Sie versuchen, die Speichergrenze zu erhöhen. Sie können die Speichergrenze über die Funktion ini_set () vorübergehend erhöhen oder die Einstellung mpaem reagy_limit in der Php.ini -Datei ändern.
<span><span><span class="hljs-title function_ invoke__">ini_set</span></span><span>(</span><span><span class="hljs-string">'memory_limit'</span></span><span>, </span><span><span class="hljs-string">'512M'</span></span><span>); </span><span><span class="hljs-comment">// Erhöhen Sie die Speichergrenze auf 512MB</span></span><span>
</span></span>
Wenn es über die Konfigurationsdatei von Php.ini geändert wird, ist die Änderung wie folgt:
<span><span><span class="hljs-attr">memory_limit</span></span><span> = </span><span><span class="hljs-number">512</span></span><span>M
</span></span>
Nach der Änderung können Sie den PHP -Dienst neu starten, damit die Einstellungen wirksam werden.
Eine weitere häufige Ursache für den Speicherüberlauf ist, dass das Bild eine zu hohe Auflösung hat. Wenn die Bildgröße zu groß ist, nimmt sie während der Verarbeitung zu viel Speicher auf. Sie können das Bild skalieren, um die Größe des Bildes zu verringern, bevor Sie die Funktion der ImageCropauto () aufrufen.
<span><span><span class="hljs-variable">$image</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecreatefromjpeg</span></span><span>(</span><span><span class="hljs-string">'path/to/image.jpg'</span></span><span>);
</span><span><span class="hljs-variable">$width</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagesx</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>);
</span><span><span class="hljs-variable">$height</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagesy</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>);
</span><span><span class="hljs-comment">// Setzen Sie neue Breite und Höhe</span></span><span>
</span><span><span class="hljs-variable">$new_width</span></span><span> = </span><span><span class="hljs-number">1000</span></span><span>;
</span><span><span class="hljs-variable">$new_height</span></span><span> = </span><span><span class="hljs-title function_ invoke__">floor</span></span><span>(</span><span><span class="hljs-variable">$height</span></span><span> * (</span><span><span class="hljs-variable">$new_width</span></span><span> / </span><span><span class="hljs-variable">$width</span></span><span>));
</span><span><span class="hljs-comment">// Erstellen Sie ein vergrößeres Bild</span></span><span>
</span><span><span class="hljs-variable">$resized_image</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagescale</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>, </span><span><span class="hljs-variable">$new_width</span></span><span>, </span><span><span class="hljs-variable">$new_height</span></span><span>);
</span><span><span class="hljs-variable">$cropped_image</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecropauto</span></span><span>(</span><span><span class="hljs-variable">$resized_image</span></span><span>);
</span></span>
Durch die Reduzierung der Bildgröße kann die Speicherverwendung stark reduziert werden, wodurch Probleme mit dem Speicherüberlauf vermieden werden.
Die Ressourcen für die Bildverarbeitung in PHP sind Speicherverbrauch. Wenn Sie eine große Anzahl von Bildressourcen in mehreren Bildverarbeitungsvorgängen verwenden, sie jedoch nicht rechtzeitig freigeben, wird der Speicher ansammelt und überfließt. Nach der Verwendung des Bildes sollten die Ressourcen rechtzeitig freigegeben werden.
<span><span><span class="hljs-title function_ invoke__">imagedestroy</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>); </span><span><span class="hljs-comment">// Lösen Sie das Originalbild</span></span><span>
</span><span><span class="hljs-title function_ invoke__">imagedestroy</span></span><span>(</span><span><span class="hljs-variable">$resized_image</span></span><span>); </span><span><span class="hljs-comment">// Verlassen Sie Vorschaubild</span></span><span>
</span><span><span class="hljs-title function_ invoke__">imagedestroy</span></span><span>(</span><span><span class="hljs-variable">$cropped_image</span></span><span>); </span><span><span class="hljs-comment">// Geben Sie das geschnittene Bild frei</span></span><span>
</span></span>
Unterschiedliche Bildformate nehmen unterschiedliche Speicher an. Beispielsweise nehmen JPEG -Bilder im Allgemeinen weniger Speicher als PNG- oder TIFF -Formate auf. Daher wird empfohlen, ein geeignetes Bildformat zu wählen, bevor die Bildqualitätsanforderungen nicht besonders hoch sind. Die Auswahl des JPEG-Formats kann mehr speichersparend sein.
Wenn die obige Methode das Problem nicht vollständig lösen kann und die Bildverarbeitungsanforderungen groß sind, müssen Sie möglicherweise in Betracht ziehen, die Serverhardware zu aktualisieren. Durch Hinzufügen von mehr RAM (Speicher) und CPU -Leistung kann die Stabilität und Effizienz von PHP -Skripten bei der Verarbeitung von Bildern verbessern.
Problemüberlaufprobleme sind eine häufige Herausforderung, wenn Sie Bilder mit der Funktion der ImageCropauto () abschneiden. Durch Erhöhen von Speichergrenzen, die Optimierung der Bildgröße, die Freilegung von Speicherressourcen, die Auswahl geeigneter Bildformate usw. kann das Risiko eines Speicherüberlaufs effektiv reduziert werden. Wenn Sie sich in der groß angelegten Bildverarbeitung gegenübersehen, können Sie auch in Betracht ziehen, verteilte Computing oder asynchrone Verarbeitung zu verwenden, um den Speicherdruck zu lindern.
Mit der obigen Methode können Sie PHP verwenden, um Bilder effizienter zu verarbeiten und sicherzustellen, dass Ihr Server den Dienst aufgrund des Speicherüberlaufs nicht unterbricht.