{"id":992,"date":"2012-07-25T22:40:42","date_gmt":"2012-07-25T20:40:42","guid":{"rendered":"http:\/\/www.daniel-weisensee.de\/blog\/?p=992"},"modified":"2015-05-14T18:04:47","modified_gmt":"2015-05-14T16:04:47","slug":"wordpress-plugin-nextgen-gallery-exceed-memory-limit-gelost","status":"publish","type":"post","link":"https:\/\/familiewohlleben.de\/blog\/2012\/07\/wordpress-plugin-nextgen-gallery-exceed-memory-limit-gelost\/","title":{"rendered":"WordPress Plugin NextGEN Gallery &#8220;Exceed Memory limit&#8221; gel\u00f6st"},"content":{"rendered":"<p>Als ich den Beitrag zu <a title=\"Picture My Day\" href=\"\/\/daniel-weisensee.de\/blog\/2012\/06\/16\/picture-my-day-10-15-06-2012\/\">Picture My Day<\/a> erstellte, hatte ich Schwierigkeiten mit dem NextGEN Gallery Plugin. Beim Upload bzw. Einlesen der Bilder in der neuen Galerie sollten automatisch Vorschaubilder (Thumbnails) erzeugt werden. Allerdings schlug dieser Vorgang mit der folgenden Fehlermeldung fehl:<\/p>\n<blockquote><p>Error : Exceed Memory limit. Require : 78.31 MByte<\/p><\/blockquote>\n<p>Das ganze hat mich zun\u00e4chst einmal ziemlich verbl\u00fcfft, da ich das Anlegen einer neuen Galerie schon vielfach durchgef\u00fchrt habe und nie Schwierigkeiten damit hatte. Eine schnelle Probleml\u00f6sung schien nicht in Sicht, weshalb ich die Thumbnails extern auf meinem PC erstellt habe. Nun hatte ich Zeit, um das Problem n\u00e4her zu untersuchen.<\/p>\n<p>Zun\u00e4cht sei gesagt, dass ihr im WordPress Dashboard in der linken Men\u00fcleiste auf &#8220;Galerie&#8221; -&gt; &#8220;\u00dcbersicht&#8221; klicken k\u00f6nnt, um euch auf der rechten Seite eure &#8220;Server-Einstellungen&#8221; anzusehen. Interessante Werte:<\/p>\n<blockquote><p>Speicherverbrauch : 57.87 MByte<br \/>\nPHP Memory Limit : 64<\/p><\/blockquote>\n<p>Die Angabe Speicherverbrauch bezieht sich, wenn ich das korrekt interpretiere, auf den von WordPress inkl. der aktiven Plugins genutzten Arbeitsspeicher. Unter welchen Bedingungen auch immer. So ganz klar ist mir das nicht, allerdings erscheint mir der Wert schon sehr hoch. Klar treiben Plugins den Wert nach oben, aber ich bin nicht jemand, der aus Spa\u00df Plugins installiert. Werde aber in Zukunft Recherchen anstellen, ob ich den Verbrauch senken kann. Das PHP Memory Limit steht auf 64MByte. Das ist leider auch der H\u00f6chstwert f\u00fcr mein Webhosting Paket. Falls ihr dort noch Luft habt, gibt es Mittel und Wege, um WordPress bzw. den Plugins mehr Speicher zu erlauben. Z.B. diesen <a title=\"Thumbnail generation php memory limit\" href=\"http:\/\/www.visser.com.au\/blog\/thumbnail-generation-php-memory-limit-nextgen-gallery\/\" target=\"_blank\">Tipp<\/a> oder einfach mal googeln!<\/p>\n<h2>GD Library<\/h2>\n<p>Was generiert die Thumbnails eigentlich und wie berechnet sich der Speicherbedarf f\u00fcr ein Bild?<\/p>\n<p>Dabei bin ich auf einen sehr guten Beitrag des Entwicklers der NextGEN Gallery gesto\u00dfen: <a title=\"Understand GD library\" href=\"http:\/\/alexrabe.de\/2008\/05\/13\/understand-gd-library\/\" target=\"_blank\">http:\/\/alexrabe.de\/2008\/05\/13\/understand-gd-library\/<\/a><\/p>\n<p>Kurz gesagt, eine Bibliothek namens &#8220;GD&#8221; ist f\u00fcr die Bildmanipulationen zust\u00e4ndig. Diese verbraucht nat\u00fcrlich Arbeitsspeicher, w\u00e4hrend sie ein Bild verarbeitet. Wichtig ist, dass die Dateigr\u00f6\u00dfe keineswegs mit dem ben\u00f6tigten Speicher w\u00e4hrend der Verarbeitung \u00fcbereinstimmt! Eine Ann\u00e4herung wird auch genannt:<\/p>\n<p>$<br \/>\n\\frac{Width * Height * 8 Bits * 3 Channels}{8 * 1.65}<br \/>\n$<\/p>\n<h2>PHP Code des Plugins<\/h2>\n<p>Unter <em>wp-content\/plugins\/nextgen-gallery\/lib<\/em> findet sich die Datei <em>gd.thumbnail.inc.php<\/em>, aus welcher ich hier Code zitiere.<\/p>\n<p>[php title=&#8221;Aufruf des Memory Checks&#8221;]<br \/>\nif($this-&gt;error == false) {<br \/>\n\/\/ Check memory consumption if file exists<br \/>\n$this-&gt;checkMemoryForImage($this-&gt;fileName);<br \/>\n}<br \/>\n[\/php]<\/p>\n<p>Dieser Aufruf pr\u00fcft vor der Generierung des Thumbnails, ob gen\u00fcgend Speicher f\u00fcr die Operation zur Verf\u00fcgung steht.<\/p>\n<p>Springen wir in die Funktion:<br \/>\n[php]<br \/>\nfunction checkMemoryForImage( $filename ){<\/p>\n<p>&#8230;<\/p>\n<p>$K64 = 65536;\u00a0\u00a0\u00a0 \/\/ number of bytes in 64K<br \/>\n$TWEAKFACTOR = 1.68;\u00a0 \/\/ Or whatever works for you<br \/>\n$memoryNeeded = round( ( $imageInfo[0] * $imageInfo[1] * $imageInfo[&#8216;bits&#8217;] * $CHANNEL \/ 8 + $K64 ) * $TWEAKFACTOR);<br \/>\n$memoryNeeded = memory_get_usage() + $memoryNeeded;<br \/>\n\/\/ get memory limit<br \/>\n$memory_limit = ini_get(&#8216;memory_limit&#8217;);<\/p>\n<p>&#8230;<\/p>\n<p>if ($memoryNeeded &gt; $memory_limit) {<br \/>\n$memoryNeeded = round ($memoryNeeded \/ 1024 \/ 1024, 2);<br \/>\n$this-&gt;errmsg = &#8216;Exceed Memory limit. Require : &#8216;.$memoryNeeded. &#8221; MByte&#8221; ;<br \/>\n$this-&gt;error = true;<br \/>\n}<\/p>\n<p>&#8230;<br \/>\n[\/php]<\/p>\n<p>Es wird also berechnet, wie viel Speicher die Operation ben\u00f6tigt. Anschlie\u00dfend wird der schon von WordPress verwendete Speicher addiert. Der Gesamtwert wird schlie\u00dflich mit dem PHP Memory Limit verglichen. Ist der Speicherbedarf zu hoch, wird eben diese Fehlermeldung ausgegeben und die Thumbnailerzeugung abgebrochen.<\/p>\n<h3>Wie sieht die Formel aus?<\/h3>\n<p>In der Funktion kommt folgende Formel zum Einsatz:<\/p>\n<p>$<br \/>\n(Width * Height * Bits * \\frac{Channel}{8} + 64K) * Tweakfactor \\\\<br \/>\n= (Width * Height * 8 * \\frac{Channel}{8} + 65536) * 1.68<br \/>\n$<\/p>\n<h3>Beispiel<\/h3>\n<p>Eines meiner Bilder hat $ 2847 * 1600 $ Pixel und das Dateiformat .jpg. Dabei scheint der Wert f\u00fcr channel = 3 zu sein.<\/p>\n<p>$<br \/>\n(2847 * 1600 * 8 * \\frac{3}{8}) + 65536) * 1.68 \\\\<br \/>\n= 23068308.48 Byte<br \/>\n$<\/p>\n<p>Dies entspricht dem f\u00fcr die Operation ben\u00f6tigten Speicher. Nun Addition mit dem bereits verwendeten Speicher.<\/p>\n<p>$<br \/>\n23068308.48 Byte + 57.87 MByte \\\\<br \/>\n= 22.0 MByte + 57.87 MByte \\\\<br \/>\n= 79.87 MByte<br \/>\n$<\/p>\n<p>Das deckt sich fast mit den 78.31 MByte aus meiner Fehlermeldung.<\/p>\n<h2>Probleml\u00f6sung<\/h2>\n<p>Die Fehlermeldung trat bei mir auf, weil der insgesamt ben\u00f6tigte Speicher mit 78 MByte die zur Verf\u00fcgung stehenden 64 MByte \u00fcberschritt. Dadurch wurde die Erzeugung der Thumbnails unterbunden. Durch das Auskommentieren des Funktionsaufrufes zur Berechnung des Speicherbedarfes, funktioniert die Generierung der Thumbnails wieder. Im Prinzip m\u00fcsste mein WordPress dann mehr Speicher verbrauchen, als serverseitig zur Verf\u00fcgung gestellt werden sollte. Falls die Berechnung auf Basis der Werte und Formeln korrekt ist. Aber wie dem auch sei, es geht wieder.<\/p>\n<p>Die oben erw\u00e4hnten Zeilen in der\u00a0<em>wp-content\/plugins\/nextgen-gallery\/lib\/<\/em><em>gd.thumbnail.inc.php<\/em> [Zeilen 166-169 in der Pluginversion 3.1.3] sehen nun also so aus:<\/p>\n<p>[php]<br \/>\n\/\/ if($this-&gt;error == false) {<br \/>\n\/\/ Check memory consumption if file exists<br \/>\n\/\/ $this-&gt;checkMemoryForImage($this-&gt;fileName);<br \/>\n\/\/ }<br \/>\n[\/php]<\/p>\n<p>Die Idee zu dieser L\u00f6sung stammt ebenfalls von Alex Rabe und wurde <a title=\"NextGEN gallery PHP memory limit deactivate memory check\" href=\"http:\/\/wordpress.org\/support\/topic\/plugin-nextgen-gallery-upgrade-to-wordpress-263-makes-thumbnails-stop-working\" target=\"_blank\">hier<\/a> im WordPress Forum diskutiert.<\/p>\n<p>Zu diesem Thema interessieren mich eure Erfahrungen ganz besonders. Also hinterlasst mir einen Kommentar, wenn dieser Ansatz bei euch funktioniert oder auch nicht funktioniert hat.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Als ich den Beitrag zu Picture My Day erstellte, hatte ich Schwierigkeiten mit dem NextGEN Gallery Plugin. Beim Upload bzw. Einlesen der Bilder in der neuen Galerie sollten automatisch Vorschaubilder (Thumbnails) erzeugt werden. Allerdings schlug dieser Vorgang mit der folgenden Fehlermeldung fehl: Error : Exceed Memory limit. Require : 78.31 MByte Das ganze hat mich<span class=\"continue-reading\"> <a href=\"https:\/\/familiewohlleben.de\/blog\/2012\/07\/wordpress-plugin-nextgen-gallery-exceed-memory-limit-gelost\/\">Weiterlesen &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_s2mail":"yes","footnotes":""},"categories":[40],"tags":[164,161,162,163,24],"class_list":["post-992","post","type-post","status-publish","format-standard","hentry","category-webdesign","tag-gd-library","tag-nextgen-gallery","tag-php-memory-limit","tag-thumbnail","tag-wordpress"],"_links":{"self":[{"href":"https:\/\/familiewohlleben.de\/blog\/wp-json\/wp\/v2\/posts\/992","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/familiewohlleben.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/familiewohlleben.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/familiewohlleben.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/familiewohlleben.de\/blog\/wp-json\/wp\/v2\/comments?post=992"}],"version-history":[{"count":91,"href":"https:\/\/familiewohlleben.de\/blog\/wp-json\/wp\/v2\/posts\/992\/revisions"}],"predecessor-version":[{"id":3741,"href":"https:\/\/familiewohlleben.de\/blog\/wp-json\/wp\/v2\/posts\/992\/revisions\/3741"}],"wp:attachment":[{"href":"https:\/\/familiewohlleben.de\/blog\/wp-json\/wp\/v2\/media?parent=992"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/familiewohlleben.de\/blog\/wp-json\/wp\/v2\/categories?post=992"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/familiewohlleben.de\/blog\/wp-json\/wp\/v2\/tags?post=992"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}