Performanceprobleme mit Composer

Hast Du Probleme mit der Geschwindigkeit von Composer Installationen? Vielleicht liegt es am genutzten Protokoll, wie in meinem Fall.

Das Problem

Wir installieren in einem Build Prozess oder auch nur manuell via composer install unsere Abhängigkeiten und immer wieder beendet sich Composer wegen eines Timeouts. Oder die Installation von GitHub Komponenten ist derart langsam das ein CI Prozess eine nicht akzeptierbare Dauer einnimmt.

Die Erklärung

Composer mit Debug Informationen starten composer -vvv install – und man sieht welche Befehle eigentlich ausgeführt werden. Als Beispiel mache ich dies mit dem ZendServer API Modul für Zend Framework 2 – und zwecks Übersichtlichkeit kürze ich auch die Befehlsausgaben:

$ composer -vvv install
Downloading composer.json
Loading composer repositories with package information
Downloading https://packagist.org/packages.json
Installing dependencies
 - Installing zendframework/zendframework (dev-master 23bb494)
   Cloning 23bb49413fa9d3088fe8653a618d48511a91ae0e
Executing command (CWD): git clone 'git://github.com/zendframework/zf2.git' '/Users/kevin/Development/zendserverapi-zf2/vendor/zendframework/zendframework' && cd '/Users/kevin/Development/zendserverapi-zf2/vendor/zendframework/zendframework' && git remote add composer 'git://github.com/zendframework/zf2.git' && git fetch composer

Und hier wird es dann auch schon spannend, das für unseren aktuellen Fall relevante Problem liegt im Befehl:

git clone 'git://github.com/zendframework/zf2.git'

Wir sehen das zum Clonen das git:// Protokoll verwendet wird. Auf einem Server lief dieses Command allerdings mit einer derart schlechten Performance, das Composer zunächst immer abgebrochen ist (Default Timeout steht auf 300 Sekunden). Aber auch einen Erhöhung des Timeouts brachte keine Besserung – es ist auch nicht akzeptabel das eine simple Installation aller Abhängigkeiten über 10 Minuten läuft.

Die Lösung

Composer erlaubt viele grundlegende Verhaltensweisen zu konfigurieren. Dazu legt man zunächst im Homeverzeichnis ein Verzeichnis .composer an und dort hinein eine config.json:

vim ~/.composer/config.json

Wenn man nun die verwendeten Protokolle (default: [„git“, „https“, „http“]) verändert, nutzt Composer diese im Anschluß mit der überschrieben Reihenfolge. Bei mir brachte dies eine deutliche Geschwindigkeitsverbesserung, da http und auch https problemlos laufen. Desweiteren habe ich auch noch den Timeout auf 10 Minuten erhöht. Meine Composer config.json sieht also so aus:

{
    "config": {
        "github-protocols": ["http", "https", "git"],
        "process-timeout": 600
    }
}

Rufe ich erneut composer -vvv install auf ergibt sich ein neues Bild:

$ composer -vvv install
Downloading composer.json
Loading composer repositories with package information
Downloading https://packagist.org/packages.json
Installing dependencies
 - Installing zendframework/zendframework (dev-master 23bb494)
   Cloning 23bb49413fa9d3088fe8653a618d48511a91ae0e
Executing command (CWD): git clone 'http://github.com/zendframework/zf2.git' '/Users/kevin/Development/zendserverapi-zf2/vendor/zendframework/zendframework' && cd '/Users/kevin/Development/zendserverapi-zf2/vendor/zendframework/zendframework' && git remote add composer 'http://github.com/zendframework/zf2.git' && git fetch composer

Problem gelöst 🙂