Installation Contao 4 und Migration Contao 3 bei Domainfactory

Aus Contao Community Documentation

MsgError.png Unvollständiger Artikel: dieser Artikel ist noch nicht sauber bearbeitet.

Bitte erweitere ihn und entferne erst anschliessend diesen Hinweis.

Migration einer umfangreichen Contao-3.5-Installation zu Contao 4.4

Umziehen soll die sehr umfangreiche Installation des Deutschen Schachbundes mit mehreren Subdomains. Ausgangspunkt ist Contao 3.5 mit PHP 5.6. Ziel ist Contao 4.4 mit PHP 7.1, alles auf einem ManagedServer bei Domainfactory.

Datenbestand

Die Datenbank enthält über 8 Millionen Datensätze, darunter Daten von zahlreichen selbstprogrammierten Erweiterungen, die alle noch nicht mit C4 und PHP 7 getestet wurden. Die Multidomaininstallation umfaßt 5 Subdomains mit über 1.600 Seiten und über 13.000 Nachrichten, um nur einige Eckdaten zu nennen. Die Datenbank ist insgesamt etwa 1,6 GB groß.

Systemvoraussetzungen für Contao 4

Standardmäßig funktioniert die Installation von C4 bei Domainfactory nicht, egal in welchem Tarif man sich befindet. Benutzer mit Shell- und php.ini-Zugriff können ihren Webspace allerdings auf so eine Installation vorbereiten. Dazu gehören:

  • Aktivierung der intl-Erweiterung durch Benutzung von PHP Extended. PHP in der Standardedition ist unbrauchbar für C4. Die intl-Erweiterung wird von Symfony benötigt, ohne das Contao nicht läuft.
  • Umstellung der Konsole von PHP 4.4.9 auf mindestens PHP 5.6. Das ist nötig um Composer ausführen zu können.
  • Erhöhung von memory_limit in der php.ini auf einen Wert von mindestens 1,5 bis 2 GB. Das ist nötig um Composer ausführen zu können.

Vorbereitung Webspace

Es mußte ein leeres Verzeichnis, z.B. webseiten/contao4 angelegt werden und darin ein Verzeichnis web. Auf das Verzeichnis webseiten/contao4/web mußte eine (Sub-)Domain geroutet werden. Per FTP kann danach in das Verzeichnis webseiten/contao4/web die Datei contao-manager.phar hochgeladen werden. Um diese aufrufen zu können, muß die Endung php an diese Datei angehangen werden.

Vorbereitung Datenbank

Ein Backup der Datenbank über phpMyAdmin ist aufgrund der Größe unmöglich. Mit dem MySQLDumper ist es zwar machbar, mir aber zuletzt nicht gelungen. Mittendrin bot mir der Browser die aufgerufene PHP-Datei zum Download an. Offensichtlich hatte sich der Server bei der Interpretierung von PHP-Dateien vertan. Über die Shell hat es schließlich geklappt:

Export einer MySQL-Datenbank:

mysqldump [Datenbankname] -u[Datenbank-Benutzer] -p[Datenbank-Passwort] --default-character-set=utf8 > [Datei]

Import einer MySQL-Datenbank:

mysql -u[Datenbank-Benutzer] -p[Datenbank-Passwort] --default-character-set=utf8 [Datenbankname] < [Datei]

Wichtig dabei ist die Angabe des Zeichensatzes! Sonst hat man statt Umlauten nur Hieroglyphen auf der Seite.

Installation

Mit http://domain/contao-manager.phar.php kann nun die Installation gestartet werden. Der Contao-Manager (CM) stürzt beim ersten Mal immer mit einer Fehlermeldung ab. Nach einem Refresh läuft er aber fortan sauber durch und auch die Installation läuft sauber durch.

Nach der Installation durch den CM muß C4 nun noch mit dem Installtool fertiggestellt werden. Das wird direkt aus dem CM oder mit http://domain/contao/install aufgerufen. Zuvor sollte die C3-Datenbank in die C4-Datenbank importiert worden sein.

Kopieren von fehlenden Dateien

Der Inhalt des files-Ordners aus C3 muß nach webseiten/contao4/files kopiert werden. In zeitlich vertretbaren Rahmen und wenn man das Dateidatum behalten möchte ist das nur über die Shell möglich. Hier gebe ich "mc" ein, was den Midnight Commander startet. Mit dem habe ich nun die rund 44 GB Daten aus files kopiert, was auch so 2-3 Stunden dauerte.

Das Kopieren des templates-Ordners nach webseiten/contao4/templates dauerte ähnlich lange. Das lag daran, weil ich dort den Cache eines externen PHP-Skriptes gespeichert habe, wo sich mehrere 10.000 Dateien in kurzer Zeit ansammeln.

Auf das Kopieren von system/modules nach webseiten/contao4/system/modules habe ich vorerst verzichtet. Hier ist es wahrscheinlich besser nach Erweiterungsversionen für C4 zu suchen und diese über den CM zu installieren.

Migration

Auf das Kopieren der Dateien aus system/modules hatte ich vorerst verzichtet. Stattdessen nutze ich den Debugmodus (app_dev.php) und arbeite dort die schweren Fehler ab. Erweiterungen, wo es C4-Versionen gibt, stalliere ich über die Shell. Wo es nicht klappt - bei simple_columns kommt vom Composer eine Fehlermeldung, weil die Version nicht paßt - kopiere ich aus system/modules die Erweiterung.

Da ich auch im assets-Ordner mehrere eigene Dateien gespeichert habe, kopierte ich auch diese in den assets-Ordner von C4.

Kopieren von system/modules

Für jede der Erweiterungen in diesem Verzeichnis von Contao 3 habe ich über Google auf packagist.org entsprechende Bundles gesucht. Da bei Domainfactory die Installation eines solchen Bundles mit dem Contao Manager nicht möglich ist, mußte ich immer auf die Shell ausweichen. Der Befehl muß natürlich im Ordner web ausgeführt werden, wo die Datei contao-manager.phar.php gespeichert ist.

php contao-manager.phar.php composer require BUNDLENAME

Bei der Installation mußte ich auf diverse Fehlermeldungen reagieren:

  • Bundle nicht kompatibel mit Contao 4 -> einfach die C3-Erweiterung nach system/modules kopieren
  • Bundle kann erforderliche externe Bundles nicht installieren -> C3-Erweiterung in system/modules von Contao 4 löschen, danach Installation wiederholen
  • Bundle craffft/contao-calendar-ical-bundle läßt sich nicht installieren -> "dev-master" im Shell-Aufruf anhängen (mit den Hochkommata!)

Den zweiten Fall bekam ich bei der Installation von terminal42/contao-leads auf den Monitor. Da ich vorher bereits die Erweiterungen Haste und multicolumnwizard aus meiner C3-Installation nach system/modules kopiert hatte, wollte der Composer die C4-Bundles von Haste und multicolumnwizard nicht installieren.

Nach jeder Installation bzw. jedem Kopiervorgang leerte ich den Cache und erstellte die Symlinks neu, um danach zu überprüfen, ob insbesondere die C3-Erweiterungen funktionieren. Fehlermeldungen im Zusammenhang mit der PHP7-Kompatibilität konnte sofort beseitigen, die schwierigeren Fälle hob ich mir für später auf.

Fehlermeldung: Fatal error: Cannot use 'String' as class name as it is reserved ...

Alle Erweiterungen und ggfs. auch die Templates sollten auf das Benutzen der String-Klasse von Contao überprüft werden. Die Aufrufe der String-Klasse müssen durch StringUtil ersetzt werden.

CSS-Dateien von Erweiterungen werden nicht gefunden

Trotz Cacheleeren will der Server partout keine CSS-Dateien aus public-Verzeichnissen o.ä. von Erweiterungen laden. Es kommt immer eine 404-Fehlermeldung. Schuld ist wahrscheinlich ein nichtgenerierter Symlink. Hier hilft ein Aufruf von "Symlinks neu erstellen" in der Systemwartung im C4-Backend. Siehe dazu auch: Contao 3 Erweiterung in Contao 4 installieren

Debugmodus

Im Gegensatz zu C3 läßt sich der Debugmodus nicht mehr im Backend aktivieren. In C4 wird der Debugmodus über die app_dev.php aufgerufen. Glen Langer (BugBuster) hat dazu eine kleine Anleitung online gestellt, da der Zugang zu app_dev.php geschützt ist. Der dort angegebene Befehl

php vendor/bin/contao-console contao:install-web-dir --user=USER --password=PASSWORD

muß im Root der Contao-Installation ausgeführt werden!

Cache löschen

In C3 mußte man dazu in die System-Einstellungen gehen und den Cache deaktivieren. In C4 muß der Cache manuell geleert werden. Das geht mit verschiedenen Befehlen über die Shell:

php app/console cache:clear --env=prod --no-debug
php app/console cache:clear --env=dev --no-debug
php bin/console cache:clear --env=prod --no-debug
php vendor/bin/contao-console cache:clear --env=dev --no-debug

Welcher Befehl der richtige ist, hängt von der verwendeten Version ab: Managed Edition oder Standard Edition.

Man kann natürlich die Ordner unter var/cache per FTP o.ä. auch direkt löschen.

Eine interessante Variante habe ich auf dieser Webseite gefunden:

\Files::getInstance()->rrdir('var/cache/prod', true);

soll in die system/config/initconfig.php eingetragen werden. Dann wird bei jedem Laden der Seite der produktive Cache gelöscht.

Installation von C4-Erweiterungen

Bei Domainfactory ist das leider nur über die Shell möglich. Der CM stürzt mit dem von ihm aufgerufenen Composer immer mit einer Zu-wenig-Arbeitsspeicher-Meldung ab. Dabei spielt es keine Rolle, was man in der php.ini zu stehen hat! Domainfactory läßt für Shellaufrufe, die von einem PHP-Skript kommen, nur einen begrenzten Arbeitsspeicher zu, den man nicht beeinflussen kann. Selbst bei einem ManagedServer nicht.

Shell-Installation

Einige Beispielaufrufe:

php contao-manager.phar.php composer require jrgregory/m17-sticky-backend-footer
php contao-manager.phar.php composer require contao-legacy/simple_columns
php contao-manager.phar.php composer update derhaeuptling/contao-mega-menu
php contao-manager.phar.php composer update contao/core-bundle
php contao-manager.phar.php composer require bugbuster/contao-banner-bundle

Bitte dabei beachten:

  • Der Aliasaufruf "php" am Anfang funktioniert nur, weil ich dieses Alias mit PHP 5.6 verknüpft habe. Standardmäßig ist "php" mit PHP 4.4.9 verknüft.
  • Der Befehl muß im web-Verzeichnis ausgeführt werden.

Anpassung von C3-Erweiterungen auf die C4-Umgebung

Weiterleitungen auf die main.php funktionieren in Contao 4 nicht mehr:

$backlink = 'main.php?do=erweiterung&act=edit&id='.$id.'&rt='.REQUEST_TOKEN;
header('Location:'.$backlink);

Erweiterung [timelinejs]

Für diese Erweiterung gibt es kein C4-Bundle. Ich kopierte deshalb die C3-Version in meine C4-Installation, doch die Erweiterung lief weder im FE noch im BE. Ursache waren die fehlenden Abhängigkeiten [dca_rules] und [metapalettes]. Von letzterer Erweiterung gibt es ein C4-Bundle, das sich aber über die Shell nicht installieren ließ - ganz am Ende, als schon ich auf die Erfolgsmeldung wartete, kam ein Timeout. Ich habe deshalb von beiden Erweiterungen die C3-Versionen kopiert.

Erweiterung [chronik]

Das ist eine selbstprogrammierte Erweiterung zur Verwaltung von historischen Ereignissen. Im FE bekam ich einen 404-Fehler. Ursache ist ein Fehler in meiner URL-Umschreibung. Insbesondere komme ich hier mit dem Developer-Modus noch nicht klar. Im Contao-Forum gibt es hierzu ein Thema.

Ansichten
Meine Werkzeuge

Contao Community Documentation

<user> Composer meckert bei Isotope, dass er mit tablelookupwizard 3.1 nicht zurecht kommt - korrekt?
<Toflar> keine Ahnung, sowas weiss ich doch nicht auswendig :D
<user> wer dann ;)
<Toflar> na niemand, deswegen schreibt man's ja in die composer.json

Navigation
Verstehen
Verwenden
Entwickeln
Verschiedenes
Werkzeuge