WBB 3: Keine Thumbnails für Anhänge und Community Gallery?

Stefan Keller, den 18. Februar 2013
php-Logo
php-Logo

Wer das Burning Board 3 von WoltLab einsetzt, hat unter bestimmten Umständen das Problem, dass keine Vorschaubilder von Anhängen oder Galerie-Bildern erstellt werden. In diesem Artikel möchten wir erläutern, welche nicht-trivialen Gründe es haben kann, dass dieses Feature ohne Funktion bleibt. Fehlende Schreibrechte in den relevanten Ordnern erwähnen wir daher nicht.

Keine Thumbnails seit Update auf PHP 5.4

Wenn der Server auf PHP 5.4 aktualisiert wurde, kann es sein, dass die Erstellung von Vorschaubildern jeglicher Art fehlschlägt. Grund hierfür ist ein Fehler, der zwischenzeitlich behoben wurde. Wer Burning Board 3.1 einsetzt, sollte also einfach ein automatisches Update fahren und kann danach wieder wie gewohnt Vorschaubilder erstellen. Konkret behebt das Update der Image Utilities auf Version 1.1.1 den Fehler. Wer aus irgendwelchen Gründen kein Update fahren kann, muss den Fehler selbst beheben. Der Bug selbst betrifft nur JPG-Dateien.

In der Datei ./wcf/lib/data/image/Thumbnail.class.php lässt sich mithilfe eines Editors eine Zeile finden, die ursprünglich so aussah: @imageJPEG($imageDst, '', 90); Der leere Parameter an zweiter Stelle muss in null geändert werden, um mit dem Prototyp der Funktion konform zu laufen. Die richtige Zeile sieht also so aus: @imageJPEG($imageDst, null, 90);
Wenn der zweite Parameter bereits null ist, wurde der Fehler behoben und entsprechend ist ein anderes Problem die Ursache.

Warum ist der zweite Parameter ein Problem?

Die PHP-Funktion imagejpeg() sieht drei Parameter vor. Der erste ist der einzige, der verpflichtend ist und verlangt nach einer Bilder-Ressource. Der zweite Parameter gibt an, in welche Datei das Ergebnis geschrieben wird und ist optional. Standardmäßig ist er null, was bedeutet, dass das Ergebnis im Speicher bleibt und nicht in eine Datei geschrieben wird. Der dritte Parameter gibt die Bild-Qualität in Prozent an. Da JPG ein verlustbehaftetes Dateiformat ist, soll mit der 90 erreicht werden, dass das verkleinerte Bild noch einigermaßen schön aussieht, weshalb der zweite Parameter ebenfalls gesetzt werden muss. In früheren PHP-Versionen wurde die leere Zeichenkette als null gewertet, weshalb es keine Probleme gab; seit PHP 5.4 wird das Verhalten strenger gewertet, sodass eine leere Zeichenkette nicht mehr funktioniert. Technisch gesehen war eine leere Zeichenkette als Ersatz für null schon immer falsch.

Zu hohes memory_limit sorgt für Probleme

Ein weiterer Fehler, der bei der Erstellung von Thumbnails auftreten kann, ist das in PHP eingestellte memory_limit. Dieses gibt an, wie viel Speicher ein Script während seiner Laufzeit verwenden darf. Ebenfalls in der Datei „./wcf/lib/data/image/Thumbnail.class.php“ wird überprüft, ob überhaupt genügend Speicher zur Verfügung steht, um das Thumbnail zu erstellen (Zeilen 154-162):

$memoryLimit = ini_get('memory_limit');
   if ($memoryLimit != '') {
   $memoryLimit = substr($memoryLimit, 0, -1) * 1024 * 1024;
   $fileSize = $width * $height * ($this->imageType == 3 ? 4 : 3);
   if (($fileSize * 2.1) + memory_get_usage() > ($memoryLimit)) {
      return false;
   }
}

Ein Problem kann auftreten, wenn das „memory_limit“ in Gigabyte gesetzt wurde, in der „php.ini“ also z. B. „1G“ gesetzt wurde. Die schnellste Lösung ist, die Zeile return false; einfach mithilfe zweier an den Anfang gestellter Schrägstriche zu deaktivieren. Die sauberste Lösung ist, der Funktion die gültigen Suffixe vertraut zu machen. Hierfür muss folgende Zeile: $memoryLimit = substr($memoryLimit, 0, -1) * 1024 * 1024; mit nachfolgendem Code ersetzt werden:

$suffix = substr($memoryLimit, -1);
$multiplier = 1;
$hasSuffix = TRUE;
switch($suffix) {
        case 'K': // Kilobytes
        $multipler = 1024;
	break;
	case 'M': // Megabytes
	$multiplier = 1024 * 1024;
	break;
	case 'G': // Gigabytes
	$multiplier = 1024 * 1024 * 1024;
	break;
	default: // Bytes
	$multiplier = 1;
	$hasSuffix = FALSE;
	break;
}
if($hasSuffix === TRUE) {
	$memoryLimit = substr($memoryLimit, 0, -1);
}
$memoryLimit = $memoryLimit * $multiplier;

Warum dieser Aufwand?

Dass überhaupt nach dem „memory_limit“ gefragt wird, soll verhindern, dass Bilder bearbeitet werden, die zu viel Speicher benötigen würden. Wenn der aktuelle Speicherverbrauch und der vermutete RAM-Bedarf für die Bearbeitung höher sind als das eingestellte Speicherlimit, würde eine Fehlermeldung erscheinen und das System würde anhalten. Das ist für alle beteiligten unschön, weshalb in diesem Fall eher auf das Thumbnail verzichtet wird. Waren nach der alten Variante Gigabytes eingestellt, nahm das System an, dass es sich um Megabytes handelt und unterstellte bei „2G“ entsprechend, dass nur 2 MB zur Verfügung stünden. Anders herum verhindert die Abfrage besagte Fehlermeldung nicht, wenn z. B. „8192K“ eingestellt sind, weil der Thumbnail-Generator dann 8 GB als maximale Speichergröße annehmen würde, obwohl PHP nur 8 MB zur Verfügung stellt.

PHP wurde ohne GD-, FreeType- oder JPG-Unterstützung installiert

Ein eher seltener Fall, warum die Erstellung von Thumbnails fehlschlagen kann, ist das Fehlen von den genannten Bibliotheken. In vielen Linux-Distributionen heißt das entsprechende Paket php5-gd und kann mit einem Paketmanager nachinstalliert werden. Wird der Webserver neu geladen, sollten die Änderungen verfügbar sein und dann sollte es mit den Vorschaubildern wieder funktionieren. Um beispielsweise den Apache neu zu laden, genügt folgender Aufruf (mit privilegierten Rechten): /etc/init.d/apache2 reload

Wofür die ganzen Bibliotheken?

Die GD-Bibliothek kümmert sich um Bildbearbeitung in PHP im Allgemeinen. FreeType wird benötigt, um Schrift in Bilder einzufügen (das WBB3 kennzeichnet Thumbnails mit Dateinamen, Bild- und Dateigröße). Die Unterstützung für JPG-Dateien wird benötigt, um JPG-Dateien verarbeiten zu können.

Nicht erstellte Thumbnails neu generieren

Nachdem die Ursache für nicht erstellte Vorschaubilder gefunden ist, können zumindest die Dateianhänge wieder mit Thumbnails ausgestattet werden. Das geht im Admin Control Panel (ACP, „Administration“) des WBB3 bei System, Wartung, Anzeigen aktualisieren, Vorschaugrafiken für Dateianhänge aktualisieren.
Für die offizielle WoltLab Community Gallery, die eine Galerie-Funktion im Benutzerprofil nachrüstet, fehlt eine solche Funktionalität. Ein erfolgreicher Bugfix von oben hat also nur auf zukünftig hochgeladene Bilder eine positive Auswirkung!


Ähnliche Nachrichten