MSP-Projektwoche 2010 - PHP5.3

Aus THM-Wiki
Wechseln zu: Navigation, Suche
Dokumentation
Arbeitstitel MSP-Projektwoche 2010 - PHP5.3
Kurs Methoden des Software-Entwicklungsprozesses
Semester WS 09/10
Teilnehmer Patrick Schneider, Fabian Becker und andere
Programmiersprache PHP

Wiki-Seite zur Dokumentation der Projektgruppe "PHP5.3/Phar" in der Projektwoche 2010

Organisatorisches

Die Projektleitung für das PHP5.3/Phar-Team übernehmen:

  • Patrick Schneider (Projektleiter)
  • Fabian Becker (stellv. Projektleiter)

Teamraum: I210

Kurs im eStudy:

Forum der Gruppe im eStudy:

xpWeb

  • Login mit eStudy-User und Tool-Passwort
    • Bug: Login nur möglich, wenn "persönliche Erinnerung" aktiviert ist.
    • Bug: Wenn man eingeloggt ist, kann man kein Projekt auswählen.

User Stories

Planning Poker

Vision

Was wollen wir mit unserem Projekt erreichen?

  • eStudy auf PHP 5.3 migrieren
    • Sicherheitsupdates
    • Namespaces
    • Closures (nützlich für callback-Funktionen)
    • (Limited) GOTO wurde eingeführt
    • Nested Exceptions möglich
    • Neuer mysql-Treiber
    • PHAR seit 5.3 verfügbar
  • Fremden Code als PHAR bereitstellen
    • Einfachere Updates von externen Bibliotheken
    • Bereinigung der Lizenz-Konflikte bei ohloh
  • eStudy als PHAR bereitstellen
    • Erleichterte Installation

Tasks

  • Wie migriert man von 5.2 auf 5.3? (estudy-04 ist bereits auf 5.3)
  • Wie migriert man im allgemeinen?
  • Logs aus Produktion analysieren (errors, warnings, deprecated, warnings)
    • Ist der Code E_STRICT? (lintcheck)
    • E_NOTICE/E_WARNING
  • Ausgabe mit tidy prüfen (W3C Konformität)
  • Gesamten Code mit PHP_Beautifier neu formatieren (sollte das Einhalten der Pre-Commit erleichtern)
    • Eclipse stylesheet anlegen und nutzen
  • PHAR prüfen -> was kann man damit machen?
  • Mit PHAR die externen Bibliotheken packen
    • PHP Bibliotheken
      • Doctrine
      • Zend Framework
      • PEAR (install.txt beinhaltet die benötigten PEAR Klassen)
      • GeSHi
      • TCPDF
    • Was mit JavaScript Bibliotheken?
      • TinyMCE
      • Prototype
      • script.acoul.us
  • Wenn möglich, "estudy.phar" erstellen
    • Wo kommen Konfigurationsdateien / Logs / Tempfiles hin?
    • stub & __HALT_COMPILER();

Allgemein:

  • ZendStudio benutzen, da dies Projekte automatisch als PHAR exportieren kann.

--> Für alle relevanten Tasks wurden Stories/Aufgaben im XPWeb erstellt.

Auto Code-Formatting für Zend Studio

Die Formatting-Templates welche im Artikel Programmiervorgaben zum Download angeboten werden, wurden in Zend Studio 7 geprüft.

Sie enthalten bereits alle einstellbaren Formatierungsregeln. Pre-Commit Fehler wie falsche White-Space Zeichen (Bsp.: falsche Einrückung von Klammern etc.) können schon beim Schreiben von Code mit dem Tastekürzel STRG+SHIFT+F behoben werden.

eStudy und PHP5.3.1

PHP 5.3.1

(Hier allgemeine PHP 5.3.1 Probleme angeben.)

Verfügbarkeit

Update auf PHP 5.3.1 in Ubuntu / Debian (eStudy-DEV): Link Hinweise dazu: Es ist besser, nach eintragen der sourcen in sources.list

aptitude update
aptitude dist-upgrade

zu machen, damit alle Pakete aus der eStudy-VM aktuell sind.

Bei Problemen mit php5-mcrypt und der Version von libltdl3 unter Ubuntu, kann man folgende Version von libltdl3 nutzen:

http://packages.debian.org/lenny/i386/libltdl3/download

Ansonsten gibt es Probleme, das debian-phpMyAdmin Paket zu installieren.

Ergänzungen der PHP.ini beim Umstieg von 5.2.x auf 5.3.x

[Phar]
; http://php.net/phar.readonly
phar.readonly = 0
; http://php.net/phar.require-hash
phar.require_hash = On
phar.cache_list =

Diese Optionen sind für PHP5.3 deprecated und sollten nicht mehr verwendet (deaktiviert) werden:

;; register_long_arrays = On 
;; magic_quotes_gpc = On

-> Besonders die magic quotes können Probleme machen!

memcache und xdebug sollten nach dem update automatisch geladen werden, daher sollten die .so Zeilen zum Einbinden der extension aus der php.ini entfernt werden.

Script zum Erzeugen von .phar-Dateien

<?php
   $phar = new Phar('<Pfad>+<Name der .phar-Datei>');
   $phar->buildFromDirectory("<Pfad des zu packenden Ordners>");
   $phar->compress(Phar::GZ);
   $phar->extractTo('<Ort zum entpacken>'); // extract all files
?>

Weiße Seite beim einbinden von phar Archiven

Um Abbrüche ohne Fehlermeldung (weiße Seiten im Browser, keine Log-Einträge) zu vermeiden, die durch das einbinden von phar-Archiven verursacht wurden, sollte man in der suhosin.ini den Simulationsmodus aktivieren

suhosin.simulation = On

oder die Zeile

extension=suhosin.so

auskommentieren (dann ist suhosin ganz deaktiviert). In der eStudy VM ist sie unter /etc/php5/conf.de/suhosin.ini zu finden.

eStudy

Hier Probleme von eStudy in Bezug auf PHP 5.3 angeben.

  • Aktuelle Trunk-Version in Verbindung mit Ubuntu 9.10: DB-Verbindung muß in '/home/estudydev/workspace/eStudy_svn/web/common/estudy_connect.inc.php' auf 127.0.0.1 umgestellt werden, "localhost" funktioniert anscheinend nicht. siehe hier

PreCommits Checks mit PHP-Beautifier

Nach Analyse von eStudy-Coding-Standard/Sniffs haben wir folgende Regeln für eine Umsetzung in PHP-Beautifier identifiziert und sind Estudy-Filter realisiert:

  • Klassendeklaration: öffnende Klammern "{" in gleicher Zeile
  • Klassendeklaration: Whitespace vor "{" erforderlich
  • keine 2 Whitespaces zwischen Tokens
  • Multiline Funktionsparameter
  • Leerzeilen bleiben zur besseren Strukturierung erhalten.

Bei den folgenden Regeln ist eine Umsetzung noch fraglich bzw. nicht möglich:

  • Zeilenlänge - nicht realisierbar, lässt sich über Filter nicht abprüfen
  • valide Funktionsnamen - nicht realisierbar, da im Framework keine unterschiedlichen Tokens für Funktionen oder Variablen existieren.
  • Valide Variablennamen - nicht realisierbar, s.o.
  • Problem (spricht gegen einen kompletten eStudy-Durchlauf): Das Parsen des folgenden Konstrukts:
$rGroupboard = forumQuery(
       								"SELECT groupid, 
       										boardid, 
       										accessmask 
       								 FROM forum_groupboard 
       								 WHERE boardid='$boardid' 
       								   AND groupid IN (".$groupids.")"
       								);

führt nach dem Filterdurchlauf zu:

$rGroupboard = forumQuery("SELECT groupid, 
       										boardid, 
       										accessmask 
       								 FROM forum_groupboard 
       								 WHERE boardid='$boardid' 
       								   AND groupid IN (".$groupids.")");

 

PHP-Code-Sniffer mit den Regeln von eStudy führt in diesem Fall zu einem: multi-line function call - Error

Das Problem konnte abschließend gelöst werden! Nun werden die Zeilen nicht mehr umgebrochen. Stattdessen wird alles in eine Zeile geschrieben.

$rGroupboard = forumQuery("SELECT groupid, boardid, accessmask FROM forum_groupboard WHERE boardid='$boardid' AND groupid IN (".$groupids.")");


Verwendung der Filter. 2 Filterdurchläufe sind dabei erforderlich:

mkdir Ausgabeordner
php_beautifier -t1 -l "Estudy()" -r "*.php" ./Ausgabeordner
cd Ausgabeordner
php_beautifier -t1 -l "EstudyStep2()" -r "*.php" .

-t1 setzt die Indent-Tabs, anstelle von Spaces

-r setzt rekursiven Durchlauf

-l setzt die jeweiligen Filter

=> Bekannte Errors und Warnings nach Filterdurchlauf, die abgeschaltet werden müssten: Zeilenlänge Beschränkung

Deprecated Meldungen nach Update auf PHP 5.3

Folgende Funktionsaufrüfe und Features sind nun deprecated und sollten wenn möglich ersetzt werden: PHP 5.3 deprecated features

Pear-Pakete

Manche Pear-Pakete liefern Objekte zurück die seit PHP 5.3 als Deprecated angesehen werden.

  • /usr/share/php/XML/Unserializer.php, line 974
  • /usr/share/php/HTML/QuickForm.php, line 1701
  • /usr/share/php/XML/Parser.php, line 616

Ersetzung von ereg, eregi, split, ereg_replace

Aufgrund der nicht vorhandenen Binärkompatibilität wurden alle auf ereg basierten Funktionen als deprecated markiert. Von nun an sollen nur noch die Perl-Regex kompatiblen Funktionen für Regex verarbeitende Funktionen benutzt werden.

Alle vorhandenen ereg-Aufrufe wurden ausgehend von den Log-Warnings auf preg-Aufrufe umgeschrieben.

Änderungen:

Referenz-Zuweisung bei new-Operator

Wird bei einem Aufruf des new-Operators versucht die Referenz des Objektes einer Variable mit =& zuzuweisen, wird eine E_DEPRECATED Warning mit der Meldung "Assigning the return value of new by reference" geworfen. In PHP 5.3.1 verweisen Variablen automatisch mit einer Referenz auf ihre Objekte. Der &-Operator ist obsolet.

Das Durchsuchen der eStudy-Sourcen zeigte, dass solche Zuweisungen im Modul Lernquiz benutzt wurden. Diese wurden entfernt.

Änderungen:

Warning Meldungen nach Update auf PHP 5.3

ezdb

Die Klasse ezdb verursacht folgende Warning:

09:56:21
mysql_connect() [<a href='function.mysql-connect'>function.mysql-connect</a>]: mysqlnd cannot connect to MySQL 4.1+ 
using old authentication
File /var/www/trunk/web/common/ez_sql.inc.php, line 76
Request URI: /externaltools/externaltools.php?changeToCourse=506

Dadruch resultieren weitere Warnings. Nach unseren Recherchen können diese behoben werden, indem die entsprechenden DB-Zugangsdaten neu erzeugt werden (Neue MySQL Version vorrausgesetzt) und somit die Mysql-Credentials neu erzeugt werden. (siehe hier)

Zitat:

The new mysqlnd library necessitates the use of MySQL 4.1's newer 41-byte password format. Continued use of the old 16-byte passwords will cause 
mysql_connect() and similar functions to emit the error, "mysqlnd cannot connect to MySQL 4.1+ using old authentication."

Die Datenbank, welche diesen Fehler verursacht ist die von den Externaltools.

Code-Fehler

Die Datei planner/classes/class.estudydb.inc.php enthielt einen kleinen Programmierfehler wobei in Zeile 116 das foreach-Konstrukt mit ungültigen Parametern aufgerufen werden konnte.

Diese Warning konnte durch das Prüfen des Parameters mittels is_array() behoben werden. (siehe Zeile 115)

eStudy und PHAR

Vorstellungen, Möglichkeiten, Umsetzung...

Deployment

Das aktuelle Deployment von eStudy geschieht durch upload/checkout aller Ressourcen auf die Produktionsplattform. Dies soll ins Zukunft vereinfacht werden, indem unter Zuhilfenahme des PHP 5.3 Features "PHAR" (PHP Archive) die komplette Plattform als ein Archiv ausgeliefert wird.

eStudyInstall.phar

Die Datei eStudyInstall.phar wird als einzige Datei benötigt um eine frische eStudy Installation auszuführen. Diese Datei kann nur über die Kommandozeile ausgeführt werden ("php eStudyInstall.phar"). Bei Ausführung entpackt diese Datei die benötigten Verzeichnisse und Archive um eStudy ausführen zu können.

 ./
 ./eStudy2Go
    |- ...
 ./libs
    |- Zend_1.5.6.phar
    |- Doctrine_1.9.phar
    |- ...
 ./lang
    |- de_DE.utf8.lang
    |- en_EN.utf8.lang
    |- ...
 ./web
    |- eStudy.phar

Das komplette eStudy liegt nun als Archiv im Document Root des Webservers und kann für die Installation des eStudy genutzt werden. Sämtliche Libraries wie das Zend-Framework oder Doctrine wurden als .phar ausgelagert und sind nicht über das Web erreichbar.

Laden von Dateien aus PHAR-Archiv

Um Klassen/Scripte aus einem PHAR Archiv zu Laden muss der require_once() Aufruf wie folgt aussehen:

require_once 'phar://<Archivname>.phar/Pfad/Klasse.php';

eStudy Libraries als PHAR

Einige Libraries wie Zend, PEAR und Doctrine wurden in PHAR-Archive gekapselt und in den Ordner /libs verschoben. Damit man immer weiß um welche Version es sich bei einer Bibliothek handelt sollte der Dateiname wie folgt aussehen:

Libname_Versionsnummer.phar
Bsp:
Zend_1.0.phar

Die Klasse RegisterPhar läd alle PHAR Dateien welche sich in dem libs Ordner befinden automatisch bei der Initialisierung von eStudy und schneidet die Versionsnummer des PHAR-Dateinamens ab. Das vereinfacht das Schreiben der includes.

Zend Framework als PHAR

TODO

Load Test

Ein einfacher Loadtest hat ergeben, daß es zur Zeit nicht sinnvoll ist, große PHAR-Files die nicht vollständig im eAcceleator-Cache gehalten werden können, produktiv einzusetzen.

Zur Installation kann ein eStudyInstall.phar verwendet werden, das eStudy auf Kommandozeilenebene installiert.

Der eAccelerator-Cache muß zum Einsatz der Libraries als PHARs so eingestellt werden, daß alle PHARs vollständig geladen und gehalten werden kann.

TODO (offene Aufgaben)

Nicht alle Aufgaben konnten innerhalb der Projektwoche erledigt werden.
Nachfolgend eine Liste, welche Punkte noch nachträglich vervollständigt werden müssen und wer für die einzelnen Punkte verantwortlich ist. Links zu Trac-Tickets sollten als Unterpunkte eingefügt werden, sofern Tickets existieren.

  • Fehler mit ZEND Einbindung (Alex, Nils, Bartosz)
    • Hier muß der Zend-Autoloader angepasst werden, bevor das Zend.phar gepackt wird! Ticket
  • Probleme mit PEAR Einbindung (Mariusz, Patrick)
  • Fehler mit Doctrine Einbindung prüfen (Mariusz, Bartosz)
    • Beim Überprüfen des Doctrine Ordners auf eventuell genutzte PEAR Packte, konnte keine Verwendung von PEAR Modulen festgstellt werden. Änderungen sind somit nicht notwendig.
  • Pretty-Printing (Mark, Christian)
    • Aktuell gibt es Probleme beim Ausführen des PHP_Beautifiers auf dem System von Herrn Thelen. Hier tritt das Problem auf, dass Dateien einfach abgeschnitten werden. Dieses Problem konnten wir allerdings auf unseren eigenen Systemen nicht rekonstruieren (hier läuft der Beatifier fehlerfrei).
  • Beispiel "eStudyInstall.phar" inclusive Dokumentation (Fabian)
  • Koordination, XPWeb (Patrick)

Bugfixing und Nacharbeiten sollten in den nächsten Wochen, spätestens aber bis zum 28.2.2010 abgeschlossen sein.

Abschluss

Überblick: Datei:AbschlussMSP-PHP53.pdf