Besser php programmieren - Von der Klasse über Unittests, Cruisecontrol, Selinum bis auf den Server
Upcoming SlideShare
Loading in...5
×
 

Besser php programmieren - Von der Klasse über Unittests, Cruisecontrol, Selinum bis auf den Server

on

  • 3,025 views

besser php programmieren

besser php programmieren
Document is not final!

Statistics

Views

Total Views
3,025
Views on SlideShare
2,979
Embed Views
46

Actions

Likes
0
Downloads
36
Comments
0

4 Embeds 46

http://www.slideshare.net 19
http://aufgehts.wordpress.com 19
http://guentherhaslbeck.de 7
http://webcache.googleusercontent.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Besser php programmieren - Von der Klasse über Unittests, Cruisecontrol, Selinum bis auf den Server Besser php programmieren - Von der Klasse über Unittests, Cruisecontrol, Selinum bis auf den Server Document Transcript

  • Professionelle Webentwicklung mit PHPInhaltsverzeichnisProfessionelle Webentwicklung mit PHP ..................................................................................................1Kleines Vorwort..........................................................................................................................................3 Voraussetzung........................................................................................................................................3Wie funktioniert ein Webrequest:...............................................................................................................4Entwicklung am Beispiel einer Datenbankklasse...................................................................................... 5 So nicht..................................................................................................................................................5 IDE........................................................................................................................................................ 5 Erste Klasse in php................................................................................................................................ 6 Der Quellcode der Klasse................................................................................................................. 6phpDoc....................................................................................................................................................... 9Codevervollständigung.............................................................................................................................11Unittesting................................................................................................................................................ 12 phpUnit................................................................................................................................................12Integrationstesting.................................................................................................................................... 13Exceptions................................................................................................................................................ 13Revision Control System......................................................................................................................... 15Vererbung in Klassen............................................................................................................................... 17Code Refactoring..................................................................................................................................... 20CodeConventions..................................................................................................................................... 20 Teamarbeit........................................................................................................................................... 21 Variable Naming Conventions ............................................................................................................21 Constant Naming Conventions ...........................................................................................................22 Method Naming Conventions ............................................................................................................ 22 Parameter Naming Conventions .........................................................................................................22 Struktur im Projekt.............................................................................................................................. 23Wie schnell ist mein php-Script............................................................................................................... 24Logfiles / Was passiert im Programm...................................................................................................... 25 Loglevel...............................................................................................................................................26 Vorgriff zu Nagios / Hobbit / xymon.............................................................................................. 27Templating................................................................................................................................................27i18n / Internationalisierung...................................................................................................................... 30 Translation........................................................................................................................................... 31Continous Integration 1............................................................................................................................31Kleiner Ausflug zurück zu Git................................................................................................................. 32SSH Keygen............................................................................................................................................. 34Continous Integration 2............................................................................................................................35 Unser Projekt hinzufügen....................................................................................................................36 Git Repository initialisieren............................................................................................................36 Verzeichnisproblem mit Git und CruiseControl............................................................................. 37Selenium...................................................................................................................................................46© Günther Haslbeck 2011 – V 0.2
  • Logfile + Systemüberwachung................................................................................................................ 49 Nagios..................................................................................................................................................49Komplette automatisch überwachte Entwicklung und Liveseite............................................................. 51MRTG...................................................................................................................................................... 51MemcacheD............................................................................................................................................. 51Geschwindigkeit der Seite erhöhen..........................................................................................................52 Geschwindigkeit der Elemente in der Seite messen............................................................................53PHP -Entwicklung auf Linux................................................................................................................... 53 Ubuntu basiert auf Debian-Linux........................................................................................................54 Die wichtigsten Dateien und Befehle für uns......................................................................................54 Wo sind wir (aktuelles Verzeichnis anzeigen)................................................................................ 54 Verzeichnisinhalt anzeigen............................................................................................................. 55 Ausgabe weiterverarbeiten............................................................................................................. 55 Verzeichnisse ................................................................................................................................. 55 Dateien suchen................................................................................................................................56 TAB ................................................................................................................................................56 Programme installieren...................................................................................................................57 Textdatei erstellen / bearbeiten mit vi.............................................................................................58 Das erste PHP-Script...................................................................................................................... 59 Apache und Co (neu) starten.......................................................................................................... 59 Hat unser Programm Fehler?.......................................................................................................... 59Logfiles auswerten................................................................................................................................... 59Welche Programme laufen und diese beenden.........................................................................................60PHP Entwicklung mit Frameworks..........................................................................................................61 Wieso................................................................................................................................................... 61 Code nur einmal verwenden................................................................................................................61Outsourcing.............................................................................................................................................. 65Sessions und Rechte.................................................................................................................................65Versionierung mit GIT............................................................................................................................. 66Netbeans zeigt php-docs nicht an.............................................................................................................66Error-Reporting........................................................................................................................................ 68Eigenen Errorhandler............................................................................................................................... 69Undefinierte Variablen in PHP anzeigen..................................................................................................69Gitweb – neues Projekt erstellen..............................................................................................................76Gitweb installieren in ubuntu.................................................................................................................. 76Branching in Git.......................................................................................................................................85© Günther Haslbeck 2011 – V 0.2
  • Kleines VorwortDas folgende Dokument wurde erstellt um eine klare Struktur in den Entwicklungsprozess zu bringen,insbesondere in php.VoraussetzungDiese Anleitung setzt voraus, dass php 5.3 oder höher, ein Apache Webserver installiert ist, eine lokaleMySql-Instanz sowie java und phpmyamin sowie git unter Ubuntu 10/11apt-get updateapt-get install git-coreapt-get install apache2apt-get install mysql-serverapt-get install phpmyadminJava: java.sun.com:SDK:JDK 6 .. i586.binrunterladen,chmod u+x jdk-6u26-linux-i586.bin;./jdk-6u26-linux-i586.binDannsudo /etc/init.d/mysql restartsudo /etc/init.d/apache2 restartunter http://localhost/ zeigt der Apache den Inhalt aus /var/www/unter http://localhost/phpmyadmin/ zeigt phpmyadmin den Inhalt der MySQL Datenbank© Günther Haslbeck 2011 – V 0.2
  • Erst einmal ein kleiner Ausflug:Wie funktioniert ein Webrequest:Das Ausführen des php-Scripts darf also nicht länger als ca 1 Sek (besser 0,7) dauern sonst dauert dasladen der Graphiken zu lange um die 1,5 Sekunden zu schaffen.(obiges Beispiel != mod_php)© Günther Haslbeck 2011 – V 0.2
  • Zurück zu phpEntwicklung am Beispiel einer DatenbankklasseSo nichtLeider wird Code wie der folgende durch jedes neue php-Programm immer wieder kopiert weil derCode nicht wiederverwendbar ist. Er ist Teil des eigentlichen Programms.Das führt unter anderem dazu, das a) DB-Passwörter überall stehen und b) diese sich nicht mehr ändernlassen weil keiner weiß wo diese stehen.Und natürlich hauptsächlich: Führt es zu hunderten Kopien immer gleichen Codes mit immer dengleichen Fehlern.Und ganz nebenbei: Wir verwenden NIE die() in einem ProgrammIDEAls Entwicklungsumgebung wird im folgenden Netbeans verwendet.Genau so könnte natürlich auch Eclipse verwendet werden© Günther Haslbeck 2011 – V 0.2
  • Für beide IDEs (integrated development environment) muss evtl in Linux die JAVA_HOME gesetztsein. Java runterladen und das java-Hauptverzeichnis setzen:export JAVA_HOME=/home/user/java/jdk1.6.0_24;export PATH=$JAVA_HOME/bin:$PATHErste Klasse in phpWir starten Netbeans, erstellen ein neues PHP Projekt.Wir erstellen ein Unterverzeichnis und nennen es classes.Dort legen wir eine Daten namens Database.php abDiese sieht zB so ausDer Quellcode der Klasseclass Database { //put your code here private $connection; private $servername = "localhost"; private $mysqluser = "root"; private $mysqlpasswd = "passwd"; /** * connect * * connect to database * * @param string $databasename null or ro for readonly * @param string $mode null or ro for readonly© Günther Haslbeck 2011 – V 0.2
  • */ public function connect($databasename = null, $mode = null) { //mode is for readonly - later on if ($this->connection) { //still connected! } else { $this->connection = mysql_connect($this->servername, $this->mysqluser, $this->mysqlpasswd); } if (!$this->connection) { echo “db-connect-error”; } if ($databasename) { $db_select = mysql_select_db($databasename); if ($db_select) { //echo database $databasename selected; } else { echo $databasename . " could not be selected" . mysql_error(); } } } /** * disconnect * * disconnect fom database * */ public function disconnect() { mysql_close($this->connection); } /** * query * * querycall to database * * @param string $query the querytext */ public function query($query) { $result = mysql_query($query); if (!$result) { echo “cant query”; } return $result; }}Eingerückt wird der Code übrigens mit TAB, nicht mit Leerzeichen.Man sieht, dass die Passwörter usw als private deklariert sind, die Methoden wie Connect als public.© Günther Haslbeck 2011 – V 0.2
  • Damit sind nur die Methoden der Klasse nach außen sichtbar.Passwörter usw muss und kann keiner sehen und keiner ändern.Generell sollten Membervariablen (also Variablen die nur die Klasse verwendet) nicht sichtbar seinsondern – wenn überhaupt nur per Getter/Setter also zB getServername(); odersetServername(“newServer”); modifizierbar sein.Die Klasse merkt sich auch die $connection intern, wir brauchen uns also nicht darum zu kümmern.Halte Klassen klein: In jeder Klasse nur den exakten Usecase abbilden.Beachte auch: Bei jedem Aufruf muss das komplette Script neu compiliert werden – viel drin, vielCompilezeit!Unser Programm das die Klasse benutzt sieht dann so aus:bei folgender DatenbankstrukturKeine Passwörter mehr, kein doppelter Code.Bei Netbeans oder Eclipse erkennt die IDE nun auch welche Methoden es gibt und zeigt Informationenan wenn man nur zB $db eingibt. Welche Methoden es gibt, welche Parameter diese haben usw(späterdazu mehr).Die Info erhält Netbeans vom Kommentar über der Methode (phpDoc-Kommentar):© Günther Haslbeck 2011 – V 0.2
  • Damit weiß die IDE was wie gemeint ist. Zudem kann man daraus einfach Doku generieren.Dazu müssen wir erst einmal phpdoc installieren:phpDocapt-cache search php-docapt-get install php-docund evtl PhpDocumentator apt-get install php-pear pear config-set data_dir /var/www/ pear install --alldeps PhpDocumentor mkdir /var/www/PhpDocumentor-output chown www-data /var/www/PhpDocumentor-outputunter http://localhost/PhpDocumentor/ findet sich nun eine Config-Oberfläche© Günther Haslbeck 2011 – V 0.2
  • Danach generieren wir die Doku zu dieser Klasse in unser Webserver-Verzeichnis:phpdoc -d Quellverzeichnis -t Zielverzeichnisphpdoc -d /home/user/NetBeansProjects/PhpProject1 -t /var/www/phpdocuCode wird somit wiederverwendbar und von jedem verstanden.Mehr:http://manual.phpdoc.org/HTMLSmartyConverter/HandS/phpDocumentor/tutorial_phpDocumentor.quickstart.pkg.htmlZu beachten:für die einzelnen Projekte ist in der Doku das Tag package zu verwenden da phpDoc sonst alles in eineEbene wirft© Günther Haslbeck 2011 – V 0.2
  • CodevervollständigungWie schon erwähnt erkennt Netbeans/Eclipse welche Klassen vorhanden sind.Erstellen wir eine Klassevervollständigt die IDE den Code und hilft schnell und einfach Software zu erstellen:(Anzeigen auch durch STRG+Shift möglich, STRG + Klick springt zur Deklaration wenn im Projekt© Günther Haslbeck 2011 – V 0.2
  • die entsprechenden Klassenpfade eingebunden sind , STRG + B entspricht STRG + Klick– AlleKeyboardshortcuts unterhttp://usersguide.netbeans.org/shortcuts.pdf )UnittestingAber was, wenn jeder darin rumspielt? Funktioniert dann noch alles?1. Sollten diese Basisklassen von keinem verändert werden und wenn doch sollten generell alle Klassenper2. Unit-Tests getestet werden.Wir installieren phpunit:apt-get install phpunitphpUnitruft eine Klasse auf und vergleicht das Ergebnis mit einem festgelegten Ergebnis.In unserem Falle testen wir indirekt gleich mit ob die Datenbank und der Inhalt ok sind:© Günther Haslbeck 2011 – V 0.2
  • Das Script baut eine Datenbankverbindung über unsere Klasse auf, sucht einen User und vergleicht dasErgebnis (assertSame) mit einem festgelegten Wert.Dies kann nun alle x Minuten gemacht werden. Solange das Ergebnis stimmt ist der Test erfolgreichund unser Code macht immer genau das was man von ihm erwartet.> phpunit DatabaseTest.phpPHPUnit 3.4.13 by Sebastian Bergmann.OK (1 test, 1 assertion)Also alles ok.IntegrationstestingWas hier vorher als Unittest dargestellt wurde ist eigentlich ein Integrationstest.Der Unterschied besteht darin, dass ein Unit-Test nur ganz kleine Schritte (Methoden usw) testet, einIntegrationstest aber aus mehreren Unittests bzw kompletten Programmabläufen bestehtExceptionsNun kann zB während der DB-Verbindung ein Problem auftreten. Dies fangen wir auf gar keinen Fallmit die() ab da die() das Programm sofort beendet, sondern wir werfen eine Exception.Da php als Default nur den Typ Exception kennt, wir aber ein bisschen genauer unterscheiden wollenerstellen wir unsere eigenen Exception zB am besten in der Klasse selbst© Günther Haslbeck 2011 – V 0.2
  • Tritt ein Fehler auf, werfen wir eine DatabaseException nach „oben“:und fangen diese in unserem Programm außen wieder:© Günther Haslbeck 2011 – V 0.2
  • Somit kann auf jeder Problem angemessen reagiert werden und nicht einfach das Programmabgebrochen.Wir haben nun obigen Code geändert. Durch einen erneuten Test durch phpUnit können wir sicher sein,dass noch alles tut.Aber was haben wir geändert?Revision Control SystemIm weiteren wird GIT verwendet. Git ist wie CVS oder SVN eine Freie Software zurVersionsverwaltung von Dateien und Verzeichnissen.Im Gegensatz zu CVS und dessen Nachfolger SVN (SubVersioN) setzt Git allerdings keinen zentralenServer voraus.© Günther Haslbeck 2011 – V 0.2
  • Um also zu sehen was wir geändert haben, erstellen wir ein git Repository im Code-Verzeichnis> git init> git add PhpProject1> git commit -a -m "first strike"Git erstellt nun ein .git Verzeichnis und merkt sich den aktuellen Stand dort.„first strike“ ist dabei ein frei festzulegender Kommentar der aussagekräftig gesetzt werden sollte.Wir verändern nun eine Datei (fügen eine Kommentarzeile ein) und speichern und committen erneut.(der Parameter -m ist um den Kommentar direkt in der Kommandozeile einzugeben)> git commit -a -m "added comment"und sehen: 1 files changed, 1 insertions(+)© Günther Haslbeck 2011 – V 0.2
  • Was ist passiert:> git log PhpProject1/index.phpund wir sehenund was wurde geändert?Wir lassen uns den Unterschied zw 2 Commits anzeigen:> git diff --color 652189eaa529e44.... 069627823fc52a8b44937....Aha, eine Kommentarzeile wurde eingefügt.Tipp: git als Cron laufen lassen und Code einfach alle 60 min automatisch einchecken.Vererbung in KlassenKlassen sollten aber nicht verändert werden sondern abgeleitet/vererbt:Dabei “erbt” die neue Klasse die Eigenschaften (Methoden) der alten Klasse und wird durch diezusätzlichen Methoden erweitert.Das kann zB auch dafür genutzt werden aus einer “Basis”Klasse “Fahrzeug” jeweils ein “Auto” einen“Lieferwagen” zu erzeugen. Beide basieren damit auf einer Klasse die die Grundeigenschaften abbildet(Motor, 4 Reifen) aber zusätzlich die Klasse um eine Ladefläche (Lieferwagen) oder ein Schiebedach(Auto) erweitert.© Günther Haslbeck 2011 – V 0.2
  • © Günther Haslbeck 2011 – V 0.2
  • Weitere Möglichkeiten der Vererbung in PHP 5© Günther Haslbeck 2011 – V 0.2
  • Code RefactoringOft merkt man während des entwickeln des Codes dass man gerne die eine oder andere Klasse oderMethode umbenennen möchte. Auch hier helfen die IDEs und können alle Stellen an den der Codeverwendet wird in allen Files umbenennen. Diese Funktion findet sich in Eclipse und Netbeans unter„Rechte Maustaste → Refactoring“CodeConventionsMethoden wie bla() oder Variablen wie$i = “vorname” sind schlecht zu lesen und teilweise irreführend zB wenn $i wiederverwendet wird$i = 17;Was ist also $i?Deswegen Variablen eindeutig und ausschreiben und in camelCase Form.Um den Entwicklungsstil überall gleich zu halten wurden in Java CodeConventions erstellt und diesehaben sich mittlerweile fast überall durchgesetzt:http://www.oracle.com/technetwork/java/codeconvtoc-136057.htmlAlterntive: PEAR PHP Conventionshttp://pear.php.net/manual/en/standards.funcdef.php© Günther Haslbeck 2011 – V 0.2
  • TeamarbeitIst man alleine ist es wichtig Codeconventions einzuhalten denn es sind in jedem Projekt Zeiten indenen man nicht daran arbeitet. Trotzdem möchte man später auch wieder schnell weitermachen undgleich verstehen was man damals meinte.Im Team ist es sehr wichtig Absprachen einzuhalten denn jeder im Team muss jederzeit verstehen wasdas Programm macht und wieso was wie geschrieben wurde.Einrücken des CodesSchon beim einrücken des Codes sollte man sich vorher absprechen und dann auch einhalten:Rückt man im Team per Leerzeichen ein oder per Tabulator. Und wenn per Tabulator ist darauf zuachten keine Texteditoren zu verwenden die beim Speichern die Tabs in Leerzeichen umwandeln.So bleibt der Code gut eingerückt und lesebar.Tools wie Netbeans oder Eclipse können Code auch selbständig einrücken:Variable Naming ConventionsChoose meaningful names that describe what the variable is being used for. Avoid generic names likenumber or temp whose purpose is unclear.Compose variable names using mixed case letters starting with a lower case letter. For example, usesalesOrder rather than SalesOrder or sales_order.Use plural names for arrays. For example, use testScores instead of testScore.Exception: for loop counter variables are often named simply i, j, or k, and declared local to the forloop whenever possible.© Günther Haslbeck 2011 – V 0.2
  • Constant Naming Conventions * Use ALL_UPPER_CASE for your named constants, separating words with the underscorecharacter. For example, use TAX_RATE rather than taxRate or TAXRATE. * Avoid using magic numbers in the code. Magic numbers are actual numbers like 27 that appear inthe code that require the reader to figure out what 27 is being used for. Consider using named constantsfor any number other than 0 and 1.Method Naming ConventionsTry to come up with meaningful method names that succinctly describe the purpose of the method,making your code self-documenting and reducing the need for additional comments.Compose method names using mixed case letters, beginning with a lower case letter and starting eachsubsequent word with an upper case letter.Begin method names with a strong action verb (for example, deposit). If the verb is not descriptiveenough by itself, include a noun (for example, addInterest). Add adjectives if necessary to clarify thenoun (for example, convertToEuroDollars).Use the prefixes get and set for getter and setter methods. Getter methods merely return the value of ainstance variable; setter methods change the value of a instance variable. For example, use the methodnames getBalance and setBalance to access or change the instance variable balance.If the method returns a boolean value, use is or has as the prefix for the method name. For example, useisOverdrawn or hasCreditLeft for methods that return true or false values. Avoid the use of the wordnot in the boolean method name, use the ! operator instead.For example, use !isOverdrawn instead of isNotOverdrawn.Parameter Naming ConventionsWith formal parameter names, follow the same naming conventions as with variables, i.e. use mixedcase, begin with a lower case letter, and begin each subsequent word with an upper-case letterConsider using the prefix a or an with parameter names. This helps make the parameter distinguishablefrom local and instance variables.Occasionally, with very general purpose methods, the names chosen may be rather generic (forexample, aNumber). However, most of the time the parameter names should succinctly describe thetype of value being passed into the method.© Günther Haslbeck 2011 – V 0.2
  • Struktur im ProjektNicht nur über die Methoden- und Variblennamen sollte man sich Gedanken machen, auch über dieStruktur des Codes selbst.Je nach Projekt sollte die Struktur vorher festgelegt und dann auch über Projekte hinweg eingehaltenwerden.© Günther Haslbeck 2011 – V 0.2
  • Wie schnell ist mein php-ScriptMillisekunden messen. Ist Laufzeit > 1 Sek (=0,001) dann warne© Günther Haslbeck 2011 – V 0.2
  • Logfiles / Was passiert im ProgrammVorweg: Um zu sehen wieso ein php-Programm gar nichts macht greifen wir auf die Log-Ausgabenvon Apache zurück> tail -f /var/log/apache2/error.log[Sun Jun 12 11:33:01 2011] [error] [client 127.0.0.1] PHP Warning: fopen(/var/lo...Aber:Während des normalen Betriebs möchte man ab und an, dass ein Programm Logausgaben macht.Um das zu ermöglichen sollte eine Logklasse nicht fehlen.Diese erstellt dann ein Logfile mit Datum.Vorteil: Morgen wir automatisch ein neues File erstellt.Der Name des Logfiles wir aus __FILE__ ermittelt. Das ist der komplette Pfad+Scriptname.> cat /var/log/20110613-PhpProject1.log13.06.2011 14:48:49 WARN ups, to slow: 0.0004558563232421913.06.2011 14:50:11 WARN ups, to slow: 0.003976821899414113.06.2011 14:50:11 WARN ups, to slow: 0.0064089298248291Damit sehen wir also wenn ein Script zu lange gebraucht hat.© Günther Haslbeck 2011 – V 0.2
  • Es gibt übrigends noch mehr Konstanten:echo __LINE__."<br>";hilft zB beim DebuggingLoglevelWir erweitern die Logmethode um einen Loglevel:Mit $currentloglevel wird definiert welcher Loglevel geschrieben werden soll.Man kann also im Programm überall DEBUG Log-Ausgaben einbauen. Diese werden aber nichtgeschrieben.Geschrieben werden nur Meldungen die > Debug sind. Ändert man die Variable auf dem Livesystemauf 1 ab wird auch alles was als Debug eingetragen ist geschrieben. So lassen sich im Livebetriebschnell Logging ein und auschalten.Logfiles sind wichtig um zu erkennen was im Programm passiert ist. ZB sollten alle kritischenVorgänge auf INFO geloggt werden.WARN, ERROR und FATAL sollten zB geschrieben werden von Exceptions.© Günther Haslbeck 2011 – V 0.2
  • Vorgriff zu Nagios / Hobbit / xymonNagios wird später kurz angeschrieben. Nagios wertet Logfiles aus. Dort können Schwellen proLogfiles + Loglevel festgelegt werden.Tritt zB in der Stunde in einem Logfile 1 FATAL oder 10 ERROR order 100 WARN auf, so schaltetNagios die Überwachung auf rot und versendet eine Email an den Admin.Fällt also zB die Datenbank aus und werden Verbindungsexceptions als FATAL geschrieben geht sofortbeim Admin eine Email ein.TemplatingCode zu mischen mit HTML in php widerspricht dem MVC Pattern. (Dazu später mehr)Kurz: HTML nicht mit Code mischen.Generell gilt: Erstelle kein HTML im Code wie zBecho “<b>Hallo Welt</b>”;Nutze eine Templateengine wie zB smarty (oder twig).Weiterer Vorteil: Die Entwickler und Webdesigner-Tätigkeit lässt trennen (Personal / Outsourcing!)Im Template gibt man Platzhalter an, im Programm definiert man dann den Inhalt für diese Platzhalterlädt und gibt dann das Template aus.So können Seiten oder Teile der Seiten immer wieder verwendet werden.© Günther Haslbeck 2011 – V 0.2
  • Und das Template:die Ausgaben sieht dann so ausHallo WeltDas hier ist die erste TemplateSeiteTemplating macht aber nur Sinn, wenn wir Teile der Seite wie zB Header und Footer auslagern.Das geht so:© Günther Haslbeck 2011 – V 0.2
  • und in template/page_header.tpl steht© Günther Haslbeck 2011 – V 0.2
  • Seite aufrufen (hier mal der HTML-Code der erzeugt wird)i18n / InternationalisierungInternationalisierung (engl. internationalization) wird gerne mit I18N abgekürzt (im englischen Wortbefinden sich 18 Buchstaben zwischen I und N).Man möchte eine Seite in mehreren Sprachen ausgeben.Das beeinflusst den Text den man an das Template schickt, das Template (falls es Text oder Bilder mitText enthält) und natürlich auch Felder wie Datum usw (24.12.2011 vs 12/24/11) usw.Da Smarty mit Internationalisierung nicht ohne weiteres umgehen kann hier obiges Beispiel nochmalmit TWIG:Installation:1. PEAR installieren ( > apt-get install php-pear )2. > pear channel-discover pear.twig-project.org 3. > pear install twig/Twig 4. > apt-get install php-gettextwir erstellen ein Template unter /var/www/PhpProject1/twig/index.html© Günther Haslbeck 2011 – V 0.2
  • und den entsprechenden php-Code:Fertig. Seite wird ausgegeben.Translation(siehe Twig I18n Implementation / Translation – How it works weiter hinten in diesem Dokument)Continous Integration 1Unit-Tests machen keinen Sinn wenn diese nicht dauernd ausgeführt werdenTools dafür sind CruiseControl und dessen PHPPlugin phpUnderControl oder auch Hudson/JenkinsDiese Tools checken dauernd den Stand des Quellcodes aus Git aus, compilieren diesen und starten dieUnit-Tests.Hat jemand einen Fehler eingecheckt so wird dies hier sichtbar.© Günther Haslbeck 2011 – V 0.2
  • Kleiner Ausflug zurück zu GitLinks (braun) unser Rechner = Client, rechts (schwarz) neuer (leerer) GIT-ServerAuf dem Server erstellen wir ein Verzeichnis und legen eine leeres Repository anDas linke Fenster (unser Rechner) fügt ein Repository names Origin in seine config hinzu und pushtdann den Master (Trunk – also den Hauptzweig) in das Remote-Repo.Jetzt wollen wir mal aufm Server das Repo lokal auschecken.Das machen wir per clone:alles da.Wir ändern hier ein File und pushen wieder zurück (lokal)© Günther Haslbeck 2011 – V 0.2
  • und holen es dann auch wieder auf unseren Rechner/Client:"git pull" does a "git fetch" followed by a "git merge".So lässt sich also Code per Git hin und her kopieren.Mehr unter http://www.jedi.be/blog/2009/05/06/8-ways-to-share-your-git-repository/Überblick:© Günther Haslbeck 2011 – V 0.2
  • SSH KeygenDa wir das Repo per SSH hin und her kopieren müssen wir jedes mal ein Passwort eingeben.Das kann man sich sparen in dem man auf dem Rechner von dem man sich auf einen anderenVerbinden will einen public Key erzeugt.ssh-keygen -t dsaKein Passwort eingeben wenn danach gefragt wird!Den Inhalt des erzeugten Files (/home/user/.ssh/id_dsa.pub) fügt man auf dem Zielrechner in dasFile /home/usermitdemannsicheinloggt/.ssh/authorized_keys hinzu.Es darf kein Zeilenumbruch in der Zeile sein die eingefügt wird.Bei einem erneuten SSH Login wird nicht mehr nach dem Passwort gefragt und deshalb auch nichtmehr bei Git.© Günther Haslbeck 2011 – V 0.2
  • Continous Integration 2Wir installieren CruiseControl und phpUnderControl(weitere quellen: http://pear.phpundercontrol.org/)pear channel-discover components.ez.nopear channel-discover pear.phpundercontrol.orgpear install --alldeps phpuc/phpUnderControl-betaapt-get install php5-xdebugpear upgrade --force pearcd /tmpwget http://freefr.dl.sourceforge.net/sourceforge/cruisecontrol/cruisecontrol-bin-2.8.3.zipunzip cruisecontrol-bin-2.8.3.zip -d /optcd /optln -s cruisecontrol-bin-2.8.3 cruisecontrolphpuc install /opt/cruisecontrolwir müssen auch noch runterladen pear channel-discover pear.phpmd.org pear channel-discover pear.pdepend.org pear install --alldeps phpmd/PHP_PMD pear channel-discover pear.phpunit.de pear install phpunit/phpcpdund startencd /opt/cruisecontrolexport JAVA_HOME=/home/user/java/jdk1.6.0_24;export PATH=$JAVA_HOME/bin:$PATH./cruisecontrol.shIm Browser sehen wir nun unter http://localhost:8080/cruisecontrol/ die Oberfläche von CC:© Günther Haslbeck 2011 – V 0.2
  • Beenden geht übrigens mit : kill `cat /opt/cruisecontrol/cc.pid`Unser Projekt hinzufügenwir erstellen in /opt/cruisecontrol/projects ein neues Projekt> mkdir PhpProject1> mkdir -p PhpProject1/{source,build}> mkdir -p PhpProject1/build/{api,logs,log,coverage}Dort legen wir ein build.xml ab (siehe später)Dort geben wir den Namen des Projekt an<project name="PhpProject1" default="build" basedir=".">und legen in den ensprechenden Verzeichnissen die Sourcen abZudem mussdie vi /opt/cruisecontrol/config.xmlangepasst werden so dass das Projekt gebaut wirdGit Repository initialisierenDamit das Git-Plugin auch weiß von wo es pullen soll, muss der source-Ordner einmal mit gitinitialisiert werden:cd PhpProject1/source/git clone example.com/projectrepository.git .Oder von lokal:dazu muss vorher ein lokales repository angelegt werden> mkdir /home/gitrepo> cd /home/gitrepo/© Günther Haslbeck 2011 – V 0.2
  • > git - - bare initInitialized empty Git repository in /home/gitrepo/> sudo git push /home/gitrepo/ masterCounting objects: 31, done.Delta compression using up to 4 threads.Compressing objects: 100% (22/22), done.Writing objects: 100% (31/31), 4.04 KiB, done.Total 31 (delta 6), reused 0 (delta 0)Unpacking objects: 100% (31/31), done.To /home/gitrepo/ * [new branch] master -> master> cd PhpProject1/source/> git clone /home/gitrepo/Initialized empty Git repository in /opt/cruisecontrol-bin-2.8.3/projects/PhpProject1/source/gitrepo/.git/Verzeichnisproblem mit Git und CruiseControlDas „git clone“ muss so plaziert werden, dass die config.xml von CruiseControl und der Bereich derden Checkout von Git definiert genau auf das .git Verzeichnis trifft.Hat man (wie ich) nicht ein Projekt sondern den Ordner wo alle Projekte sind global in git, so klapptdas nicht.Deswegen habe ich das „git clone“ im Projects-Ordner ausgeführt. Es entsteht ein Unterverzeichnisnamens repo und darin sind dann die Projekte incl dem .git Verzeichnis.Mein Config.xml zeigt dann aufund von dort habe ich dann perln -s gitrepo/PhpProject1 .Verlinkt und dann darin das „build.xml“ abgelegt und die Verzeichnisse (von oben) angelegt© Günther Haslbeck 2011 – V 0.2
  • Damit kann ich nun in meinem Homeornder eine Datei ändern, ein Git commiten,mit git push /home/gitrepo/ master in das lokale repository pushen und von da holt es dannCruisecontrol ab da es über die config.xml in gitrepo guckt, dort im gitfile steht, das es neues aus/home/gitrepo/ holen soll.Das Ergebnis sieht dann so aus:© Günther Haslbeck 2011 – V 0.2
  • Evtl muss auch Testscript angepasst und woanders abgelegt werdenJetzt cruisecontrol erneut starten:Projekt erscheint unterhttp://localhost:8080/cruisecontrol/http://techportal.ibuildings.com/2009/03/03/getting-started-with-phpundercontrol/phpUnderControl benutzt nunPhpDocumentor (zum erzeugen der Doku)PHPUnit (um die Unittests auszuführen)PhpCodeSniffer (detects violations of a defined set of coding standards)PhpMessDetector (checks for: Possible bugs, Suboptimal code, Overcomplicated expressions, Unusedparameters, methods, properties)phpcpd (copy paste detector )um den Code zu prüfen.http://skaverat.net/howto/installation-und-einrichtung-von-phpundercontrol-auf-linux.htmlHier die beiden Files:/opt/cruisecontrol/projects/PhpProject1/build.xml<project name="PhpProject1" default="build" basedir=".">© Günther Haslbeck 2011 – V 0.2
  • <property name="builddir" value="${basedir}/build" /> <target name="prepare" depends="clean,init" /> <target name="init"> <mkdir dir="${builddir}" /> <mkdir dir="${builddir}/api" /> <mkdir dir="${builddir}/log" /> <mkdir dir="${builddir}/coverage" /> <mkdir dir="${builddir}/phpcb" /> </target> <!-- Removes all temporary build artifacts --> <target name="clean"> <delete dir="${builddir}" /> </target> <target name="checkout"> <exec dir="${basedir}/source" executable="git"> <arg line="pull"> </arg> </exec> </target> <target name="phpunit"> <exec executable="phpunit" dir="${basedir}/source" failonerror="on"> <arg line="--log-junit ${builddir}/log/junit.xml --coverage-clover ${builddir}/log/phpunit.coverage.xml--coverage-html ${builddir}/coverage phpucAllTests ${basedir}/testsuite/all_tests.php" /> </exec> </target><target name="pdepend"> <exec dir="${basedir}" executable="pdepend" failonerror="false"> <arg line="--jdepend-xml=${basedir}/build/logs/jdepend.xml ."/> </exec></target> <target name="phpcpd" depends="init"> <exec executable="phpcpd" failonerror="false"> <arg line="--log-pmd ${builddir}/log/pmd-cpd.xml ${basedir}/source " /> </exec> </target>© Günther Haslbeck 2011 – V 0.2
  • <target name="php-documentor2" depends="init"> <exec executable="phpdoc" dir="${basedir}/source"> <arg line=" -o HTML:Smarty:default -t ${basedir}/build/api -ct type -ue on -tb/usr/share/php/data/phpUnderControl/data/phpdoc/ -d ${basedir}/source "/> </exec> </target> <target name="php-documentor"> <exec executable="phpdoc" dir="${basedir}/source"> <arg line=" -t ${builddir}/api -o HTML:Smarty:default . -ct type -ue on --filename **/*.php"/> </exec> </target> <target name="php-codesniffer"> <exec executable="phpcs" dir="${basedir}/source" output="${builddir}/logs/checkstyle.xml"error="/tmp/checkstyle.error.log"> <arg line="--report=checkstyle --standard=PEAR ."/> </exec> </target> <target name="phpmd"> <exec executable="phpmd" dir="${basedir}/source"> <arg line=". xml codesize,unusedcode,naming --reportfile ${basedir}/build/logs/pmd.xml"/> </exec> </target> <target name="build" depends="checkout,php-documentor,php-codesniffer,phpmd,phpcpd,phpunit,pdepend"/></project>UND-----------------/opt/cruisecontrol/config.xml<cruisecontrol><project name="PhpProject1" buildafterfailed="false"><modificationset><alwaysbuild/></modificationset><!-- Git Bootstrapping auf den source-ordner --><bootstrappers><gitbootstrapper localWorkingCopy="projects/${project.name}/source" /></bootstrappers>© Günther Haslbeck 2011 – V 0.2
  • <schedule interval="60"> <ant anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml"/> </schedule> <listeners> <currentbuildstatuslistener file="logs/${project.name}/status.txt"/> </listeners> <log dir="logs/${project.name}"> <merge dir="projects/${project.name}/build/logs/"/> </log><publishers><artifactspublisher dir="projects/${project.name}/build/api" dest="artifacts/${project.name}" subdirectory="api"/><artifactspublisher dir="projects/${project.name}/build/coverage" dest="artifacts/${project.name}" subdirectory="coverage"/><execute command="phpuc graph logs/${project.name} artifacts/${project.name}"/></publishers></project></cruisecontrol>Anfangs gabs Probleme mit phpdoc und den Output-Convertern.Welche installier sind finden man unter:/usr/share/php/PhpDocumentor/phpDocumentor/Converters/HTML$ dirframes SmartySo siehts dann unter anderem aus:© Günther Haslbeck 2011 – V 0.2
  • Man sieht zB auch die Testabdeckung der Unittestsund welche Codezeilen getestet wurden© Günther Haslbeck 2011 – V 0.2
  • erweitern wir das /opt/subversion/config.xml um unsere Emailadresse so erhalten wir eine Emailwir ergänzen nun das build.xml im Projekt um alles zu zippen:© Günther Haslbeck 2011 – V 0.2
  • als nächstes lassen wir im Erfolgsfall (via /opt/cruisecontrol/config.xml) das zip kopierenund schon da:Dieses File könnten wir nun auf einen Staging-Webserver kopieren und dort entpacken.Damit liegt dort dann eine sauber durchgetestete Version der aktuellen Software.SeleniumMit phpunit haben wir aber bisher nur Backendmethoden getestet. Was wird aus dem Frontend?Dazu nutzen wir Selenium.Selenium setzt “leider” einen Desktop-PC voraus den es startet einen richtigen Browser und testet mitdiesem.So funktionierts:Unter http://seleniumhq.org/download/ laden wir die aktuelle Version der Selenium-IDE für Firefoxherunter.Nach dem Neustart von Firefox starten wir über Tools die Selenium IDE. Dort klicken wir auf denroten Aufnahmeknopf und machen dann im Browser genau das was wir testen wollen: zB eine Sucheauf Google.de nach „selenium“Auf der nächsten Seite markieren wir einen Text der und beweisst, das das was wir gemacht habenerfolgreich war zB© Günther Haslbeck 2011 – V 0.2
  • Das kann aber natürlich auch ein Willkommenstext nach einem Login sein usw usw..In Selenium ist nun zu sehen was wir gemacht haben. Wir beenden dort die Aufnahme.Durch File → Save Testcase kann dieser nun gespeichert und über die IDE auch wieder geladen undausgeführt werden.Aber wir möchten ja automatisch und nicht jedes mal selbst Hand anlegen.Deswegen klicken wir auf File → Export-Test-Case und als PHP Testing_Selenium.© Günther Haslbeck 2011 – V 0.2
  • Das Ergebnis sieht sehr nach unseren Unit-Tests aus:(ich musste die require_once Zeile selbst nachbessern?!)Als nächstes laden wir den Selenium Server runter vonhttp://seleniumhq.org/download/und starten das .jar file direktund wir starten per phpunit das scriptEs wird ein Browser gestartet und genau da ausgeführt was im Script steht.Wunderbar.Damit hätten wir (wenn genug Tests erstellt sind) auch das Frontend durchgetestet und können diese© Günther Haslbeck 2011 – V 0.2
  • Tests auch immer automatisch fahren.MockObjektetbdLogfile + SystemüberwachungWie wir im Logfilekapitel vorher erfahren haben ist es wichtig Logfiles zu schreiben und auszuwertenWir wollen überwachen was unsere Anwendungen machen.Dazu nehmen wir viele Nagios oder Xymon (früher Hobbit früher Big Brother)Hobbitapt-get install xymonNun sollte schon alles funktionieren. Die Oberfläche findet sich unterhttp://localhost/hobbit/index.htmlIst ein Zugriff nicht erlaubt evt in:/etc/apache2/conf.d/hobbit alle #Allow from localhost ::1/128 ändern nach Allow from all/etc/init.d/apache2 restartund die Oberfläche ist daNagiosNur kurz erwähnt© Günther Haslbeck 2011 – V 0.2
  • apt-get install nagios3 (passwort bei der inst merken)/etc/init.d/nagios3 startund zugreifen viahttp://localhost/nagios3benutzername: nagiosadmin, passwort wie vorher festgelegtund wir sehen wie es der Maschine gehtjetzt muss nur noch eine Überwachung der Logs eingebaut werden.© Günther Haslbeck 2011 – V 0.2
  • Komplette automatisch überwachte Entwicklung und LiveseiteMRTGMemcacheDhttp://www.debian-administration.org/article/Speeding_up_dynamic_websites_with_cachingGut: Ist der MCD ausgefallen funtioniert die Seite trotzdem© Günther Haslbeck 2011 – V 0.2
  • Geschwindigkeit der Seite erhöhenBaue zu Beginn der Seite nur eine DB-Connection auf und übergebe diese an alle Methoden / Klassen.Die Klassen selbst müssen keine eigenen DB-Connections aufbauenVermeide schreiben in Dateien (Logfiles, Schreiben nach STDERR usw)Lade nur so wenig Klassen wie nötig (sinnlose Ladezeit der Scripte + Compilezeit der Scripte)CSS/Bilder:Nutze optimierte Bilder, Javascripts usw (mehr erklärt Google in Pagespeed)Geschwindigkeit der Seite selbst messenNutze Firebughttps://addons.mozilla.org/en-US/firefox/addon/firebug/Firebug auf Seite anklickenNet (oder Netzwerk) aktivierenShift+F5 und sehen was passiert.Am Beispiel GMX ist zu sehen: Ladezeit der Hauptseite (also zB php-Script) dauert 0,163 Sekunden.Super! - Allerdings dauert die ganze Seite dann Gesamt: 4,94 Sekunden. Katastrophe!© Günther Haslbeck 2011 – V 0.2
  • Geschwindigkeit der Elemente in der Seite messenGoogle Pagespeed zeigt was zu verbessern ist und wie http://pagespeed.googlelabs.comScreenshots in diesem File erstellt mit “shutter” für UbuntuPHP -Entwicklung auf Linux1. Ubuntu installierenAuf der Homepage von Ubuntu die aktuelle (am besten 64bit) Version runterladenhttp://www.ubuntu.com/download/ubuntu/downloadund auf CD brennen.Diese installieren wir auf einer alten externen Platte. Einfach von CD booten, dann installieren. BeimInstallieren darauf achten, dass die externe Platte verwendet wird (das ist dann zB sdf1...) und (sehrwichtig) dass auch der Bootsektor dann auf sdf installiert wird (NICHT sda!).Dann beim Start des PCs statt CD das angeschlossene Festplattenlaufwerk auswählen. Ubuntu solltenormal starten© Günther Haslbeck 2011 – V 0.2
  • Ubuntu basiert auf Debian-LinuxDaher benutzt Ubuntu die gleichen Programme und VerzeichnisseDie wichtigsten Dateien und Befehle für unsApache Logfiles:/var/log/apache2/access.log/var/log/apache2/error.loghtml-Startverzeichnis:/var/www/Einstellungen des Apache Webservers:/etc/apache2/sites-enabled/000-defaultWo sind wir (aktuelles Verzeichnis anzeigen)Wir starten erst einmal das Terminal (Anwendungen > Zubehör > Terminal) und geben ein:pwdpwd = print work directoryHilfe zu jedem Befehl anzeigen (zb pwd)man pwd© Günther Haslbeck 2011 – V 0.2
  • Dort kommt man wie in vielen Linuxprogrammen mit q, strg+c oder manchmal alt+q wieder raus.Scrollen mit den CursortastenVerzeichnisinhalt anzeigenlsViele Programme haben Paramter die man meisst mit -paramter anhängt. Das können auch mehreresein die dann direkt aneinandergereit werdenls -al zeigt alle Dateien ausführlich anls -alt (gut zu merken für deutsche) zeigt sortiert nach Datum (Parameter l)ls -als zeigt nach Dateigrösse sortiert (Parameter s)man ls hilft weiter was was bedeutetAusgabe weiterverarbeitenIst die Ausgabe nun sehr lange wäre es schön, wenn man diese Seitenweise angezeigen könnte.Das ist mit ls nicht möglich. Allerdings können wir mit | die Ausgabe von ls an ein anderes Programmsenden das genau das macht was wir gerne hätten.Wir nutzen das Program morels -al | moremit Cursor oder Space können wir nun Zeilen oder Seitenweise durch die Ausgabe scrollen.Man kann die Ausgabe auch in eine Datei schreiben mit >Dabei bedeutet > immer neue Datei anlegen, >> an bestehende Datei anhängen.ls -al > datei.txtEine Datei ausgeben kann man mit catcat datei.txtund Seitenweise dann eben wieder mitcat datei.txt | moreVerzeichnisseVerzeichnis anlegenmkdir verzeichnisname© Günther Haslbeck 2011 – V 0.2
  • Datei oder Verzeichnis löschenrm verzeichnisname bzw rm dateinameSind im Verzeichnis Dateien können die mirm -rf verzeichnisname gelöscht werden. Aber Vorsicht: Es wird ohne zu fragen ALLES was in demVerzeichnis war gelöscht. Weg ist weg. Nix PapierkorbInteressant ist auch das Programm grep. Damit können wir filtern.ls -al | grep „bla“hier werden nur Dateien oder Verzeichnisse ausgegeben die „bla“ im Dateinamen haben.Dateien suchenfind . -name „bla*.pdf“find sucht ab . (das Verzeichnis wo wir uns gerade befinden) alle Dateien die bla*.pdf heissen.Verzeichnis wechselnIn Linux gibt es keine Laufwerke, deswegen auch kein c: und die Verzeichnisnamen sind mit / getrenntund nicht mit wie in WindowsDie Wurzel ist also / und nicht c:cd ~ wechselt ins heimant (eigene User) verzeichniscd / wechselt ins root-Verzeichniscd /tmp un das /tmp Verzeichnicd – wechselt in das letzte Verzeichnis in dem wir gerade vorher noch warenTABbenutze die Tab-Taste um beim tippen von Verzeichnissen die Namen automatisch zu vervollstädnigen.Bringt Tab keine Antwort dann gibt es das Verzeichnis nicht. Hört Tab mitten im Namen auf so sindmehrere Verzeichnisse vorhanden mit ab hier verschiedenen Namen. Nochmal Tab zeigt dieMöglichkeitenDatei kopierencp datei1.txt datei2.txtVerzeichiss mit kompletten Inhalt kopierencp -r verzeichnis1 verzeichnis2Datei / Verzeichnis verschiebenmv datei1.txt datei2.txt© Günther Haslbeck 2011 – V 0.2
  • Programme installierenkurzes Vorwort: In Ubuntu sind wir immer ein Nutzer, kein Adminwhoamizeigt den Usernamen an. Der Adminuser heisst in Linux root.Dieser darf alles.Um Admin zu werden müssen wir mitsudo suroot werden.Allerdings ist sudo das Kommando um Programme als root auszuführen wenn man nicht root ist.Deswegen reicht es eigentlich immersudo kommandoaufzurufen statt tatsächlich root zu seinProgramm installieren 2Ubuntu holt sich die Programme von Listen die bei Ubuntu selbst verwaltet werden. Um sicher zu seinimmer die neusten Infos zu haben machen wir erst einmal ein Updatesudo apt-get updateapt ist hier das InstallationstoolDie Infos liegen nun im cache von apt und können nun nach Programmen durchsucht werdensudo apt-cache search apache2Durchsucht den Cache nach allen Programmen in denen apache2 vorkommt (hier ist grep von vorherdein Freund)Die Ausgabe ist dannPaketname – Beschreibung:….apache2 - Apache HTTP Server….Wir installieren alsosudo apt-get install apache2sudo apt-get install mysql-serversowiesudo apt-get install phpmyadminWährend der Installation von mysql und phpmyadmin wird nach Passwörtern gefragt. Am bestenimmer das gleiche eingeben. Phpmyadmin fragt auch nach dem Webserver – hier nur Apacheauswählen.Dann installieren wir noch vi (Texteditor)sudo apt-get install vim© Günther Haslbeck 2011 – V 0.2
  • Textdatei erstellen / bearbeiten mit viWir machen das mit vivi datei.txt (Dateiname schon zum start angeben wenns die Datei noch nicht gibt)vi datei.txt +15 öffnet eine Datei und springt gleich in Zeile 15 (ganz praktisch bei Fehlermeldungen imProgramm)Achtung: Vi hat 3 Modis die alle per Tastaturkürzel bedient werden. Vi hat keine Oberfläche.vi datei.txteingeben und genau schaun was untem am Rand steht.Mit ESC kommen wir immer in den Kommandomodus. Dann steht unten im Eck nichts.Durch drücken eines Selbstlautes (zb i) kommen wir in den TexteingabeModus. Dann steht unten zBINSERTAlso mal i drücken, Text eingeben, ESC drückenKommandos wie zB speichern gibt man nun per :Befehl ein (aber nur wenn man im Kommandomodus(vorher ESC) ist)Dabei bedeutetq = quitw = writeq! = quit ohne nachfragen:w schreibt also die Date:q beendet vi:wq schreibt und beendet viWir speichern also mit :wq und befinden uns wieder ausserhalb von viWir öffnen die Datei wieder:vi datei.txtIm Kommandomodus können wir auch text bearbeiten. Dabei gilt normalerweise immerBEFEHLanzahlBEFEHLso löscht dd die Zeile in der der Cursor steht, d2d löscht 2 Zeilen aber der Zeile in der der Cursor steht.x löscht ein zeichenyy kopiert eine Zeile in die Zwischenablage,p fügt die Zeile darunter wieder ein.Ein bischen einfacher wird das mit v.V öffnet den -Visual- Modus (siehe wieder links unten). Man kann dann mit den Cursortastenmarkieren, mit y kopieren und mit p wieder einfügen. Mit ESC kommt man wieder aus dem Visual-Modus raus.© Günther Haslbeck 2011 – V 0.2
  • :wq speichert und beendet die Bearbeitung der Datei.Ja, der Umgang mit vi will gelernt sein und erfordert Übung. Es gibt sehr viele Kommandos wie zB :%s/vorher/nachher/g um zu suchen/ersetzen.Dazu am besten eine ausführliche Anleitung lesen.Das erste PHP-Scriptvi /var/www/index.phpWir drücken i und geben ein<?echo(hallo welt);?>ESC und :wqund öffnen dann im Browserhttp://localhost/index.phpund wir sollten Hello World sehenApache und Co (neu) startenläuft apache nicht, so starten wir ihn per/etc/init.d/apache2 startbzwetc/init.d/apache2 restartoderetc/init.d/apache2 stopgleiches mit mysql/etc/init.d/mysql start/restart/stopHat unser Programm Fehler?so gucken wir einfach was das Fehlerlog schreibt:Wir öffnen ein neues Terminal und geben ein:tail -f /var/log/apache2/error.logund drücken dann im Browser F5 / Seite neu ladenTail lassen wir laufen. Es zeigt wenn sich eine Datei verändert und gibt das dann aus. Optimal für uns.Logfiles auswertenguckt man die Logfiles von Apache so würde man gerne wissen was die User so gucken.© Günther Haslbeck 2011 – V 0.2
  • Hier hilft uns awk. Awk hat eigentlich nichts mit Logfiles zu tun aber man kann mit awk auf Teile einerZeile der Logfiles zugreifen.Eine Zeile Logfile sieht so aus12.34.56.78 - - [04/Sep/2011:06:52:07 +0200] "GET /alle-titel/ HTTP/1.0" 200 26206 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html )"Man sieht hinter dem GET welche Datei abgerufen wurde.Awk splittet nun die Zeilen am leerzeichen und kann das entsprechende Element ausgeben.cat /var/log/apache2/access.log |awk {print $7}schickt das Log an awk, das splittet und gibt „Spalte“ 7 aus.…./uploads/RTEmagicC_ca.jpg.jpg/uploads/pics/nl_01.gif….und wenn man nun diese ausgaben zählt und nach Anzahl sortiert:…. 14 /uploads/pics/tttp.jpeg 15 /fileadmin/templates_studinfo/css/info.css?1305011933 16 /ntpagetag.js….Welche Programme laufen und diese beendenmittoplassen sich alle laufenden Programme anzeigen.Mit Shift+M oder Shift+P lassen sich die Angaben nach zB Memory oder cPu-Last sortieren.Gleiches zeigt auchps waufxBeide Programm zeigen die PID (Processid) eines Programms..USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 2 0.0 0.0 0 0? S Sep01 0:00 [kthreadd]Programme beenden geht per kill $pid also zBkill 2384dabei wird das Programm aber nicht abgeschossen sondern dem Programm mitgeteilt dass es sichbeenden soll.Tut es das nicht kann perkill -9 2348© Günther Haslbeck 2011 – V 0.2
  • das Programm hart abgeschossen werdenPHP Entwicklung mit FrameworksWiesoBei Softwareentwicklung tritt fast immer das gleiche Problem auf:Die Entwickler sind zu faul zu dokumentieren und kopieren lieber als Software anzupassen. Das führtzu unübersichtlichen und xmal vorhandenen Code.Deswegen bietet Frameworks einen gewissen Rahmen. Nun kann man CakePhp oder Symphonieverwenden aber diese sind doch etwas schwer für unsere Bedürfnisse.Es reicht eigentlich ein einfaches PHP Programm das Parameter entgegen nimmt, etwas damit machtund dann ausgibt.Fängt man mit der Ausgabe an so stellt man fest: HTML komplett auszugeben ist nicht sinnvoll da dasWebdesign im php-Code stattfindet. Man kann die Tätigkeiten „Entwickeln“ und „Webdisign“ nichttrennen. Deswegen ist es sinnvoll ein Templatesystem wie Twig zu verwenden.In Twig werden im HTML Platzhalter definiert die dann in php mit Werten gefüllt werden und dannalles ausgegeben.Des weiteren ist es sinnvoll die Businesslogik im Programm von der Datenspeicherung zu trennen.Insgesamt nennt sich das dann Model (DB-Logik), Controller ( Businesslogik), View = Ausgabe bzw„offiziell“ MVC (Model View Controller)Aber auch im Model möchten wir nicht jedesmal eine DB-Verbindung komplett neu programmieren.Deswegen die obig genannten Frameworks. Es geht aber auch sehr einfach.Unser Programm würde ungefähr so aussehen:<?Übergabeparamter aus der URL/Form einlesenDatenbankverbindung aufbauenIn Datenbank schreiben oder daraus lesenDatenbankverbinung abbauenTwig Template ladenWerte in Twig setzenTemplate ausgeben?>Betrachtet man das genauer so ist das Programm selbst der Controller,Der von der Datenbank eingeschlossene Bereich das Modelund danach die Befüllung des Views (also des html-Templates)Code nur einmal verwendenUm das nicht alles immer neu zu machen erstellen zerlegen wir obiges File in 3 Files:© Günther Haslbeck 2011 – V 0.2
  • controller.php<?Übergabeparamter aus der URL/Form einlesenModelaufrufViewaufruf?>Model<?Datenbankverbindung aufbauenIn Datenbank schreiben oder daraus lesenDatenbankverbindung abbauen?>View<?Twig Template ladenWerte in Twig setzenTemplate ausgeben?>Wenn wir uns nun die Programme ansehen ist immer noch vieles was später immer wieder kopiertwerden würde. Zudem ist mit View eigentlich die HTML-Seite (Also das Template gemeint), nicht dieLogik dieses zu befüllen....Wir müssen also das ganze Programm nochmal etwas drehen.Aber wie?Nun, erst einmal fassen wir alles was wir immer wieder brauchen aber nichts mit dem Programmablaufzu tun hat zusammen in eigene Dateien zB Datenbank Auf/Abbau usw.Damit ist schon mal viel Code so vorhanden das wir diesen in jedem unserer Projekte verwendenkönnen. Gleiches gilt für den Code um Twig zu nutzen.Bleibt also nur die Businesslogik und das Datenmodell selbst das jedesmal anders ist.Wir schreiben dazu eine Klasse die die Rahmenbedingungen enthält aber kein Datenstuktur und keineBusinesslogik.Würde man das in einem File darstellen wollen (was wir aber oben ja wegen der wiederverwendbarkeitdes Codes nicht wollen, so würde diese wieder so aussehen:<?ControllerplatzhalterDatenbankverbindung aufbauenModelplatzhalterDatenbankverbinung abbauen© Günther Haslbeck 2011 – V 0.2
  • TemplateplatzhalterTwig Template ladenWerte in Twig setzenTemplate ausgeben?>Von dieser Klasse leiten wir dann ab (extends) und füllen nur noch den Code den wir brauchen:<?class neu extends vorherigesbeispiel{Controllerplatzhalter = { unser code }Modelplatzhalter = {unser code}Templateplatzhalter = { unser html code)}?>Diese 3 „lokalen“ Codeblöcke lagern wir aus in 3 Files. Die 3 Files benennen wir jeweils gleich undlegen diese jeweils in das Verzeichnis/controller/gleichername.php/model/gleichername.php/view/gleichername.htmlSo, schon mal sehr schön.Jetzt bräuchten wir nur noch etwas was erkennt welche Files zusammengehören.Wir brauchen ein kleines Programm, das die Steuerung übernimmt.Hier kommt der nächst Trick:wir definieren, dass die URLs unserer Webseite so aussehen:http://www.wir.de/appname/nameund legen eine .htaccess in das Verzeichnis appname die sagt:Nimm, was hinter appname/ steht und baue damit ein Programm zusammen, das aus dem Rahmenbesteht und aus dem model/view/controller Dateien die mit Name. beginnen.Im Verzeichnis appname erstellen wir eine Datei die sich darum kümmert.Diese bekommt den Namen von der htaccess übergeben, baut sich ein php-Script aus eben diesenTeilen zusammen und führt das Programm aus.Wichtig noch: Wir wollen auch die Bilder zum Projekt im gleichen Verzeichnis ablegen (hier in res),deswegen darf hier die Regel nicht greifen.Die .htaccess© Günther Haslbeck 2011 – V 0.2
  • ----------------------RewriteEngine onRewriteCond %{REQUEST_URI} ^/appname/res/(.*) [NC]RewriteRule (.*) /appname/view/img/%1 [L]RewriteCond %{REQUEST_URI} !^/appname/view/(.*) [NC]RewriteCond %{REQUEST_URI} !^/appname/index.php [NC]RewriteRule (.*) /appname/index.php/$1 [L]die index.php ist unser Framework und baut dann unser Programm zusammen und führt es aus.Für jedes neue Seite in unserer Applikation müssen wir also nur noch unseren Controller, das Modelund die HTML-Seite kopieren und gleich benennen und ausprogrammieren. Für die Startseite derApplikation nennen wir alle 3 Files „index...“ und fertig.Das funktioniert übrigens deshalb da in php wir dynamisch eine Klasse instanzieren können$object = new $class();und per überschreiben der __autoload und den namen der Klasse definieren könne wo diese liegen…. function __autoload($class_name) { $pos = stripos($class_name, "global"); if ($pos === false){ include ./classes/ . $class_name . .php;….Aber das nur als kleiner Einschub...Voila, unser eigenes Framework ist fertig und sauber in MVC aufgeteilt das dann so aussieht.htaccessindex.php/model/seite.php/view/seite.html/controller/seite.php/helper/framework.php/helper/database.phpsowie/design/css/design/js/design/images/seite/© Günther Haslbeck 2011 – V 0.2
  • Um helper aber nicht x mal zu kopieren erstellen wir auf dem Server ein Verzeichnis in dem diese Filesliegen und verlinken diese nur in das Projekt.OutsourcingAls nächstes möchten wir, das andere externe Firmen an unserem Code mitentwickeln.Dazu setzen wir einen funktionierenden Server auf. Unsere Applikationen benutzen dort die normaleDatenbank usw.Wie können aber externe entwickeln ohne dass diese Zugriff auf unsere Daten haben?Nun, wir erweitern unser Framework um den Ordner/local/Dort legen wir Klassen ab, die die Datenbankverbindung usw simulieren. Unsere normale database.phpentfernen wir. Nun muss das Framework nur noch so angepasst werden dass auch in lokal nach einerdatabase.php gesucht wird und zwar vor der in helper und dann diese genommen wird. Damit läuft dieApp ohne echte Datenbankverbindung. (Stichwort Mock-Objekte)Den Code kopieren wir und richten wir vollständig ein. Dann checken wir diese leere App in github einund richten unseren externen Kollegen einen Zugang ein.Diese können nun bei sich lokal entwickeln und testen. Immer mal wieder checken die Jungs dann denCode wieder ein.Auf unserem Testserver guckt ein Cronjob alle 5 min bei github nach ob sich dort etwas neues befindet.Wenn ja so wird die Änderung von github heruntergeladen und dann die richtige Stelle auf dem dev-Server kopiert. Zudem die Mockobjekte entfernt und damit greift dort nun wieder der normaleDatabase Code.Damit kann der externe Entwickler also auf die Applikation praktisch in der zukünftigen Umgebungtesten OHNE darauf Zugriff zu haben.Sessions und RechteUnsere Framework-Klasse muss sich zusätzlich darum kümmern, das der User eingeloggt ist odernicht. Das kann jeder implementieren wie er will.Möchte man nur einige Seiten der App sperren so ist die Abfrage statt im Framework im Controllerauszuführen.Nun ist es auch günstig wenn zur Session eine Rechtetabelle verwaltet wird. Dort kann dann hinterlegtwerden ob der User wenn er eingeloggt ist den Seite sehen darf oder nicht.Über einen Zeitstempel kann das dann auch zeitgesteuert funktionieren.So ist damit denkbar dass zB bei der Registrierung ein solches Recht zB für 14 Tage eingetragen wird.Sind die 14 Tage abgelaufen so muss sich der User das Recht kaufen. Vorher kann der User testen.Mit Hilfe dieser Rechtetabelle kann also jeder Bereich in der Applikation gegen Gebühr ein undausgeschaltet werden.© Günther Haslbeck 2011 – V 0.2
  • Versionierung mit GITDer aktuelle Stand in GIT ist ok? - Dann einen Tag erzeugen mit Versionsnummer:Jetzt kann auf den Zielrechner mit-l“ist“ (list)geguckt werden welche Versionen es gibt und die ensprechende dann ausgecheckt werden.Anmerkung:Eigentlich wird nicht ausgecheckt sondern der Stand zu diesem Tag hergestellt.Es könnte also sein, dass ein „git clone .. „ schon weiter ist. Durch git checkout „version“ wird dannrein „rollback“ auf einen älteren Stand gemacht.Netbeans zeigt php-docs nicht anNetbeans hat je nach Code etwas Schwierigkeiten den Code zu erkennen und den Code CompletionAssistant anzuzeigen.Je nachdem zeigt Netbeans entwederoderNetbeans zeigt eine Auswahl aller Files die eine Variable mit gleichen Namen enthalten© Günther Haslbeck 2011 – V 0.2
  • Um Netbeans zu unterstützen kann man direkt direkt über den Variablen definieren welchen Typ (oderKlasse) diese Variablen repräsentieren:oder direktund schon klappts© Günther Haslbeck 2011 – V 0.2
  • Wenns nicht geht: Ist phpdoc installiert? Sind die anderen Klassen im Include-Pfad?Mehr unter http://blogs.oracle.com/netbeansphp/entry/code_completion_for_a_classError-Reportingsollte immer auf Vollanschlag sein denn Code der Warnungen erzeugt.. dem kann man nicht trauen.Wo keine Warnungen sind sind auch keine FehlerDas Fehlerreporting kann am Anfang oder in der php.ini gesetzt werden:// Melde alle PHP Fehler (auch wenn in spät. PHP-Versionen neue hinzu kommen)error_reporting(-1);// Error Reporting komplett abschaltenerror_reporting(0);// Nur bestimmte Fehler meldenerror_reporting(E_ERROR | E_WARNING | E_PARSE);Mehr:© Günther Haslbeck 2011 – V 0.2
  • http://php.net/manual/de/function.error-reporting.phpEigenen ErrorhandlerUndefinierte Variablen in PHP anzeigenDa hilft Netbeans gerne aus:Warnungen in Netbeans für PHP aktivieren:© Günther Haslbeck 2011 – V 0.2
  • Definieren wie was angezeigt werden soll (Achtung, gilt für alle Sprachen)Voila:© Günther Haslbeck 2011 – V 0.2
  • Twig I18n Implementation / Translation – How it worksThe Twig Docu is very good but this (important) Part ist not very clearHow to use the i18n Support.First of all, just read the Docu athttp://twig.sensiolabs.org/doc/extensions/i18n.htmlbut they is a little “short”… i would sayThe missing Part:First: Checkout the Extension Repository:git clone https://github.com/fabpot/Twig-extensions.gitand install gettextapt-get install php-gettextThen (for testing) i copied the I18n.php and the Parser.php from to…/Twig-extensions/lib/Twig/Extensions/Extension cp -r I18n.php/usr/share/php/Twig/Extension/…/Twig-extensions/lib/Twig/Extensions/# cp -rTokenParser /usr/share/php/Twig/Extension/…/Twig-extensions/lib/Twig/Extensions/# cp -r Node /usr/share/php/Twig/Extension/but nothing happens bec this directory seams to be not directly included so if you add theFiles directly like: $twig = new Twig_Environment($loader, $env_options); // Set language to german putenv(‘LC_ALL=de_DE.utf8′); setlocale(LC_ALL, ‘de_DE.utf8′); // Specify the location of the translation tables bindtextdomain(‘myAppPhp’, ‘/usr/share/locale’); bind_textdomain_codeset(‘myAppPhp’, ‘UTF-8′); // Choose domain textdomain(‘myAppPhp’); require_once(‘/usr/share/php/Twig/Extension/I18n.php’); require_once(‘/usr/share/php/Twig/Extension/TokenParser/Trans.php’); require_once(‘/usr/share/php/Twig/Extension/Node/Trans.php’); $twig->addExtension(new Twig_Extensions_Extension_I18n());everything works…the de_DE.utf8 is for german and /usr/share/locale is where normally the .mo files are for thelinux system (you can use every other directory)to get the language exactly use locale -a | grep DE© Günther Haslbeck 2011 – V 0.2
  • and you will get de_DE.utf8so this is where the system will translate your english default text to. This means you have toset LC_ALL to the target languageBut: This was only the first Step.Now add a{% trans “Hello World!” %}somewhere in one of your templates and lets see if the “Hello World” is on your site…If so, good!Ok,as next turn the Twig-Cache on if not still done $env_options = array( ‘cache’ => ‘/var/www/vhost081/twig_cache’, ); $twig = new Twig_Environment($loader, $env_options);Youll find php files like 4b/c6/189025b9af97f63de69cce1f5cb2.phpin the twigcache and if you look into the files youll see the “Hello World” there:….// line 8echo gettext(“Hello World!”);// line 9…bec Twig translates all the templates into php code (this is also mentioned at the End of theTwig i18n docu) and what you see is how gettext in php works.So now we have to extract all these calls and create a file for translationbut first we need to install xgettext:apt-get install gettextthen create the po-file from the php cache file: /var/www/vhost081/twig_cache# xgettext –default-domain=myAppPhp -p /tmp –from-code=UTF-8 -n –omit-header -L PHP 4b/c6/189025b9af97f63de69cce1f5cb2.phpI write it to /tmp with the name myAppPhp (which was set before in the php code)if you look at it youll see something like #: 4b/c6/189025b9af97f63de69cce1f5cb2.php:25 msgid “Hello World!” msgstr “”so use poedit or just a normal texteditor and change msgstr to the translated version #: 4b/c6/189025b9af97f63de69cce1f5cb2.php:25 msgid “Hello World!” msgstr “Hallo Welt!”© Günther Haslbeck 2011 – V 0.2
  • now convert the file into a machine readable format (from .po to .mo) msgfmt -v -o /tmp/myAppPhp.mo /tmp/myAppPhp.poand copy the file to the given directory cp /tmp/myAppPhp.mo /usr/share/locale/de/LC_MESSAGES/If you use a different directory dont forget the LC_MESSAGES and that the file has to bereadable and accessable for apache/phpIf you want to check whats in the file: strings /tmp/myAppPhp.moand youll see “Hallo Welt” on the WebsiteMy Sources for this Articlehttp://oriya.sarovar.org/docs/gettext_single.htmlandhttp://stackoverflow.com/questions/2425562/php-gettext-function-only-returns-orignal-untranslated-stringStill unclear:How to use different translations on different sites ?!WebdesignWoher bekommt man eigentlich coole Webdesigns?Eigentlich relativ einfach. Wenn man kein Künstler ist, dann kauf man sich ein fertiges Design. Da wirdieses dann sowieso etwas anpassen müssen ist es egal für welches System das Design/Templateeigentlich gemacht ist. Deswegen: Webseiten wie Templatemonster.com verkaufen 1000de von Designsfür ca 50€. Die Hauptarbeit ist eher das stöbern nach dem richtigen DesignFotos für die SeiteGibts bei Fotolia oder Stockphotos im Netz. Evtl die Lizenzbedingungen beachten.Logo für die SeiteDa gibts die Möglichkeit fertige Logos zu kaufenhttp://www.logotion.com/logodesign/logos-1.htmlhttp://www.logomarket.com/für 100-200-1000 Eurooder sich 25 bis 70 Logos vorschlagen zu lassen ab 700 Eurohttp://de.wilogo.com/aber woher weiss ich ob was dabei ist?Trifft es meinen Geschmack?Ich habs deshalb jetzt umgekehrt gemacht.Ich hab mir aufhttp://de.wilogo.com/nos-references-en-logos.html© Günther Haslbeck 2011 – V 0.2
  • die Logos ausgeguckt die mir am besten gefallen haben und mir dann weitere von demDesigner (diesmal aus .de) angeguckt.Den hab ich nun angeschrieben und ihm die, die mir am besten gefallen genannt und das ichso eins gerne hätte.Der macht mir nun am Wochenende Vorschläge für mich und dann schau ma mal ob da wasrauskommt.Wenns passt hätt er gerne 250 Euro.PHP BeschleunigenGanz einfach mit Xcache für Apache (oder alternativ gleich NGINX verwenden).http://arnowelzel.de/wiki/de/web/xcacheund so gehts:apt-get install php5-xcacheapache restart, fertig.In /etc/php5/apache2/conf.d/xcache.ini ist insbesondere der Wert für xcache.size wichtig.Einfach ein bissl höher drehen ;)durch kopieren des Admininterfaces in das Webverzeichnis (wird unter ubuntu gleich mit aufdie Platte kopiert) cp -a /usr/share/xcache/admin /var/www/vhost008/html/xcache-admin vi /etc/php5/conf.d/xcache.inientfernen der admin/passwort kommentare und setzen eines MD5 Passworts[xcache.admin]xcache.admin.enable_auth = Onxcache.admin.user = "bla"xcache.admin.pass = "8f87e10869299a5fe80b315695296b88"(einfach durch einen md5 online generator generieren)erhält man ein sehr schönes Webinterface© Günther Haslbeck 2011 – V 0.2
  • Apache Status ModulDa PHP als Modul im Speicher läuft sollte kann nicht einfach geprüft werden was gerade imSystem los ist. Einfach mithttp://httpd.apache.org/docs/2.0/mod/mod_status.htmlden Status des Servers überwachenDort ist deutlich zu sehen welche Prozesse gerade laufen usw© Günther Haslbeck 2011 – V 0.2
  • Gitweb – neues Projekt erstellen(installation wird im nächsten Abschnitt erklärt, hier erst mal der schnelle weg)Ins Projektroot von gitweb wechseln, dann repostory erstellen.Die meissten nennen diese am Ende .git – Ich mache viel mit Windows und ich mag es nicht wennVerzeichnisse eine „Extension“ haben deswegen bei mir ohne:in description eine einfache Beschreibung eingebenDann config-File einstellen (geht direkt im File oder:)Fertig.Gitweb installieren in ubuntu 1. ganz normal via apt-get installieren 2. Pfad wo die reps liegen in /etc/gitweb.conf definierendarin legen wir nun ein Verzeichnis an und darin legen wir nun ein git repository anund editieren darin die description des projects© Günther Haslbeck 2011 – V 0.2
  • und wir sehen dann im Browserund wenn wir darauf klicken ist auch alles dawas aber noch fehlt ist die Anzeige der URL des repositories.Das macht das Auschecken etwas leichterdas geschieht am Ende von /etc/gitweb.Dort können 1 oder mehrere URLs angegeben werdendiese erscheinen dann auch in gitweb© Günther Haslbeck 2011 – V 0.2
  • Jetzt checken wir mal das repository ausDazu lokal ein Verzeichnis anlegen in dem dann das repository erscheinen solldarin per git clone auschecken (Für alle die SSH auf einem anderen port laufen lassen: Einfachssh://xxx:PORT/bla )reinwechselnDatei anlegen,committendann pushen© Günther Haslbeck 2011 – V 0.2
  • und file ist daund natürlich hat git vorher wieder gewarnt:© Günther Haslbeck 2011 – V 0.2
  • und deswegen sollten wir die Werte wie angegeben auch setzeneinmal git pull und git pushund die Welt ist wieder in OrdnungFile ändern und commiten und pushen:alles brav, alles funktioniert© Günther Haslbeck 2011 – V 0.2
  • GIT in Eclipse installierenEgit unter HELP > INSTALL NEW SOFTWARE hinzufügenhttp://eclipse.org/egit/download/© Günther Haslbeck 2011 – V 0.2
  • Ein bestehendes Projekt für Eclipse aus GIT auscheckenProjekt anlegen viaImport → GIT → Projects from GIT© Günther Haslbeck 2011 – V 0.2
  • und dann CLONE und dortwieder hier mit Extra-Port Angabe (:32 – normalerweise nicht nötig).Den Rest füllt EGIT selbst ausUnten noch Benutzername + PW angeben.Dann Importieren------------Neues ProjektErst einmal mit TEAM → Share ein neues Repository lokal erstellen.© Günther Haslbeck 2011 – V 0.2
  • Dann über die Console (anders hab ichs nicht geschaft)Dann klappts mit TEAM > PUSH TO UPSTREAMund fertig ;)Push geht allerdings nur oben beim „Projekt“ selbst© Günther Haslbeck 2011 – V 0.2
  • Branching in GitEinen neuen Branch (hier mal mit testnamen „newbranch“)erzeugen und dann mal anzeigen welcheBranches es gibtDas * vor master zeigt, das wir im Master-Branch sindWir wechseln mal in unseren „newbranch“und pushen diesen auch gleich mal in unser gitrepositoryund er erscheint auch in unserem gitweb© Günther Haslbeck 2011 – V 0.2
  • Wir bearbeiten ein File und committen und pushenMan sieht auch in gitweb die Änderungen am File und in welchem BranchWechseln wir nun zurück zum Masterbranchso ist im File wieder der alte Stand.Nun mergen wir den Master mit dem Stand aus „newbranch“© Günther Haslbeck 2011 – V 0.2
  • und das File passt wieder.Wir pushen alles noch, dann ists auch wieder im repository okund auch in gitweb sieht man dass das File nun in beiden Branches aktuell ist:Wenns Probleme gab beim mergen:git diff zeigt die Problemegit commit -a um die Files dann zu committengit branch -d newbranch löscht einen Branch der in einem normalen Status istgit branch -D newbranch löscht den Branch egal in welchen Status er istDeployment mit Gitwäre damit zB so möglich: Der Sync auf die Server kann dann einfach per rsync erfolgen© Günther Haslbeck 2011 – V 0.2
  • Wir haben also aktuell unseren Quellcode zB so organisiert: Remote Master Repository Netbeans Lokales Master Remote Master dev-webserver Repository clone rsyncund so hätten wirs gerne© Günther Haslbeck 2011 – V 0.2
  • Remote Master Repository Netbeans rsync Lokales Master Remote Master dev-webserver Repository clone Switch from Master (dev) to Stage Merge to Stage and sync Switch back to Master (Dev) Remote Stage stage-webserver Branch clone Switch from Stage to Live Merge to Live and sync Switch back to Stage Remote Live live-webserver Branch cloneWir legen also erst einmal 2 neue Branches an$ git branch stage$ git branch liveund pushen diese$ git push origin stage$ git push origin livewas haben wir, wo sind wir:$ git branch© Günther Haslbeck 2011 – V 0.2
  • live* master stageund wechseln dann in den Stage-Branch$ git checkout stageSwitched to branch stageund prüfen:$ git branch live master* stagePerfect. Nun mergen wir alles von master nach stage, vergeben just for fun ein (versions) Tag (nichtnötig) und pushen alles wieder zurück$ git merge master$ git push$ git tag -a v0.1 -m "neue Version"$ git push origin v0.1$ git checkout masterSwitched to branch masterAlle Änderungen vom Masterbranch sind nun auch im Stagebranch.Das sehen wir auch in GitwebJetzt muss nur noch der Repository-Clone vom Stagesverzeichnis dass dann mit dem Stage-Serversyncht auf eben diesen Branch umgeschaltet werden damit nur Änderungen aus dem Stage-Branchgesyncht werdenwir wechseln also in das Verzeichnis in dem das Stagesystem geclonet ist und sehen uns dievorhandenen Branches an$ git branch • masterEs gibt nur Master. Wir wollen aber einen anderen. Welche es gibt zeigt -a :$ git branch -a* master remotes/origin/HEAD -> origin/master© Günther Haslbeck 2011 – V 0.2
  • remotes/origin/live remotes/origin/master remotes/origin/stage(Mehr http://stackoverflow.com/questions/67699/how-do-i-clone-all-remote-branches-with-git )um in den stage-branch zu kommen müssen wir diesen hier einmalig auschecken:$ git checkout -b stage remotes/origin/stageBranch stage set up to track remote branch stage from origin.Switched to a new branch stagewir sind nun in$ git branch master* stageund holen uns nun zur Sicherheit nochmal den neusten stand$ git pullVon diesem Verzeichnis werden also nur Änderungen gesyncht die im Branch Stage sind.Ändert man nun in Netbeans etwas ab und commit/pullt diese Änderungen in den Masterbranch soerscheint diese Änderung nur auf dem Devserver.Um die Änderung auch auf dem Stageserver zu sehen muss eben der Stagebrach mit dem Masterbranchgemerget werden.$ git merge master$ git tag -a v0.2 -m "neue Version"$ git push origin v0.2$ git push$ git checkout masterund schon erscheint die Änderung auf auf dem Stageserver.Auch in gitweb ist schön zu sehen auf welchem Stand die Systeme sindund durch die Tags könnten wir auch später auf eine ältere Version zurückspringen.© Günther Haslbeck 2011 – V 0.2