OXVM für die Entwicklung mit OXID eShop verwenden


Dieser Artikel soll Entwickler an die OXVM heranführen und zeigen, wie sie als Grundlage für Projekte genutzt werden kann, um schnell mit der wichtigen Arbeit, der Entwicklung eigener Anpassungen für OXID eShop beginnen zu können. Eine vorkonfigurierte VM, die erst auf dem Zielcomputer generiert und hochgefahren wird, bringt eine hohe Flexibilität ins Projekt, weil Entwickler binnen weniger Minuten ein funktionierendes Setup in Betrieb nehmen können, das zugleich auch noch einheitlich und plattformunabhängig ist.

Vorwort

Ende Oktober 2015 hat OXID die OXVM vorgestellt, eine virtuelle Maschine, die mit Vagrant und dem Provisioner Ansible erstellt wird und auf die Verwendung mit OXID eShop zugeschnitten ist.

Oberstes Ziel bei der Entwicklung dieser VM war die Schaffung einer einheitlichen und repräsentationsfähigen Umgebung für Entwicklungsarbeiten an OXID eShop. Hierfür wird die VM mit bestimmten Softwarepaketen und Erweiterungen ausgestattet. Darunter gehören neben der obligatorischen LAMP-Installation (Linux, Apache, MySQL und PHP) solche Bestandteile wie Composer, Xdebug und Varnish sowie die per Konfigurationsparameter installierbaren Testwerkzeuge und das OXID-SDK. Mit letzteren können etwa die mitgelieferten Shop-Tests ausgeführt oder aber auch eigene Module während der Entwicklung auf Einhaltung der Richtlinien und Erfüllung selbst geschriebener Unit- und Integrationstests geprüft werden.

OXVM bekommen

Die OXVM können Sie bei GitHub herunterladen. Das Projekt enthält als Unterprojekt das Paket oxvm_base (im Verzeichnis base_vm). Wenn Sie einen GIT-Client verwenden, wird dieses Paket gleich mit ausgecheckt. Hierzu gibt es übrigens noch mehr zu erzählen – später mehr.

Mit der OXVM verfolgt OXID einen sauberen Ansatz für die Trennung von anwendungsspezifischen und generischen Paketbestandteilen. So setzt sich die VM aus einer Konfiguration zusammen, die allgemein eingesetzt werden kann. Alles, was dann noch OXID-spezifisch ist, wird mit “oxvm_eshop” nachgeliefert und quasi obendrauf gebaut.

Bevor man mit der Arbeit an der VM beginnt, sollte man sich die Repository-Inhalte in ein neues Projektverzeichnis kopieren. Weil die VM projektspezifische Einstellungen enthalten wird und Zubehör wie beispielsweise ein Datenbankdump zum Projekt gehören, ist es empfehlenswert, das Ganze als Projekt aufzufassen und auch so in der IDE zu verwalten.

Eine eigene Konfiguration für die VM erstellen

Zwar kann die VM gleich nach dem Herunterladen von GitHub in Betrieb genommen werden, es ist jedoch empfehlenswert, sich mit einigen ihren Konfigurationsmöglichkeiten vertraut zu machen und ein paar Einstellungen anzupassen.

Die Einstellungen werden dem Provisioner mittels Yaml-Datei mitgeteilt. Eine Platzhalterdatei mit dem Namen personal.yml.dist befindet sich im Wurzelverzeichnis. Aus dem Dateinamen wird nun das “.dist” entfernt und die Datei geöffnet. In der ersten Zeile befindet sich ein Hinweis auf eine weitere Yaml-Datei. Gemeint ist /base_vm/ansible/vars/default.yml. Diese Datei legt allgemeingültige Einstellungen für die VM fest (vgl. oben). Der Definition nach müsste es also noch eine Datei geben, in der sich die OXID-spezifischen Einstellungen befinden; diese ist /ansible/vars/oxideshop.yml. Beide Dateien sollen uns als Vorlage zur Erstellung einer projektspezifischen personal.yml dienen.

--- # Override any variable from 'ansible/vars/oxideshop.yml' and 'base_vm/ansible/vars/default.yml' vagrant_local: vm: memory: '1024' cpus: 1 name: DemoVM hostname: ackisdemovm.dev aliases: - www.ackisdemovm.dev app_shared_folder: source: ./htdocs target: /var/www/htdocs server: timezone: Europe/Berlin locale: de_DE.UTF-8 apt_mirror: http://de.archive.ubuntu.com/ubuntu/ unattended_upgrade: true varnish: install: false eshop: config: utf_mode: 1 sdk: module_skeleton_generator: install: false module_certification_tools: install: false apache: install: true docroot: /var/www/htdocs servername: ackisdemovm.dev packages: - php5-cli - php5-intl - php5-mcrypt - php5-mysql - php5-gd - php5-curl composer: prestissimo: install: true mysql: install: true root_password: '123' database: oxid user: user password: password

php: install: true packages: - php5-cli - php5-intl - php5-mcrypt - php5-mysql - php5-gd - php5-curl phpbrew: cache: repo: 'https://github.com/OXID-eSales/oxvm_assets' ref: 'phpbrew_builds' depth: 1 update: true version: ~ composer: installer_url: https://getcomposer.org/installer install: '0' github_token: ~ prestissimo: install: false pecl_packages: ~ zendguard: install: false

Einige der hier gezeigten Möglichkeiten dienen lediglich als Hinweis darauf, dass sie geändert werden können – zum Beispiel Festlegen der Spracheinstellungen und des Updateservers auf de.archive.ubuntu.com anstelle von en.archive.ubuntu.com – sie müssen nicht übernommen werden. Die Zugangsdaten für MySQL stehen hier, damit niemand suchen muss.

Entspricht die Konfiguration den Wünschen, kann sie allmählich hochgefahren werden. Davor aber noch ein Einschub für diejenigen, die Vagrant noch nicht haben.

Software installieren und einrichten

Vagrant erzeugt auf Grundlage einer Textdatei eine virtuelle Maschine. Hierfür wird eine vorbereitete Festplattendatei verwendet, die, falls im System noch nicht existent, erst heruntergeladen werden muss. Ist das der Fall, dauert das initiale Hochfahren ca. 10 Minuten länger. Zum Zeitpunkt der Entstehung dieses Artikels dient ubuntu/trusty64 als Vorlage.

Die Software können Sie von der Website vagrantup.com herunterladen. Als Hostsystem für die virtuelle Maschine wird VirtualBox benötigt, und zwar mitsamt dem jeweils aktuellen Extension Pack. Ist alles installiert, muss eventuell das System neu gestartet werden. Danach kann durch Eingabe des Befehls

vagrant –v

überprüft werden, ob Vagrant funktioniert. Es sollte die Versionsnummer angezeigt werden. Wenn Sie Vagrant vorher noch nicht verwendet haben, müssen möglicherweise noch Plugins installiert werden. Entsprechende Warnungen werden dann beim Hochfahren der VM angezeigt („Plugin … not found“). Mit den Befehlen

vagrant plugin install vagrant-bindfs
vagrant plugin install vagrant-hostmanager
vagrant plugin install vagrant-triggers

installieren Sie fehlende Plugins.

Wichtig: Unter Windows müssen möglicherweise noch die beiden Systemvariablen %PATH% und %VAGRANT_HOME% so gesetzt werden, dass sie auf das bin-Verzeichnis der Vagrant-Installation zeigen.

OXVM bzw. BASE_VM für eigene Projekte verwenden

Das in “oxvm_eshop” verwendete Unterprojekt “base_vm” kann für Projekte eingesetzt werden, die eine andere als die automatisch installierte Shopversion und -Ausgabe und/oder für den Betrieb darüber hinaus gehender Software verwendet werden sollen; sie ist also für neue und bestehende Projekte geeignet.

Für ein solches Setup wird das Projekt “oxvm_eshop” nicht benötigt, es genügt “base_vm”. Das Wurzelverzeichnis des Projekts kann dabei so aussehen, dass Projektdateien und VM-Zubehör in getrennten Verzeichnissen verwaltet werden. Im Wurzelverzeichnis liegen dann noch die Dateien Vagrantfile und personal.yml. Dateien wie etwa index.php oder config.inc.php gehören nicht in dieses Verzeichnis, sondern in das Verzeichnis, das später in das Document Root der im Webserver konfigurierten Websites bereitgestellt wird. Um das Ganze zu veranschaulichen, hier noch ein Bild vom Projekt-Explorer, hier in Eclipse:

projektverzeichnis

Das Projekt wird hierbei mit den Inhalten des Verzeichnisses “base_vm” aufgebaut, das Verzeichnis selbst wird nicht übernommen. So wird “ansible” zum Verzeichnis, in dem Vagrant bzw. Ansible später die VM-Konfiguration vorfinden werden. Daneben muss mindestens das eigentliche Projekt platziert werden, bei mir heißt es – anders als in der OXVM – htdocs. Darin befindet sich dann auch der Shop und wenn gewünscht, weitere Pakete.

Die für Projekte verwendbare personal.yml kann dann zum Beispiel so aussehen:

---
# Override any variable from 'ansible/vars/oxideshop.yml' and 'base_vm/ansible/vars/default.yml'
vagrant_local:
  vm:
    memory: '2048'
    cpus: 2
    name: DemoVM
    hostname: ackisdemovm.dev
    aliases:
      - www.ackisdemovm.dev
    app_shared_folder:
      source: ./htdocs
      target: /var/www/htdocs
server:
  timezone: Europe/Berlin
  locale: de_DE.UTF-8
  apt_mirror: http://de.archive.ubuntu.com/ubuntu/
  unattended_upgrade: true
varnish:
  install: false
eshop:
  config:
    utf_mode: 1
  sdk:
    module_skeleton_generator:
      install: false
    module_certification_tools:
      install: false
apache:
  install: true
  docroot: /var/www/htdocs
  servername: ackisdemovm.dev
  packages:
    - php5-cli
    - php5-intl
    - php5-mcrypt
    - php5-mysql
    - php5-gd
    - php5-curl
  composer:
    prestissimo:
      install: true
mysql:
  install: true
  root_password: '123'
  database: oxid
  user: user
  password: password
  dump: 'sql/db.sql'
php:
  install: true
  packages:
    - php5-cli
    - php5-intl
    - php5-mcrypt
    - php5-mysql
    - php5-gd
    - php5-curl
  phpbrew:
    cache:
      repo: 'https://github.com/OXID-eSales/oxvm_assets'
      ref: 'phpbrew_builds'
      depth: 1
      update: true
  version: ~
  composer:
    installer_url: https://getcomposer.org/installer
    install: '0'
    github_token: ~
    prestissimo:
      install: false
  pecl_packages: ~
  zendguard:
    install: false

Als nennenswerte Abweichung gegenüber der zuvor gezeigten Datei sei hier die Angabe eines Datenbankdumps genannt, welches sich im Projekt unterhalb von sql/ befindet. Dieses Dump wird beim ersten Start der VM automatisch in die vorkonfigurierte Datenbank eingespielt — so kann das Projekt schnell aufgesetzt werden und erleichtert neu eingestiegenen Entwicklern den Start. Diese Datei kann in leicht modifizierter Form auch heruntergeladen werden. Verwenden erwünscht, Feedback ebenso. Die gezeigte Datei ist bei mir übrigens im alltäglichen Einsatz.

VM hochfahren

Wenn Sie bereit sind, öffnen Sie die Eingabeaufforderung (CMD, Bash oder Terminal) und wechseln Sie zum Projektverzeichnis, sodass Sie sich in dem Pfad befinden, in dem auch die Datei Vagrantfile liegt. Geben Sie nun ein:

vagrant up

Vagrant beginnt mit dem Generieren der VM, danach übernimmt der Provisioner Ansible das Installieren von Software innerhalb der VM. Dabei wird der Hostmanager verwendet, um die eingestellte IP-Adresse und den Hostnamen sowie die Aliasse in die hosts-Datei des Betriebssystems einzutragen. Gegebenenfalls muss die Rückfrage – Windows-Nutzer, nicht erschrecken! – des Betriebssystems bestätigt werden.

Wenn Sie die OXVM mit Unterprojekt (also nicht im “Projektmodus”) verwenden, wird im letzten Schritt der OXID eShop (CE) aus GitHub abgerufen und installiert.


Hat alles geklappt, wird in der abschließenden Zusammenfassung failed=“0″ angezeigt.

image

Im Webbrowser lässt sich nun die Adresse (http://Hostname) aufrufen, dann sollte auch schon der Shop erscheinen.

Wer sein Projekt um weitere Helfer anreichern möchte, dem sei die OXID Console empfohlen, die mit dem Kommando

oxid fix:states –all

neu hinzugekommene Module betriebsfähig macht.


Zend Guard Loader / Zend Optimizer – Was ist das? Wie wird er installiert?

Die Daseinsberechtigung des Zend Guard Loaders beziehungsweise des Zend Optimizers liegt darin, dass herkömmlicher PHP-Code im Klartext lesbar ist – jeder könnte ihn einfach verändern oder ungefragt weiter verbreiten.


Hersteller kostenpflichtiger PHP-basierter Software oder auch von Software, die im Rahmen von Support- und Wartungsverträgen nicht durch den Nutzer verändert werden soll, verschlüsseln diese gern. Dies betrifft im Oxid-Umfeld die Oxid-Shop-Ausgaben PE und EE (Professional und Enterprise Edition), je nachdem, ob das NDA unterzeichnet wurde. Die frei erhältliche und quelloffene Community Edition (CE) wird nicht verschlüsselt. Auch Module von Zahlungsanbietern werden gern verschlüsselt, um sie vor unsicheren Veränderungen zu schützen.

Was sind Zend Guard Loader und Zend Optimizer?

Zend Optimizer war bis PHP 5.2, Zend Guard Loader ist seit PHP 5.3 das PHP-Modul, das es erst ermöglicht, verschlüsselten PHP-Quellcode zu verwenden. Vereinfacht erklärt läuft das so ab: Ein Entwickler möchte seinen Code schützen. Er füttert den Zend Guard mit seinem Skript und erhält eine daraus neue generierte Datei. Diese Datei enthält alle logischen Fähigkeiten des Skripts. Möchte man diese Datei auf einem Server mit PHP verwenden, benötigt PHP das passende Gegenstück, um sie wieder lesen zu können: Optimizer oder Guard Loader. Fehlt diese Erweiterung auf dem Server, gibt die Website lediglich

Zend Optimizer is not installed.

oder

Zend Guard Loader is not installed

aus. Wenn überhaupt: denn sobald die so verschlüsselten Dateien per include aufgerufen werden, gibt der Server nur noch einen Statuscode zurück: HTTP 500 – interner Serverfehler. Wie Sie dann die Ursache finden können, habe ich in diesem kleinen Artikel eräutert.

Übrigens: PHP-Code muss für Zend Optimizer oder Zend Guard Loader verschlüsselt worden sein – es ist nicht möglich, beispielsweise Dateien für PHP5.2/Zend Optimizer unter PHP5.3/Zend Guard Loader auszuführen.

Wie kann ich Zend Guard Loader oder Zend Optimizer installieren?

Als erstes müssen Sie wissen, welche PHP-Version Sie überhaupt einsetzen. Dies können Sie unter Zuhilfenahme des Befehls phpinfo() herausfinden. Notieren Sie sich auch gleich den hinter Loaded Configuration File angegebenen Pfad der Datei php.ini – diese müssen Sie nämlich auch noch bearbeiten. Weiterlesen