Joomla mit PHP 5.5 betreiben

UPDATE 1.10.14: Mittlerweile ist einiges an Zeit vergangen und der Fehler müsste mittlerweile in den neuen Versionen behoben sein (Patch wurde wie bereits gesagt September 2013 bereits in den Master Branch gemergt). Wenn also nun mit einer neuen Joomla Version ein Problem mit PHP5.5 wird sich der Fehler mit ziemlicher Sicherheit nicht mit diesem Patch beheben lassen, da er ja bereits integriert ist.

UPDATE 6.9.13: Seit einigen Wochen gibt es im Joomla-Master-Branch auf Github einen offiziellen Patch für das Problem. Ich hab meinen Patch entsprechend angepasst.

Heute hatte ich die Freude, ein Joomla-System auf einen neuen virtuellen Server mit der aktuellen PHP 5.5 Vesion zu installieren. Leider kommt der Joomla-Installer allerdings nicht über die erste Config-Seite hinweg. Grund dafür ist eine Ajax Abfrage im Hintergrund, die von PHP (oder auch nicht, je nach Konfiguration von display_errors) einen Fehler übermittelt bekommt, der jedoch während der Installation nie angezeigt wird. Der Serverlog in /var/log/httpd/error_log gab allerdings Aufschluss: Grund für die Verweigerung der Installation liegt bei der PHP-Funktion preg_replace in Kombination mit der Verwendung des Regexmodifizierers „e“ (PREG_REPLACE_EVAL). Durch diesen wurde $replacement nicht direkt eingesetzt, sondern wie bei der Funktion eval vorher ausgeführt. Da eval allerdings in Verbindung mit Benutzereingaben niemals eine gute Idee ist, gibt es ab PHP 5.5 nur mehr die Variante mit preg_replace_callback.

Folglich müssen in der Datei /pfad/zu/joomla/libraries/joomla/filter/input.php folgenden Zeilen leicht abgeändert werden:

	protected function _decode($source)
	{
		static $ttr;

		if (!is_array($ttr))
		{
			// Entity decode
			$trans_tbl = get_html_translation_table(HTML_ENTITIES);
			foreach ($trans_tbl as $k => $v)
			{
				$ttr[$v] = utf8_encode($k);
			}
		}
		$source = strtr($source, $ttr);

		// Convert decimal
		//$source = preg_replace('/&#(\d+);/me', "utf8_encode(chr(\\1))", $source); // decimal notation
		$source = preg_replace_callback(
			'/&#(\d+);/m',
			function ($var)
			{
				return utf8_encode(chr($var[1]));
			},
			$source
		);

		// Convert hex
		//$source = preg_replace('/&#x([a-f0-9]+);/mei', "utf8_encode(chr(0x\\1))", $source); // hex notation
		$source = preg_replace_callback(
			'/&#x([a-f0-9]+);/mi',
			function ($var)
			{
				utf8_encode(chr('0x' . $var[1]));
			},
			$source
		);

		return $source;
	}

Weitere Fehler sind mir bis dato nicht bekannt. Falls ich noch welche finden sollte, werden sie auch in diesem Artikel veröffentlicht.

Comments

  1. Super, Danke! Ich musste auf die neueste Version umstellen, weil ich „magic_quotes_gpc = Off“ bei meinem Provider nicht aktivieren konnte (habe die üblichen Methoden wie php.ini alle durchprobiert) – und da will sich Joomla bekanntlich nicht installieren. Und seit php 5.4 sind die magic quotes ganz rausgeflogen, sehr praktisch, also habe ich einfach auf 5.5 umgestellt (5.4 gibt es bei meinem Provider nicht). Und dann hatte ich genau das von cheesi beschriebene Problem. Nach seinem Fix lief alles 1A! Top!

    • Kein Problem 😉
      Der Effekt von Magic Quotes lässt sich auch mit folgendem kleinen Skript „umgehen“, allerdings wird das in einem Joomla-System kein Sinn machen, da man dafür was weiß ich wie viele Teile bearbeiten müssten:

      <?php
      if (get_magic_quotes_gpc()) {
          $in = array(&$_GET, &$_POST, &$_COOKIE);
          while (list($k,$v) = each($in)) {
              foreach ($v as $key => $val) {
                  if (!is_array($val)) {
                      $in[$k][$key] = stripslashes($val);
                      continue;
                  }
                  $in[] =& $in[$k][$key];
              }
          }
          unset($in);
      }
      ?>
      
  2. Recht herzlichen Dank für die genaue und übersichtliche Beschreibung. Mein Problem mit einer neuen Subdomain auf meinem lokalen Rechner (XAMPP) ist prima gelöst!

  3. Herzlichen Dank. Das hat mir (Anfänger) sehr geholfen.
    Hatte erst mal ein paar Problemchen, zu verstehen was zu machen ist. Aber seitdem läuft es wieder super und ohne „deprecated …“-Meldungen.

Schreibe einen Kommentar

Your email address will not be published / Required fields are marked *