Effizienzsteigerung einer. komplexen Webanwendung. Guido Mittag,

Größe: px
Ab Seite anzeigen:

Download "Effizienzsteigerung einer. komplexen Webanwendung. Guido Mittag, 292863"

Transkript

1 Effizienzsteigerung einer komplexen Webanwendung Bachelorthesis zur Erlangung des akademischen Grades eines Bachelors of Science (B.Sc.) Guido Mittag, Dezember 2013 Erstgutachter: Prof. Dr.-Ing. Andreas Spillner Zweitgutachter: Prof. Dr. Thomas Risse

2 Eidesstattliche Erklärung Ich versichere hiermit an Eides statt, dass ich die vorliegende Bachelorarbeit mit dem Titel Effizienzsteigerung einer komplexen Webanwendung selbstständig und ohne unzulässige fremde Hilfe erbracht habe. Ich habe keine anderen als die angegebenen Quellen und Hilfsmittel benutzt sowie wörtliche und sinngemäße Zitate kenntlich gemacht. Diese Arbeit hat in gleicher oder ähnlicher Form noch keiner Prüfungsbehörde vorgelegen. Bremen,12. Dezember 2013 Unterschrift

3 Inhaltsverzeichnis 1 Vorwort 1 2 Einleitung 1 3 Grundlagen Qualitätsabsicherung Code-Analyse Softwaretests Komponententest Integrationstest Systemtest Regressionstest Performance und Effizienz request lifecycle Testsystem Client Server Messwerkzeuge und Messmethoden Komplexe Webanwendung Beschreibung Struktur und Design Datenbank Effizienzsteigerung Ziele Vorbereitende Maßnahmen Statische Code-Analyse Automatische Analyse Ergebnis der automatischen Code-Analyse Anzahl der Funktionsaufrufe minimieren PHP-Profiling Datenbankoptimierungen Ineffiziente Datenbankabfragen - slow queries

4 5.6.2 Datenbankstruktur Speicher-Engine Indizes Relationen Nutzen Caching Browsercache Skriptgesteuertes Caching Performancemessung Messsystem Datenbankeinträge Messaufbau und Messmethode Eigenes Messtool Messergebnisse Vor der Optimierung Änderungen nach statischer Code-Analyse for-schleifen-optimierung Reduzierung der Datenbankverbindungen Optimierung von slow-queries Optimierung der Datenbankstruktur PHP-Caching Auswertung 67 8 Fazit 69 9 Ausblick Anhang Testdokumentation Regressionstest for-count Optimierungen Auswirkungsanalyse Komponententest Integrationstest

5 Regressionstest Anzahl MySQL-Verbindungsaufbauten minimieren Auswirkungsanalyse Priorisierung Komponententest Integrationstest Regressionstest Optimierung slow-queries Auswirkungsanalyse Komponententest Integrationstest Test der referentiellen Integrität nach Optimierungen der Datenbankstruktur Regressionstest nach Implementierung des Caching-Systems Systemtest Glossar Literatur- und Quellenverzeichnis Literatur Sonstiges Weblinks Abbildungsverzeichnis Listings Tabellenverzeichnis

6 2 Einleitung 1 Vorwort Coderefactoring einer komplexen Webanwendung - im Verlaufe der Bearbeitung der vorliegenden Bachelorthesis wurde festgestellt, dass dieser ursprüngliche Titel der Arbeit nicht ganz zu der im Vorfeld gestellten Zielsetzung passt. Folgende Ziele waren für die Bearbeitung des Themas formuliert: Oberstes Ziel ist es, die Performance des Programmes spürbar zu verbessern, damit der Benutzer und nicht zuletzt der Kunde die erwünschte Wertschätzung für das Refactoring aufbringen können. Aus softwaretechnischer Sicht soll die Performance messbar verbessert werden. Weiterhin soll erreicht werden, dass das Programm besser wartbar und verständlich ist. Des Weiteren soll ein solides Testkonzept entwickelt werden. Der Begriff Coderefactoring wird dagegen folgendermaßen definiert: Beim Refactoring verändert man bestehenden Programmcode, ohne dabei das äußere Verhaltendes Programms zu ändern. [PHPMAGAZIN][S.64] Die Verbesserung der Performance bringt eindeutig eine Veränderung des Zeitund somit des äußeren Verhaltens mit sich. Demnach ist der ursprüngliche Titel für die Arbeit nicht tauglich. Unter Beibehaltung der aufgeführten Ziele ist der Titel Effizienzsteigerung einer komplexen Webanwendung angemessener. 2 Einleitung Gemäß ISO 9126 ist die Effizienz ein externes Qualitätsmerkmal von Software (vgl. [SWQUALITY]). Innerhalb des Entwicklungsprozesses kann eine Reihe von Gründen dazu führen, dass die implementierte Software nicht ausreichend effizient ist. Verursacht durch einen hohen Konkurrenzdruck bleibt dem Entwickler häufig nicht genug Spielraum, explizite Maßnahmen zu ergreifen, bei denen eine hohe Effizienz im Vordergrund steht. Auch Fehler bei der Planung und Umsetzung, die die Struktur der Software betreffen, führen zu ineffizienten Programmen. So könnte möglicherweise die Architektur der Applikation nicht für hohe Belastungen ausgelegt sein, weil bei der Entwicklung eine hohe Belastung nicht in Betracht gezogen wurde. Weiterhin wird bei komplexen Datenbankanwendungen das Zeitverhalten erst bei 1

7 3 Grundlagen einer sehr hohen Anzahl von Datensätzen deutlich. Oft steht bei der Entwicklung nur eine begrenzte Anzahl von Testdaten zur Verfügung. Auch ein agiles Vorgehensmodell kann dazu beitragen, dass zunächst nur Kundenwünschen entsprochen werden, die sich nicht auf die Performance des Systems beziehen. Es kann also zusammengefasst werden, dass eine Vielzahl von Gründen dazu beitragen kann, dass ein Effizienzsteigerung einer Software notwendig ist. In dieser Bachelorarbeit werden Maßnahmen und Vorgehensweisen betrachtet, die das Zeitverhalten und den Ressourcenverbrauch einer komplexen Webanwendung positiv beeinflussen. Weiterhin soll die zu erwartende Performancesteigerung gemessen werden, um den Nutzen der einzelnen Maßnahmen herauszustellen. Ziel dieser Arbeit ist es, an einem konkreten Beispiel Methoden zu finden, die einerseits die Performance nicht nur mess- sondern auch spürbar verbessern, um die Akzeptanz dieser Maßnahmen beim Kunden und Anwender zu fördern und die andererseits eine Grundlage für andere Softwareentwickler sein können, Webanwendungen, die auf den gleichen Technologien basieren, zu optimieren. 3 Grundlagen 3.1 Qualitätsabsicherung Code-Analyse Die Codeanalyse gehört zu den statischen Software-Testverfahren. Charakteristisch für statische Verfahren ist, dass der Code nicht ausgeführt wird (vgl. [Spillner, S.81]). Diese Art von Qualitätsabsicherung kann manuell oder automatisiert mit geeigneten Werkzeugen durchgeführt werden. Da komplexe Webanwendungen mit einer Vielzahl an Sprachen und Technologien umgesetzt werden, ist eine statische Code-Analyse mittels eines Programmes mit einigen Schwierigkeiten verbunden. Ziel dieser Maßnahme ist es, den Quellcode verständlicher und wartbarer zu gestalten, sowie Fehler im Quellcode aufzuspüren. Von großem Nutzen hinsichtlich der Effizienz ist bei einer komplexen Webanwendung die manuelle Codeanalyse. Dieses Vorgehen ist mit einem nicht unerheblichen Aufwand verbunden. Jedoch lassen sich die dadurch resultierenden Optimierungsmaßnahmen ggf. bei ähnlichen Problemen erfolgreich wiederholen. 2

8 3 Grundlagen Softwaretests Im Zuge dieser Arbeit werden einzelne Komponenten der zu optimierende Software teilweise grundlegend verändert. Um eine einwandfreie Funktionalität des Programmes gewährleisten zu können, sind daher verschiedene Tests zwingend erforderlich. Um Datenbankabfragen zu testen, wird eine Test-Datenbank eingerichtet, in der einige wenige Datensätze enthalten sind. Dies dient dazu, die Menge der Ergebnisse der Datenbankabfragen mit den durch die Tests erwarteten Ergebnisse vergleichen zu können. Folgend werden einige Grundlagen zum Testen erläutert. Die beschriebenen Verfahren kommen später im praktischen Teil dieser Arbeit zum Einsatz Komponententest Im Komponententest werden einzelne Softwarebausteine isoliert und systematisch getestet. Wenn, wie im vorliegenden Beispiel, objektorientiert implementiert wird, dann sind die zu testenden Bausteine meist Klassen. Einerseits können dynamische Komponententests durchgeführt werden. Hierbei wird das Testobjekt mit klar definierten Übergabeparametern zur Ausführung gebracht. Dabei müssen die Ausgabewerte genau der Spezifikation entsprechen. Andererseits ist auch eine statische Analyse, bei der der Quellcode der einzelnen Komponente begutachtet wird, möglich. Für die Eingabe von Daten sind sogenannte Treiber verantwortlich. Durch sie wird eine Dateneingabe durch das System simuliert. Kommt beim Komponententest eine Fehlerwirkung zum Vorschein, kann deren Ursache wegen der isolierten Betrachtung des Softwarebausteins klar zugeordnet werden. (Quelle für diesen Abschnitt: [Spillner, Seite 44-51]) Integrationstest Nach dem Komponententest erfolgt der Integrationstest. Dabei werden mehrere bereits getestete Einzelkomponenten zusammengefügt und geprüft, ob sie gemäß Spezifikation zusammenarbeiten. Das bedeutet, dass vor allem die Schnittstellen der integrierten Komponenten getestet werden. Dabei werden die Komponenten schrittweise zu immer größeren Teilsystemen verbunden. Die im Komponententest verwendeten Treiber können beim Integrationstest erneut verwendet werden. Es 3

9 3 Grundlagen können auch mehrere bereits getestete Teilsysteme miteinander verbunden werden. Ziel des Integrationstestes ist es, Fehlerwirkungen bei dem Zusammenspiel einzelner Komponenten aufzuspüren. Im praktischen Teil dieser Arbeit kommt die Integrationsstrategie Bottom up zur Verwendung. Dabei wird mit den elementarsten Komponenten des Systemes, die selber keine weiteren Komponenten aufrufen, begonnen. Auf dieser Grundlage werden sukzessive weitere Komponenten integriert, bis das Teilsystem, welches getestet werden soll mit allen Komponenten ausgestattet ist. (Quelle für diesen Abschnitt: [Spillner, S ]) Systemtest Nach Abschluss aller Integrationstests kommt der Systemtest zur Ausführung. Dabei wird überprüft, ob das fertige Produkt den Spezifikationen entspricht. Das bedeutet, dass bei diesem Testverfahren die Funktionalität der Software aus Kundensicht validiert wird. Es geht also darum, dass alle getesteten Teilstrukturen im Ganzen funktionieren. Um den Test so realistisch wie möglich zu gestalten, soll die Testumgebung des Systemtestes möglichst entsprechen. Bei diesem Test sollen keine Treiber oder Dummys mehr zum Einsatz kommen. Neben der Validierung der funktionalen Anforderungen, die gemäß Spezifikation geprüft werden können, gehört zum Testziel des Systemtestes auch die Prüfung der nicht-funktionalen Anforderungen, wie z.b.: Performance und User-Experience. (Quelle für diesen Abschnitt: [Spillner, S ]) Regressionstest Werden innerhalb des Softwarelebenszyklus im Rahmen von Weiterentwicklungen oder Wartungsarbeiten Teile der Software geändert oder ergänzt, muss das angepasste Programm erneut getestet werden. Dazu wird der sogenannte Regressionstest durchgeführt. Dabei wird geprüft, ob durch die Änderungen keine neuen Fehlerzustände hervorgerufen werden. Um den Umfang der zu testenden Bestandteile bestimmen zu können, muss eine Auswirkungsanalyse durchgeführt werden. Dabei wird ermittelt, auf welche Bestandteile des Systemes sich die Änderung von Komponenten auswirkt. Bei weitreichenden Veränderungen der Software ist ein vollständiger Regressionstest notwendig. 4

10 3 Grundlagen Das bedeutet, dass alle während der Entwicklung des Programmes durchgeführten Tests wiederholt werden müssen, zusätzlich zu den Tests, die ggf. neue Funktionalitäten prüfen. In der Praxis sind derart umfangreiche Tests oft nicht möglich, sodass eine Priorisierung der Testfälle vorgenommen werden muss. (Quelle für diesen Abschnitt: [Spillner, S ]) 3.2 Performance und Effizienz Mit dem englischen Wort Performance (dt. Leistung) ist im Zusammenhang dieser Arbeit die Geschwindigkeit gemeint, die ein System, bestehend aus Soft- und Hardware, für die Abarbeitung von bestimmten Aufgaben aufbringen kann (vgl. [Chmielewski, S. 6]). Ein wichtiger Aspekt bei der Betrachtung der Performance von Webanwendungen ist auch das Verhalten des Webservers bei hoher Auslastung hinsichtlich der Seitenaufrufe. An dieser Stelle werden jedoch ausschließlich Maßnahmen betrachtet bei denen die Software, beziehungsweise Einstellungen an Datenbankservern und -managementsystemen modifiziert werden, um das Zeitverhalten zu verbessern. Es werden keine Untersuchungen durchgeführt, bei denen ein hohes Lastaufkommen durch eine hohe Anzahl von Seitenaufrufen simuliert wird. Gemäß [ISTQB Glossary][S.20, S.32] unterscheidet die Bedeutung der Begriffe Performance und Effizienz nur die Perspektive, aus der die Leistungsfähigkeit betrachtet wird. So steht bei der Effizienz ausschließlich ein Softwareprodukt im Fokus, wohingegen bei der Performance auch vollständige Systeme, bestehend aus Hardund Software, Gegenstand der Betrachtungen sein können. Innerhalb dieser Arbeit werden die beiden Begriffe daher äquivalent verwendet. 3.3 request lifecycle Beim Blick auf eine Webanwendung ist es zunächst notwendig, die Vorgänge während eines HTTP request / response lifecycle herauszustellen, damit erkannt werden kann, welche Bestandteile des lifecycle Einfluss auf das Zeitverhalten des Programms haben. Aus Abbildung 1 kann entnommen werden, dass durch die Eingabe eines URL oder das Anklicken des eines Hyperlinks im Webbrowser eine Anfrage (request) über ein Netzwerk an einen Webserver versendet wird. Diese Anfrage wird dort entgegengenommen und verarbeitet. Die auf dem Server laufende Webanwendung 5

11 3 Grundlagen generiert dabei Daten, die nun wieder über das Netzwerk zurück an den Browser des Clients gesendet (response) werden. Abbildung 1: Darstellung des HTTP request / response lifecycle Testsystem Der in Abbildung 1 illustrierte HTTP request / response lifecycle (vgl.[padilla, S.22]) gibt Aufschluss über die Komponenten, die das Zeitverhalten einer Webanwendung beeinflussen. Sofort wird deutlich, dass es eine Reihe von Bestandteilen gibt, auf die der Entwickler meist keinen Einfluss hat. Für das Messen der Performance wird bei der zu optimierenden Applikation deshalb bewusst dafür gesorgt, dass ausschließlich die Komponenten zur Geltung kommen, die bei den Maßnahmen, die durchgeführt werden, von Belang sind. Die für die Betrachtungen relevanten Bestandteile sind der Client und der Server. 1 Vorlage: [Padilla, S.21] 6

12 3 Grundlagen Abbildung 2: Schema des Testsystems zur Performancemessung Gemäß dem Schema aus Abbildung 2 sind im Testsystem Web-, Datenbankserver und Client in einem einzigen Rechner untergebracht. Auf diese Weise entfallen alle Bestandteile aus Abbildung 1 zwischen Client und Webserver. Damit werden für die Performancemessung unkalkulierbare Einflussfaktoren der Netzwerkumgebung ausgeschlossen. Die zwangsläufige Aufteilung der Ressourcen des Testsystemes auf Browser, Webund Datenbankserver wird dabei in Kauf genommen und mit einem entsprechend leistungsfähigen System kompensiert. Zusätzlich wird dafür Sorge getragen, dass auf einem frisch installiertem Betriebssystem (Microsoft Windows 7 Ultimate) mit aktuellstem Patch-Level gearbeitet wird, auf dem nur die für den Verwendungszweck notwendigen Dienste und Prozesse laufen. Außerdem verfügt das Testsystem über keinerlei weitere Netzwerkverbindungen. Diese Maßnahmen sollen dazu beitragen, dass - soweit möglich - alle Faktoren, die das Zeitverhalten der Webanwendung beeinflussen, ausgeschlossen werden können. 7

13 3 Grundlagen Client Der auf der Clientseite laufende Webbrowser bildet die Schnittstelle zwischen dem Benutzer und der Webanwendung. Meist ist dem Benutzer nicht bewusst, dass seine Interaktionen immer den HTTP request lifecycle (Abbildung 1) durchlaufen. Vielmehr erliegt er dem Eindruck, dass sich jegliche Funktionalität der Webanwendung auf dem Gerät befindet, mit dem er das Programm bedient. Das Zeitverhalten der Applikation wird für den Benutzer nur auf der Clientseite spürbar. Daher ist diesem Bestandteil eine hohe Bedeutung beizumessen. Für die Benutzung der Webanwendung ist als Webbrowser der Internet Explorer von Microsoft vorgesehen, da ausschließlich dieser Browser in dem Unternehmensumfeld der zu betrachtenden Webanwendung (siehe Kapitel 4) benutzt wird. Clientseitig kommen mehrere Sprachen zum Einsatz. Die für die Darstellung bedeutendste ist [HTML] (Hypertext Markup Language). Diese Auszeichnungssprache bildet das Grundgerüst einer jeden Webseite / Webanwendung und wird vom Webbrowser interpretiert. Ebenfalls von großer Bedeutung ist die Auszeichnungssprache [CSS] (Cascading Style Sheets). Mit ihrer Hilfe lassen sich bestimmte Elemente innerhalb einer HTML-Seite identifizieren und konkret ansprechen, um ihre Darstellung zu bestimmen. So ist es mit CSS beispielsweise möglich, Schriftart, Größe und pixelgenaue Position einer Textbox festzulegen. Werden diese Styledefinitionen in eine externe Datei ausgelagert, so lassen sie sich wiederverwenden. Das hat zur Folge, dass sich das Layout der Webanwendung an einer zentralen Stelle bestimmen lässt. Dadurch minimiert sich der Aufwand dafür und es werden bei konsequentem Einsatz Wiederholungen vermieden. Anders als die zwei vorangestellten Sprachen ist die Skriptsprache [JavaScript] für die Abarbeitung logischer Aufgaben im Webbrowser geeignet. Sie ermöglicht den direkten Zugriff auf das Document Object Model [DOM]. So lassen Elemente der Webseite zur Laufzeit manipulieren. Der Einsatz von JavaScript kann in hohem Maße zu einer positiven User Experience beitragen, da vielfach eine Interaktion mit der Anwendung, die einen HTTP request lifecycle (Abbildung 1) bedingt, bereits clientseitig ausgeführt werden kann. Leider werden CSS und auch JavaScript von verschiedenen Webbrowsern teilweise unterschiedlich interpretiert, sodass der Webentwickler diese Unterschiede berücksichtigen muss. Bei der Entwicklung für Webanwendungen im Unterneh- 8

14 3 Grundlagen mensumfeld ist von der IT-Administration des jeweiligen Unternehmens oft ein Webbrowser vorgeschrieben. Dies kann bei der Entwicklung hilfreich sein, weil es eine Konzentration auf nur eine Zielumgebung ermöglicht. Ein besonderes Augenmerk sei an dieser Stelle noch auf die Javascript-Bibliothek [JQUERY] gerichtet. Mit ihrer Hilfe lassen sich mit äußerst wenig Code DOM- Elemente manipulieren, sowie [AJAX]-Requests absetzen. Der Entwickler braucht sich bei dem Einsatz von jquery keine Gedanken um die Browserkompatiblität der von ihm gewünschten Aktionen machen, da die Bibliothek plattformunabhängig eingesetzt werden kann. jquery verbreitet sich sehr rasant und entwickelt sich zu einem festen Standard in der clientseitigen Webentwicklung. Bei der Auflistung dieser Technologien wird deutlich, dass das Zeitverhalten der Webanwendung clientseitig durch mehrere Faktoren beeinflusst wird. Eine Optimierung der Performance kann durch Maßnahmen an jedem dieser Bestandteile herbeigeführt werden Server Der Webserver, der sich in der Regel an einem entfernten Standort befindet, nimmt die Anfrage des Client entgegen und verarbeitet diese, um danach die gewünschten Daten im entsprechenden Format zurück zum Aufrufer zu senden. Werden bei einem Seitenaufruf lediglich statische HTML-Dokumente angefordert, hat der Server keine weiterführenden Aufgaben auszuführen. Im Gegensatz dazu sind komplexe Webanwendungen jedoch serverseitig grundsätzlich mit einer geeigneten Logik ausgestattet. Als Serversoftware kommt im Testsystem der [Apache] HTTP Server zum Einsatz. Der auf vielen Betriebssystemen laufende Webserver ist sehr stark verbreitet. Der Server ist modular aufgebaut und lässt sich dadurch gut an die an ihn gestellten Bedürfnisse anpassen. Für die Aufgaben der Datenhaltung kommt ein [MySQL]-Server zum Einsatz. Dieses häufig verwendete Datenbanksystem gewährleistet eine hervorragende Integration in die Webserverumgebung. Neben Skriptsprachen, wie ASP, Perl und Ruby ist PHP (Hypertext Preprocessor) für die serverseitige Gestaltung von dynamischen Webanwendungen seit ihrer Veröffentlichung im Jahre 1995 in der Akzeptanz und Verbreitung bemerkenswert gestiegen (vgl. [TIOBE]). Dies liegt vermutlich unter anderem daran, dass es umfangreiche Datenbankanbindungsmöglichkeiten gibt und zahlreiche Funktions- 9

15 3 Grundlagen bibliotheken verfügbar sind. Nicht zuletzt ist die Sprache so weit verbreitet, weil sie mittlerweile von nahezu jedem Webhosting-Provider angeboten wird und unter einer freien Lizenz benutzbar ist [PHPlic]. Wie auch beim Client, wird deutlich dass Performanceoptimierungen am Webserver an mehreren Bestandteilen des Systemes erfolgen kann. Die konkreten Maßnahmen dazu werden in Kapitel 5 betrachtet. 3.5 Messwerkzeuge und Messmethoden Die Performance von komplexen Webanwendungen mit Datenbankanbindung hängt in hohem Maße von der Anzahl der gespeicherten Datensätze in der Datenbank ab. Um die Zeit- und Performancemessungen miteinander vergleichen zu können, müssen sie stets mit einer konstanten Anzahl an Daten durchgeführt werden. Zu diesem Zweck wird bei jedem Start der Software per Skript der Inhalt der Datenbanktabellen gelöscht und mit dem Ausgangsdatensatz gefüllt. Entwickler-Tools des Internet Explorer Eine detaillierte Übersicht über die Größe aller zu ladenden Elemente, sowie der Zeit, die für das Laden benötigt wird, bieten die Entwickler Tools des Internet Explorer von Microsoft. Die Überblicksansicht (Abbildung 3) der Netzwerk-Tools liefert diverse Informationen über die geladenen Elemente der Seite. Darunter befindet sich auch eine Übersicht über die benötigte Zeit für den Ladevorgang. 10

16 3 Grundlagen Abbildung 3: Übersicht Netzwerk-Entwickler-Tools des Internet Explorer Die Detailansicht gewährt genaue Informationen des geladenen Elementes (Abbildung 4). Von hoher Relevanz für die Effizienz ist der Reiter Zeiten innerhalb dieser Ansicht. Die hier ersichtlichen Informationen liefern eine genaue Aufschlüsselung über Zeitverhalten des Ladevorganges dieses Elementes. So lässt sich genau ermitteln welchen Teil der Gesamtzeitspanne für die Anforderung (request) und wie viel Zeit für die Antwort (response) benötigt wurde. Nach Performanceoptimierungen auf der Serverseite sollte sich dieser gelb gekennzeichnete Zeitraum verkürzen. 11

17 3 Grundlagen Abbildung 4: Detailansicht Netzwerk-Entwickler-Tools des Internet Explorer Selbst entwickeltes Zeitmess-Tool Als zusätzliche Messmethode kommt ein eigens für diese Aufgabe entwickeltes Zeitmess-Tool zum Einsatz. Mit diesem Werkzeug wird skriptgesteuert eine Sequenz von mehreren aufeinanderfolgenden Seitenaufrufen durchlaufen. Die Folgeseite wird erst dann aufgerufen, wenn die aktuelle Seite vollständig geladen ist. Die dabei verstreichende Zeit wird festgehalten. Es wird eine deutliche Verkürzung der Durchlaufzeit nach den Modifikationen angestrebt. PHP-Profiling mit XDebug und KCachegrind Die Kombination dieser beiden Werkzeuge bildet einen PHP-Profiler. [XDebug] ist eine Erweiterung für PHP. Nach der Konfiguration des Tools legt es bei jedem Seitenbesuch eine Textdatei mit vielen nützlichen Informationen an. Zum Beispiel: Error Stack Traces - Aufzeichnung von Fehlermeldungen, Zeitpunkt des Auftretens, Codestelle, die die Fehlermeldung hervorgerufen hat 12

18 3 Grundlagen Function Traces - Aufzeichnung von allen Funktionsaufrufen, ihren Zeitverbrauch, Parametern und Rückgabewerten Code Coverage - Aufzeichnung, welche Codezeilen eines Skriptes während eines Requestes ausgeführt wurden. Das Programm [KCachegrind] visualisiert die von XDebug gesammelten Daten. Hiermit ist es möglich einen schnellen Überblick über die Vorgänge während der Ausführung eines Skriptes zu erhalten. Auf diese Weise können bottlenecks einfach aufgespürt werden. Abbildung 5: Screenshot KCachegrind Für den Einsatz der beiden Programme wurde ein virtuelles Linux (Ubuntu 12.04) eingerichtet, da die Einrichtung auf einem Windows Betriebssystem mit erheblichen Komplikationen verbunden ist. Profile SQL Ein weiteres nützliches Werkzeug ist das Programm [Profile SQL]. Es dient der Profilierung von Datenbankabfragen. Mit seiner Hilfe ist es möglich, alle Datenbankabfragen die während der Laufzeit eines Skriptes ausgeführt werden, zu analysieren (siehe Abbildung 5). So lässt sich 13

19 3 Grundlagen feststellen, welche Abfragen besonders viel Zeit bei der Ausführung in Anspruch nehmen. In einer Detailansicht zu den einzelnen Abfragen werden unter anderem Vorschläge für die Optimierung unterbreitet. Abbildung 6: Screenshot Profile SQL 14

20 4 Komplexe Webanwendung 4 Komplexe Webanwendung Im nachfolgenden Kapitel erfolgt eine kurze Vorstellung der komplexen Webanwendung, deren Effizienz im Verlaufe dieser Arbeit gesteigert werden soll. Die Software ist innerhalb eines Jahres bei der Astrium GmbH entwickelt worden. SQCDP Hinter dem Projektnamen SQCDP verbergen sich sie Anfangsbuchstaben der Wörter Safety, Quality, Cost, Delivery und People. Diese Begriffe sind Management- Teilbereiche für das produzierende Gewerbe. SQCDP ist eine Webanwendung für visuelles Management, was ein bedeutender Teil der Lean-Management-Philosophie (siehe [LEANVM]) ist Beschreibung Mit dieser Software ist es für jeden der Bereiche (Domain) Safety, Quality, Cost, Delivery und People möglich, sogenannte Fragesessions zu planen (scheduling) und durchzuführen (perform session). Eine Fragesession besteht aus einer Menge an Fragen zu jeder Domain. Diese können innerhalb der Session entweder als OK oder als NOK (not ok) deklariert werden. Sollte eine Frage als NOK deklariert werden, wird eine Abweichung (deviation) initiiert. Diese Abweichung wird einer Person (Actionee) als Action zugeordnet. Die Person bekommt automatisch eine mit den nötigen Informationen, inklusive einem Datum, bis zu dem er die offene Abweichung zu bearbeiten und schließen hat (Bsp. Abbildung 7). Alle Informationen über die Ergebnisse der Fragesessions werden in einer Datenbank gespeichert und können auf verschiedene Arten visualisiert werden. 15

21 4 Komplexe Webanwendung Abbildung 7: Aktivität Fragesession durchführen Neben dieser Kernfunktionalität gibt es noch zahlreiche weitere Features, die das Programm zu einem komplexen Gebilde haben wachsen lassen. Die folgende Auflistung beinhaltet einen groben Überblick über die wichtigsten Funktionen. Single Sign On Mit der Funktionalität Single Sign On (SSO) ist es möglich, den Nutzer automatisch zu authentifizieren. Die Webanwendung erhält per [NTLM] den Benutzernamen der Anmeldedaten des Betriebssystemes. Anhand dieser Information wird der Benutzer identifiziert, sodass eine weitere Anmeldeprozedur für die Webanwendung entfällt. Der Nutzer wird somit nicht gezwungen, sich zusätzliche Anmeldeinformationen merken zu müssen. User- und Rechtemanagement Die Software verfügt über ein umfangreiches User- und Rechtemanagement. Einem Benutzer können 4 verschiedene Rollen zugeordnet werden. 1. Administrator 2. Head of Cluster (HoC) 16

22 4 Komplexe Webanwendung 3. Inspector 4. Viewer Je nach Rolle hat der Benutzer mehr oder weniger Rechte innerhalb des Programms. Dateiverlinkungen Eine weitere wichtige Funktion ist, dass der Benutzer die Option hat, den einzelnen Fragen Dateien zuzuordnen. Diese Dateien (z.b.: MS Office, PDF, SAP) sind mit den Fragen verlinkt und lassen sich aus der Webanwendung heraus öffnen und, wenn es das Dateiformat zulässt, auch bearbeiten. Die Speicherung der Dateien an einem zentralen Ort (Netzlaufwerk) gewährleistet zum einen, dass nur berechtigte Nutzer Zugriff darauf haben und zum anderen dass keine Kopien der Dokumente erzeugt werden. So ist es möglich, dass sich die Fragen innerhalb der Sessions auf Dokumente beziehen, die kontinuierlich editiert werden. Diese Bündelung von relevanten Dokumenten zu jeder Domain trägt in hohem Maße zur Übersicht bei. Visualisierungen Die innerhalb der Fragesessions gesammelten Daten können auf mehrere Arten visualisiert werden. Unter der Rubrik Monthly Status (Abbildung 8) werden Diagramme gezeigt, die die Ergebnisse der einzelnen Domains veranschaulichen. Abbildung 8: Screenshot Monthly Status Sheet 17

23 4 Komplexe Webanwendung Zudem werden im Bereich Monthly Status domainweise Informationen über Fragesessions und Deviations ansprechend und übersichtlich dargestellt. Besucht der Nutzer die Startseite, bekommt er einen schnellen Überblick über den Status der vergangenen Sessions (Abbildung 9) und kann auf einen Blick sehen, ob aktuell eine Session geplant, geschlossen oder durchgeführt worden ist. Abbildung 9: Screenshot Startseite Abweichungsmanagement In dem Bereich Manage Deviations kann der Benutzer die für ihn oder seine Abteilung relevanten Deviations betrachten, bearbeiten und schließen. Wird eine Abweichung geschlossen, bekommt der Nutzer, der sie initiiert hat, automatisch eine . Zusätzlich gibt es die Rubrik Delegated Actions. Hier ist es möglich, unabhängig von Fragesessions und Domains Aktionen zu delegieren. Die hierbei aufgenommenen Daten sind kein Bestandteil der Statistiken und Visualisierungen. Reports generieren Jedem Administrator und HoC steht die Funktion SQCDP Reports zur Verfügung. Damit lassen sich PDF-Dokumente generieren, die vom Nutzer ausgewählte Inhalte, wie zum Beispiel den Status der einzelnen Domains, Bemerkungen zum Report, Diagramme, und Abweichungen beinhalten (Abbildung 9). Die Reports werden auf dem Webserver gespeichert und lassen sich aus der Anwendung betrachten und per , ggf. an Vorgesetzte, versenden. 18

24 4 Komplexe Webanwendung Abbildung 10: Screenshot Create Dashboard Struktur und Design Das Programm SQCDP ist mit folgenden Technologien, Sprachen und Bibliotheken entwickelt worden: objektorientiertes PHP 5 FPDF PDO Javascript jquery jqueryui Highcharts CSS HTML MySQL Eine Webanwendung mit PHP ausschließlich objektorientiert zu implementieren gelingt strukturbedingt nicht vollständig. Einige prozedurale Bestandteile lassen sich nicht vermeiden. Die Herausforderung liegt bei der Entwicklung darin, den prozeduralen Anteil so gering wie möglich zu halten. Wie in Abbildung 11 illustriert, ist die zentrale Seite von SQCDP die Datei index.php. Gesteuert durch den GET-Parameter page wird in ihr der gewünschte Inhalt geladen (include-datei). Durch dieses Vorgehen sind Änderungen am Layout stets nur an einer Datei durchzuführen. Innerhalb der include-datei werden, 19

25 4 Komplexe Webanwendung abhängig vom Kontext, meist per jquery Inhalte asynchron geladen. Auf der Ebene dieser AJAX-Inhalte kommt meist die PHP-Objektorientierung zur Anwendung. Abbildung 11: Allgemeine Struktur der Webanwendung SQCDP PHP Klassen werden grob in 3 Kategorien aufgeteilt. Klassen, deren Instanzen 1. Datenbankoperationen durchführen, 2. Daten verarbeiten und 3. Bildschirmausgaben erzeugen. 20

26 4 Komplexe Webanwendung Datenbank Die Struktur der relationalen MySQL Datenbank der Webanwendung ist aus dem Entity-Relationship Diagramm in Abbildung 12 ersichtlich. Auffällig hierbei ist, dass es keinerlei Relationen zwischen den Tabellen gibt. Dies ist dem Umstand geschuldet, dass während der Entwicklung häufig einzelne Datensätze gelöscht, beziehungsweise hinzugefügt wurden. Bei den anfänglich tatsächlich vorhandenen Beziehungen war oft ein bemerkenswerter Zeitansatz für das Löschen wegen den Constraints erforderlich, sodass die Relationen zunächst wieder gelöscht wurden. Das Etablieren dieser Verbindungen wird Bestandteil der Optimierungen im Zuge dieser Arbeit sein, damit unter anderem die referenzielle Integrität der Daten gewährleistet werden kann. Weiterhin wurde während der Entwicklung wenig Wert auf die Festlegung einer Speicher-Engine der Datenbank gelegt. Die zwei infragekommenden Speichersysteme sind [MYISAM] und [INNODB]. In Zusammenhang mit einer sinnvollen Indizierung der entsprechenden Schlüssel innerhalb der Datenbanktabellen wird eine der beiden Technologien ausgewählt und durchgehend implementiert werden. Sowohl bei diesen Maßnahmen als auch bei der Suche ineffizienter Datenbankabfragen wird ein hohes Optimierungspotential vermutet. 21

27 4 Komplexe Webanwendung mid_sections mid_section_id INT(11) mid_section_parent INT(11) mid_section_token VARCHAR(25) mid_section_name VARCHAR(255) mid_section_visible TINYINT(1) Indexes mid_usr_section_links mid_usr_sec_link_id INT(11) mid_usr_sec_link_usr_id INT(11) mid_usr_sec_link_section_id INT(11) mid_usr_sec_link_sqcdp_access_level INT(11) Indexes sqcdp_schedule sqcdp_sched_id INT(11) mid_sections_mid_section_id INT(11) sqcdp_sched_letter ENUM(...) sqcdp_sched_interval INT(11) sqcdp_sched_interval_seg ENUM(...) sqcdp_sched_timeframe INT(11) sqcdp_sched_timeframe_seg ENUM(...) Indexes sqcdp_sessions sqcdp_sess_id INT(11) sqcdp_schedule_sqcdp_sched_id INT(11) sqcdp_sess_status ENUM(...) sqcdp_sess_start VARCHAR(45) sqcdp_sess_stop VARCHAR(45) sqcdp_sess_num_quest_should INT(11) sqcdp_sess_num_quest_is INT(11) Indexes mid_usr mid_usr_id INT(11) mid_sections_mid_section_id INT(11) mid_usr_systemname VARCHAR(20) mid_usr_first_name VARCHAR(45) mid_usr_last_name VARCHAR(45) mid_usr_ VARCHAR(255) mid_usr_sqcdp_level INT(11) mid_usr_5a_level INT(11) mid_usr_register_date VARCHAR(45) Indexes sqcdp_question_deviation sqcdp_quest_dev_id INT(11) Indexes mid_invite_user sqcdp_user_tracking mid_invite_id VARCHAR(50) sqcdp_usr_tracking_id INT(11) mid_invite_ VARCHAR(70) sqcdp_usr_tracking_phpsessid VARCHAR(100) mid_invite_firstname VARCHAR(50) sqcdp_usr_tracking_name VARCHAR(50) mid_invite_lastname VARCHAR(50) sqcdp_usr_tracking_date VARCHAR(10) mid_invite_section INT(20) sqcdp_usr_tracking_start VARCHAR(8) mid_invite_userstatus INT(20) Indexes sqcdp_usr_tracking_stop VARCHAR(8) Indexes sqcdp_dashboards db_id INT(11) db_name VARCHAR(50) db_section INT(11) db_creator VARCHAR(30) db_date INT(40) Indexes sqcdp_report_charts sqcdp_report_chart_id INT(11) sqcdp_report_chart_report_id INT(11) sqcdp_report_chart_subreport_id INT(11) sqcdp_report_chart_filename VARCHAR(70) sqcdp_report_chart_number INT(11) sqcdp_report_chart_adding_time VARCHAR(30) Indexes sqcdp_questions sqcdp_quest_id INT(11) sqcdp_schedule_sqcdp_sched_id INT(11) sqcdp_quest_question LONGTEXT sqcdp_quest_sched_factor INT(11) sqcdp_quest_start VARCHAR(45) sqcdp_quest_stop VARCHAR(45) sqcdp_quest_visible TINYINT(1) Indexes sqcdp_question_files sqcdp_quest_files_id INT(11) sqcdp_quest_files_question_id INT(11) sqcdp_quest_files_filename VARCHAR(255) Indexes sqcpd_session_results sqcdp_sess_res_id INT(11) sqcdp_questions_sqcdp_quest_id INT(11) sqcdp_sessions_sqcdp_sess_id INT(11) sqcdp_question_deviation_sqcdp_quest_dev_id INT(11) sqcdp_sess_res_status ENUM('ok','nok') Indexes sqcdp_delegated_actions sqcdp_delact_id INT(11) sqcdp_delact_date_of_gather VARCHAR(20) sqcdp_delact_date_of_closing VARCHAR(20) sqcdp_delact_actionee VARCHAR(30) sqcdp_delact_opener VARCHAR(30) sqcdp_delact_title VARCHAR(200) sqcdp_delact_description LONGTEXT sqcdp_delact_log LONGTEXT sqcdp_delact_due_date VARCHAR(30) Indexes sqcdp_deviations sqcdp_dev_id INT(11) sqcdp_question_deviation_sqcdp_quest_dev_id INT(11) sqcdp_questions_sqcdp_quest_id INT(11) sqcdp_dev_dateofgather VARCHAR(45) sqcdp_dev_opener VARCHAR(50) sqcdp_dev_dateofclosing INT(11) sqcdp_dev_closer VARCHAR(45) sqcdp_dev_title VARCHAR(255) sqcdp_dev_description LONGTEXT sqcdp_dev_action_log LONGTEXT sqcdp_dev_actor VARCHAR(45) sqcdp_dev_timetosolve VARCHAR(45) sqcdp_dev_status ENUM(...) Indexes Abbildung 12: Entity-Relationenhip Diagramm der Webanwendung SQCDP 22

28 5 Effizienzsteigerung 5.1 Ziele 5 Effizienzsteigerung Die Software SQCDP befindet sich seit mehreren Monaten im Betrieb. Mit einer ständig wachsenden Datenbank machen sich zunehmend Effizienzprobleme, vor allem bei der Bereitstellung der Diagramme und bei weiteren Modulen, die komplexe Datenbankabfragen und häufige Iterationen der selektierten Datensätze beinhalten, bemerkbar. Im Fokus stehen unter anderem Maßnahmen, die diese Datenbankabfragen durch performantere ersetzen sollen. Weiterhin sollen in der gesamten Software Codestellen, die ein hohes Maß an Optimierungspotential vermuten lassen, ausfindig gemacht und optimiert werden. Dazu werden effizienzsteigernde Maßnahmen am Datenbankserver, sowie an den clientseitigen Technologien untersucht. Ziel ist es, die Effizienz der gesamten Software zu steigern und den Quellcode nötigenfalls leichter verständlich und wartbarer zu gestalten, sowie Fehler ausfindig zu machen und zu beheben. 5.2 Vorbereitende Maßnahmen Mittels der Direktive error reporting in der Konfigurationsdatei php.ini besteht die Möglichkeit, dem PHP-Interpreter Anweisungen geben, ob und welche Fehlermeldungen angezeigt werden. In einer Umgebung, in der die Software tatsächlich zum Einsatz kommt, ist die Ausgabe der Fehlermeldungen meist deaktiviert, um den Nutzer nicht mit unverständlichen Fehlermeldungen zu konfrontieren. Für die folgenden Optimierungsmaßnahmen wird der Wert der Anweisung auf die höchste Stufe (E ALL, E STRICT) festgelegt, um jegliche Fehlermeldungen zu erhalten. Nach dieser Maßnahme wurden alle Seiten der Webanwendung im Webbrowser aufgerufen, um festzustellen, ob Fehlermeldungen angezeigt werden. Angezeigte Fehler wurden behoben. 5.3 Statische Code-Analyse Automatische Analyse Die automatische Code-Analyse wird mittels der Entwicklungsumgebung [NETBEANS] durchgeführt. In die IDE lassen sich die Analysetools 23

29 5 Effizienzsteigerung [PHP Codesniffer] und [PHP - Mess Detector] einbinden. Der PHP-Codesniffer überprüft, ob in den Sprachen PHP, JavaScript und CSS Code-Conventions verletzt wurden. Mit dem PHP - Mess Detektor besteht die Möglichkeit, je nach gewähltem Regelset Fehler im Code, kopierte Codezeilen und unbenutzten Quellcode aufzuspüren. Nachdem die Metriken für beide Tools definiert wurden, konnte die Codeanalyse durchgeführt werden Ergebnis der automatischen Code-Analyse Trotz sorgfältig ausgewählter Metriken für die automatische Analyse brachte die Maßnahme rund 8000 Meldungen hervor. Für die Bearbeitung der in der IDE angezeigten Funde wurde folgende Priorisierung vorgenommen: 1. Syntaxfehler 2. Coderedundanzen 3. ungenutzte Funktionen 4. ungenutzte Variablen und Funktionsparameter Gemäß dieser Priorisierung sind die Funde der Analyse in Tabelle 1 aufgeführt. Anzahl bearbeiteter Fund 8 CSS Syntaxfehler 4 Redundanzen 17 ungenutzte Variablen 1 ungenutzte Klasse 8 ungenutzte Funktionen 7 ungenutzte Funktionsparameter Tabelle 1: Bearbeitete Funde der automatischen Code-Analyse Die in Tabelle 1 aufgezählten Fehler wurden im Quellcode des Programmes behoben. Alle weiteren Funde beinhalteten Unregelmäßigkeiten in der Code- Formatierung und wurden nicht bearbeitet, da einerseits der Code automatisch nach festgelegten Regeln formatiert wird und andererseits die Formatierung keinen Einfluss auf die Effizienz der Software hat. Die Redundanzerkennung wurde so konfiguriert, dass erst ab einer Übereinstimmung 24

30 5 Effizienzsteigerung von 10 Codezeilen Funde angezeigt werden. Die verhältnismäßig geringe Anzahl an relevanten Funden ist dadurch zu erklären, dass die IDE bereits während der Implementierung Fehler oder Unregelmäßigkeiten anzeigt. 5.4 Anzahl der Funktionsaufrufe minimieren Jeder Funktionsaufruf kostet Ressourcen. Dem gegenüber stehen die Grundsätze der objektorientierten Entwicklung, nach denen der Entwickler dazu angehalten wird, jegliche Aufgaben in Funktionen, beziehungsweise Methoden, zu schreiben. Dennoch gilt es, die Anzahl der Funktionsaufrufe so gering wie möglich zu halten. Dies wird erreicht, indem unnötige Funktionsaufrufe vermieden werden. Funktionen innerhalb von Schleifen-Parametern Gemäß [Padilla, S.87] sollen Funktionen innerhalb von Schleifen-Parametern vermieden werden, da bei jedem Schleifendurchlauf ein erneuter Funktionsaufruf erfolgt. 1 <? php 2 $arr = array (1,2,3,4,5,6,7,8,9,0); 3 for ($i =0; $i < count ( $arr ); $i ++) { 4 $x = sqrt ($i); 5 } 6?> Listing 1: Funtionsaufruf im Schleifenkopf In Listing 1 wird bei jedem Schleifendurchlauf die Funktion count($arr) aufgerufen. Wenn die Bedingung für die Anzahl der Durchläufe einmalig vor der for-schleife berechnet wird(siehe Listing 2), reduziert sich die Anzahl der Aufrufe in diesem Beispiel von zehn auf eins. 25

31 5 Effizienzsteigerung 1 <? php 2 $arr = array (1,2,3,4,5,6,7,8,9,0); 3 $numloops = count ( $arr ); 4 for ($i =0; $i < numloops ; $i ++) { 5 $x = sqrt ($i); 6 } 7?> Listing 2: Funtionsaufruf vor dem Schleifenkopf Bei der Suche nach diesem Muster im Quellcode des SQCDP-Programms wurden 95 for-schleifen gefunden, bei denen die count()-funktion im Schleifenkopf steht. Alle Funde wurden gemäß Listing 2 optimiert. Mittels PHP-Profiling (siehe Kapitel 3.5) ist die Anzahl der count()-aufrufe in einer Sequenz von Seitenaufrufen jeweils vor- und nach der Optimierung gezählt worden (siehe Tabelle 2). Include-File count()-aufrufe vor der Optimierung home.php performsession.php chartsdocuments.php overalltrend.php monthlystatussheet.php delegatedactions.php myactions.php managedeviations.php adminedituser.php admineditsection.php admineditschedule.php 67 8 admineditquestions.php 68 9 createdashboard.php showreports.php count()-aufrufe nach der Optimierung Tabelle 2: Anzahl count()-aufrufe vor und nach der Optimierung 26

32 5 Effizienzsteigerung Bei der Gegenüberstellung der Zahlen in der vorliegenden Sequenz der Seitenaufrufe ist eine Verringerung der Anzahl der count()- Aufrufe um rund 82% festzustellen. Um den effektiven Nutzen dieser Maßnahme benennen zu können, wurde eine Messreihe mit Hilfe der Internet-Explorer Entwicklertools (siehe Kapitel 3.5) exemplarisch an der include-datei adminedituser.php durchgeführt. Wie aus Tabelle 3 zu entnehmen ist, betrug die Anzahl der count()-aufrufe vor der Optimierung 671 und danach 76. Die Messungen des Zeitverhaltens brachten folgende Ergebnisse hervor: Messung Nr. Aufrufzeit vor Aufrufzeit nach der Optimierung [ms] der Optimierung [ms] ,4 101,6 Tabelle 3: Zeitverhalten beim Aufruf von adminedituser.php vor- und nach der for-count()-optimierung Vor jeder einzelnen Messung wurde der Browsercache vollständig gelöscht. Im vorliegenden Beispiel erbrachte die Maßnahme einen Zeitgewinn von durchschnittlich 13,8 ms. 27

33 5 Effizienzsteigerung 5.5 PHP-Profiling Unter Zuhilfenahme der Tools Xdebug und Kchachegrind (siehe Abschnitt 3.5) ist es möglich, genaue Informationen zu Funktions- und Klassenaufrufen während der Ausführung eines Skriptes zu erlangen. So lässt sich aufzeigen, welche Funktionen und Klassen wie oft aufgerufen werden und wie viel Zeit für deren Ausführung benötigt wird. Die Analyse mit diesen Werkzeugen liefert detaillierte Erkenntnisse über die internen Abläufe bei der Programmausführung und gibt Hinweise auf verbesserungswürdige Strukturen. Anzahl der MySQL-Verbindungsaufbauten reduzieren Bei dem PHP-Profiling wurde festgestellt, dass bei den Aufrufen der einzelnen Webseiten überdurchschnittlich viele Datenbank-Verbindungen aufgebaut werden (siehe Abbildung 13). Diese Verbindungsaufbauten wirken sich nachteilig auf das Zeitverhalten der Applikation aus. Abbildung 13: PHP-Profiling-Übersicht, MySQL-Verbindungsaufbauten Bei der Analyse des Quellcodes wurde ermittelt, dass für jede Datenbankabfrage eine eigene Verbindung aufgebaut wird (siehe Abbildung 13). 28

34 5 Effizienzsteigerung Abbildung 14: Klassendiagramm DB-Connections vor der Optimierung Durch eine umfassende Umstrukturierung des gesamten Quellcodes soll eine Minimierung der Anzahl der Verbindungsaufbauten erreicht werden. Zu diesem Zweck wird die DbConnect()-Klasse zu einem [Singelton]-Pattern gemäß Listing 3 umgestaltet. Durch diese Maßnahme wird erreicht, dass für jeden Gültigkeitsbereich innerhalb des Programmes nur ein Objekt für die Datenbank- Verbindung erzeugt wird. Der Gültigkeitsbereich eines Objektes in PHP entspricht dem eines HTTP-Request. Objekte werden demnach bei jedem Seitenwechsel implizit zerstört. Auch jeder asynchrone Request hat einen eigenen Gültigkeitsbereich. 29

35 5 Effizienzsteigerung 1 <? php 2 class DbConnect { 3 private static $db ; 4 private function construct ( $dbhost, $dbname, $dbuser, $dbpass ) { 5 include dbactions / dbsettings. php ; 6 try { 7 self :: $db = new PDO (" mysql : host = $dbhost ; dbname = $dbname ", $dbuser, $dbpass ); 8 } catch ( PDOException $e) {$e -> getmessage () ;} 9 } 10 public static function getconnection () { 11 if (! self :: $db ) { 12 new DbConnect ( $dbhost, $dbname, $dbuser, $dbpass ); 13 } 14 return self :: $db ; 15 } 16 } 17?> Listing 3: Singelton-Klasse für den MySQL-Verbindungsaufbau Andererseits wird die Referenz zu dem erzeugten Connection-Handle ($DBH) innerhalb des Gültigkeitsbereiches durch alle beteiligten Klassen weitergereicht. Dies erforderte eine umfangreiche Analyse des Quellcodes und der vorhandenen Strukturen, um sicherzustellen, dass das Connection-Handle an jeder Position zur Verfügung steht, an dem es benötigt wird. Dazu wurden der Konstruktor jeder Klasse, deren Aufgabe eine Datenbankoperation beinhaltet (DbActionClass), um den Parameter $DBH (database handle) erweitert. (Bislang riefen diese Klassen selbst die Klasse, die für den Verbindungsaufbau zuständig ist, auf.) In den nächsten Schritten wurde die Aufrufstruktur der DbActionClass bis zum Ursprung verfolgt und daraus ein Baumdiagramm (siehe Abbildung 15) erstellt, um für die nötigen Modifizierungen einen Überblick zu erhalten. In diesem Diagramm wurde ermittelt, welche Komponenten eine Instanz der Klasse DbConnect erzeugen müssen. Anhand dieser Hilfsmittel wurden Modifizierungen und Tests an allen beteiligten Klassen durchgenommen. Sehr hilfreich dabei waren die Suchen- und Ersetzen- 30

36 5 Effizienzsteigerung Funtionen der IDE. Jedoch ließ sich diese Aufgabe nicht vollends automatisieren, sodass viele Dateien manuell optimiert werden mussten. Abbildung 15: Aufruf-Struktur für das Connection-Handle Das PHP-Profiling wurde für eine definierte Sequenz vor- und nach der Optimierung mit folgenden Ergebnissen durchgeführt: 31

37 5 Effizienzsteigerung Include-File Aufrufe vor der Optimierung home.php performsession.php 33 2 chartsdocuments.php 21 1 overalltrend.php 41 5 monthlystatussheet.php 77 6 delegatedactions.php 11 3 myactions.php 74 3 managedeviations.php adminedituser.php 78 1 admineditsection.php 11 3 admineditschedule.php admineditquestions.php 22 2 createdashboard.php showreports.php DbConnect()- DbConnect()- Aufrufe nach der Optimierung Tabelle 4: Anzahl DbConnect()-Aufrufe vor und nach der Optimierung Bei der Gegenüberstellung der Zahlen in der vorliegenden Sequenz der Seitenaufrufe ist eine Verringerung der Anzahl der DbConnect rund 97% festzustellen. construct()- Aufrufe um Besonders auffällig ist die Verringerung der Verbindungsaufbauten beim Aufruf der Datei admineditschedule.php von 292 auf 1. Die Veränderung des Zeitverhaltens bei der Ausführung dieser Datei wurde mit Hilfe der Internet-Explorer-Entwicklertools (siehe Kapitel 3.5) gemessen. Die in der Messreihe ermittelten Ergebnisse sind in Tabelle 5 abgebildet. 32

38 5 Effizienzsteigerung Messung Nr. Aufrufzeit vor der Optimierung [ms] Aufrufzeit nach der Optimierung [ms] Tabelle 5: Zeitverhalten beim Aufruf von admineditschedule.php vor- und nach der DbConnect()-Optimierung Im Durchschnitt erbrachte die Reduzierung der DbConnect()-Aufrufe von 292 auf 1 beim Aufruf der Seite admineditschedule.php einen schnelleren Aufbau um 3848 Millisekunden. Die Seite steht dem Benutzer somit nach der Optimierung nach 3, 8% der ursprünglich benötigten Zeit für den Aufbau zur Verfügung. Das Schließen von Datenbankverbindungen geschieht implizit nach Abarbeitung des Requests auf dem Server. 5.6 Datenbankoptimierungen Für die Effizienzsteigerung der Datenbank werden folgend zwei Aspekte untersucht. Zum einen wird die Datenbankstruktur auf dem MySQL-Server betrachtet und nach Optimierungspotential gesucht. Zum anderen werden performanceintensive Datenbankabfragen - sogenannte slow queries - aufgespürt und, wenn möglich, durch performantere Abfragen ersetzt. 33

39 5 Effizienzsteigerung Ineffiziente Datenbankabfragen - slow queries Im Rahmen der bisherigen Optimierungsmaßnahmen wurden bereits Seiten ausfindig gemacht, die ein besonders schlechtes Zeitverhalten aufweisen. Die Analyse dieser Seiten, einerseits mit dem PHP-Profiler (siehe Kapitel 3.5) und andererseits mit dem SQL-Profiler (siehe Kapitel 3.5) führte zu der Erkenntnis, dass die Verzögerungen durch slow queries verursacht werden. So ist beim PHP-Profiling zu erkennen, dass sehr viel Zeit bei der PHP-PDO 2 -Methode execute verbraucht wird (siehe Abbildung 16). Abbildung 16: Ressourcenverbrauch der PHP-PDO-execute Anweisung Den Hinweisen durch den PHP-Profiler, dass bei der Ausführung der Datenbankabfragen Verzögerungen auftreten, wurde mit Hilfe des SQL-Profilers (siehe Abbildung 17) weiter nachgegangen. Diese Analyse führte bei jedem untersuchten Skript zur gleichen Ursache - verschachtelte Unterabfragen (subselects). 2 PHP Data Objects - Abstraktionsebene für den Datenbankzugriff 34

40 5 Effizienzsteigerung Abbildung 17: SQL-Profiler - Ressourcenverbrauch von subselects Für die Analyse dieses Problems wird repräsentativ die include-datei myactions.php betrachtet. Ruft der Benutzer der Software die Seite My Actions in der Kategorie Manage Deviations auf, bekommt er einen Überblick über alle offenen und geschlossenen Abweichungen und Aktionen, die seiner Person zugeordnet sind. Demnach müssen aus der Datenbank alle Abweichungen, die im Zusammenhang mit diesem Benutzer stehen, abgerufen werden. Die Datenbankabfrage für die benötigten Informationen lautet also zunächst: 1 SELECT * FROM sqcdp_deviations WHERE sqcdp_dev_actor =? Listing 4: MySQL Abfrage für alle Aktionen eines Benutzers Als zusätzliche Information soll dem Benutzer angezeigt werden, aus welcher Abteilung des Unternehmens die jeweilige Aktion stammt. Da in der normalisierten Tabellenstruktur der Datenbank (siehe Abbildung 12) in der Tabelle sqcdp deviations diese Information nicht enthalten ist, wird für jedes Ergebnis der Abfrage aus Listing 4 (PHP-skriptgesteuert) eine weitere verschachtelte Abfrage durchgeführt, die die nötige Information liefert (siehe Listing 5). 35

41 5 Effizienzsteigerung 1 SELECT mi d_sect ion_to ken FROM mid_sections WHERE mid_section_id IN 2 ( SELECT mid_sections_mid_section_id FROM sqcdp_schedule WHERE sqcdp_sched_id IN 3 ( SELECT sqcdp_schedule_sqcdp_sched_id FROM sqcdp_sessions WHERE sqcdp_sess_id IN 4 ( SELECT sqcdp_sessions_sqcdp_sess_id FROM sqcpd_session_results WHERE sqcdp_question_deviation_sqcdp_quest_dev_id IN 5 ( SELECT sqcdp_question_deviation_sqcdp_quest_dev_id FROM sqcdp_deviations WHERE 6 sqcdp_dev_id =? AND 7 sqcdp_dev_actor =?)))) Listing 5: MySQL Abfrage mit subselects Diese Abfrage beinhaltet vier subselects. Der Pfad der Abarbeitung dieses MySQL- Statements ist in Abbildung 18 dargestellt. Verschachtelte Unterabfragen in MySQL sind sehr ineffizient, da für jede Abfrage, die ein Ergebnis liefert, alle untergeordneten Abfragen durchgeführt werden, die jeweils auch mehrere Ergebnisse hervorbringen können. 36

42 5 Effizienzsteigerung Abbildung 18: Beteiligte Datenbanktabellen für die Abfrage aus Listing 5 Im vorliegenden Beispiel bedeutet das, dass für jedes zurückgelieferte Ergebnis aus Listing 4 auf fünf Ebenen Unterabfragen durchgeführt werden. Dieser Vorgang lastet die Ressourcen auf dem Datenbankserver erheblich aus. Bei einer stetig wachsenden Datenmenge erhöht sich die Anzahl der Abfragen demnach exponentiell, was zu erheblichen Performanceeinbußen führt. Um diesem Vorgang zu entgegenzuwirken, wird der subselect in einen impliziten INNER-[JOIN] umgewandelt. Dabei werden alle beteiligten Datenbanktabellen bedingt zu einer Tabelle zusammengefügt, was in der Regel das Zeitverhalten von Abfragen normalisierter Datenbanken im Gegensatz zu subselects positiv beeinflusst. Die Abfrage aus Listing 5 wird zu der aus Listing 6 umgestaltet. 37

43 5 Effizienzsteigerung 1 SELECT 2 sections. mid_ sectio n_toke n 3 FROM 4 mid_sections as sections, 5 sqcdp_schedule as schedules, 6 sqcdp_sessions as sessions, 7 sqcdp_session_results as results, 8 sqcdp_deviations as deviations 9 WHERE 10 schedules. mid_section_mid_section_id = 11 sections. mid_section_id 12 AND 13 sessions. sqcdp_schedule_sqcdp_schedule_id = 14 schedules. sqcdp_sched_id 15 AND 16 results. sqcdp_sessions_sqcdp_sess_id = 17 sessions. sqcdp_sess_id 18 AND 19 deviations. sqcdp_question_deviation_sqcdp_quest_dev_id = 20 results. sqcdp_question_deviation_sqcdp_quest_dev_id 21 AND 22 deviations. sqcdp_dev_id =? 23 AND 24 deviations. sqcdp_dev_actor =? Listing 6: Impliziter MySQL INNER-JOIN Um den Nutzen dieser Maßnahme benennen zu können, wurden Performancemessungen mit Hilfe der Entwickler-Tools des Internet-Explorer für den Aufruf der include-datei myactions.php vor und nach der Modifizierung vorgenommen (siehe Tabelle 6). 38

44 5 Effizienzsteigerung Messung Nr. Aufrufzeit mit subselects [ms] Aufrufzeit INNER-JOINS [ms] ,7 31,6 mit Tabelle 6: Zeitverhalten beim Aufruf von myactions.php mit subselects und INNER-JOINS Der direkte Vergleich von subselects und INNER-JOINS an dem Beispiel myactions.php zeigte einen schnelleren Aufbau der Seite um ca. 33,75%. Die projektweite Suche mit Netbeans brachte insgesamt 14 Datenbankabfragen mit subselects hervor, die alle nach dem in diesem Abschnitt beschriebenen Muster zu INNER-JOIN-SELECTS geändert wurden. 39

45 5 Effizienzsteigerung Datenbankstruktur Speicher-Engine Wie bereits in Kapitel festgestellt, ist bei der Entwicklung der Datenbank wenig Wert auf die Auswahl der passenden Speicher-Engine gelegt worden. Bei der Analyse der Tabellenstruktur ist festgestellt worden, dass sieben der insgesamt fünfzehn Tabellen mit dem Speicher-System [MYISAM] und die restlichen mit [INNODB] im Datenbanksystem hinterlegt werden (siehe Listing 7, Zeile 10 und 19) CREATE TABLE mid_invite_user ( 3 mid_ invite_ id varchar ( 50), 4 mid_ invite_ varchar ( 70), 5 mid_invite_firstname varchar (50), 6 mid_invite_lastname varchar (50), 7 mid_invite_section int (20), 8 mid_invite_userstatus int (20), 9 PRIMARY KEY ( mid_invite_id ) 10 ) ENGINE = InnoDB ; CREATE TABLE mid_sections ( 13 mid_ section_ id int ( 11), 14 mid_section_parent int (11), 15 mid_ sectio n_ toke n varchar ( 25), 16 mid_ section_ name varchar ( 255), 17 mid_section_visible tinyint (1), 18 PRIMARY KEY ( mid_section_id ) 19 ) ENGINE = MyISAM ; Listing 7: Auszug MySQL Create-Skript der SQCDP-Datenbank 3 Grundlage für eine Effizienzsteigerung der Datenbankstruktur ist die Festlegung eines einheitlichen Speicher-Systemes. Da ca. 95 % der Datenbankoperationen SE- LECT -Anweisungen sind, haben folgende Gründe zu der Entscheidung beigetra- 3 Aus Gründen der Übersichtlichkeit wurden in dem CREATE-Skript Informationen, wie die Koalition und NULL-Belegung sowie AUTO INCREMENT der Tabellenspalten weggelassen. 40

46 5 Effizienzsteigerung gen, [INNODB] als Speichersystem zu wählen: Schnell bei SELECT, langsamer bei UPDATE und INSERT Liefert Möglichkeiten für Referentielle Integrität Unterstützt Transaktionen Bei UPDATE und INSERT werden nur einzelne Datensätze und nicht die gesamte Tabelle für Zugriffe gesperrt Aufgrund dieser Erkenntnisse wurde mit der Suchen- und Ersetzen-Funktion von Netbeans das MySQL-CREATE-Skript der gesamten Datenbank so angepasst, dass für die Speicherorganisation ausschließlich INNODB genutzt wird Indizes Die Verwendung von Indizes dient dazu, die Suche von bestimmten Datensätzen zu beschleunigen. Indizierte Tabellenspalten werden in einem B-Baum gespeichert (siehe [Saake, S.338]). Zum Vergleich wird der Aufwand für eine sequenzielle Suche mit der Suche in einem binären Suchbaum mit n Einträgen in O-Notation ausgedrückt. sequenzielle Suche : O(n) Suche im Binärbaum Suche : O(log 2 n) Demnach ist die Etablierung von Indizes eine vielversprechende Maßnahme, um eine Performancesteigerung herbeizuführen. Da MySQL eben diese Indizes für die Suche in Datenbanken verwendet, müssen nun Spalten in den Datenbanktabellen ermittelt werden, die indiziert werden sollen. Grundsätzlich speichert INNODB alle Primärschlüssel als Indizes. Weitere indizierungswürdige Tabellenspalten sind folglich alle diejenigen, die innerhalb der WHERE-Klauseln der Datenbankabfragen erscheinen (siehe [MySQL Indizes]). Eine Untersuchung aller WHERE-Klauseln erbrachte folgende Ergebnisse: 41

47 5 Effizienzsteigerung Datenbanktabelle mid invite user mid usr mid usr section links sqcdp dashboards sqcdp delegated actions sqcdp deviations sqcdp questions sqcdp question files sqcdp schedule sqcdp sessions sqcpd session results Spalten in WHERE-Klausel mid invite mid usr systemname mid usr mid usr sec link usr id db section sqcdp delact actionee sqcdp delact date of closing sqcdp delact opener sqcdp questions sqcdp quest id sqcdp dev actor sqcdp dev status sqcdp dev dateofgather sqcdp quest dev id sqcdp schedule sqcdp sched id sqcdp quest files question id sqcdp quest files filename mid sections mid section id sqcdp sched letter sqcdp schedule sqcdp sched id sqcdp sess status sqcdp sessions sqcdp sess id sqcdp quest dev id sqcdp sess res status sqcdp questions sqcdp quest id Tabelle 7: Tabellenspalten in WHERE-Klauseln Exemplarisch für alle hinzuzufügenden Indizes ist in Listing 8 das geänderte MySQL- CREATE-Skript für die Tabelle sqcdp deviations zu betrachten. Die Anweisungen für die Indizierung sind in den Zeilen 7-12 enthalten (PRIMAREY KEY, KEY ). 42

48 5 Effizienzsteigerung CREATE TABLE IF NOT EXISTS sqcdp_deviations ( 3 sqcdp_ dev_ id int ( 11), 4 sqcdp_quest_dev_id int (11), sqcdp_dev_status enum ( 1, 2, 3, 4,), 7 PRIMARY KEY ( sqcdp_dev_id ), 8 KEY ( sqcdp_question_deviation_sqcdp_quest_dev_id ), 9 KEY ( sqcdp_questions_sqcdp_quest_id ), 10 KEY ( sqcdp_dev_actor ), 11 KEY ( sqcdp_dev_status ), 12 KEY ( sqcdp_dev_dateofgather ) 13 ) ENGINE = InnoDB ; Listing 8: Auszug MySQL-Create-Skript mit Indizes der SQCDP-Datenbank Relationen In einigen Datenbanktabellen sind Spalten vorgesehen, die den Inhalt anderer Tabellen enthalten. Um auf Seiten der Datenbank dafür zu sorgen, dass in der abhängigen Tabelle nur Werte gespeichert werden können, die in der Mastertabelle tatsächlich vorhanden sind, bietet INNODB die Möglichkeit, Relationen herzustellen. Dazu werden Spalten, die in Beziehung zu Inhalten von anderen Tabellenspalten gesetzt werden sollen, mit Fremdschlüsselattributen (FOREIGN KEY CONSTRAINTS) versehen. Zweck dieser Maßnahme ist vor allem, die referentielle Integrität sicherzustellen. Um die Relationen etablieren zu können, muss die Tabellenstruktur zuerst gründlich analysiert werden, um gemeinsame Felder zu identifizieren. Dafür eignete sich das ER-Diagramm aus Abbildung 12. Darin wurden zunächst alle Verbindungen eingezeichnet (siehe Abbildung 19). Anschließend ist das CREATE-Skript der gesamten Datenbank entsprechend dieser Verbindungen modifiziert worden. 43

49 5 Effizienzsteigerung Abbildung 19: Manuelle Relationensuche auf Grundlage des ER-Diagramms Repräsentativ für alle Tabellen, die modifiziert wurden, zeigt Listing 9 das Create- Skript für die Tabelle sqcdp deviations auszugsweise. In den Zeilen 7-11 sind die FOREIGN KEY -Anweisungen abgebildet. Die Zusatzanweisungen ON DELETE CASCADE und ON UPDATE CASCADE bewirken, dass beim Löschen oder Aktualisieren von Einträgen in den Mastertabellen, auf die verwiesen wird, die Einträge in den Kind-Tabellen ebenfalls gelöscht oder aktualisiert werden. Damit ist die referentielle Integrität gewährleistet. 44

50 5 Effizienzsteigerung 1 CREATE TABLE IF NOT EXISTS sqcdp_deviations ( 2 sqcdp_ dev_ id int ( 11), 3 sqcdp_quest_dev_id int (11), sqcdp_dev_status enum ( 1, 2, 3, 4 ), 6 PRIMARY KEY ( sqcdp_dev_id ), 7 FOREIGN KEY ( sqcdp_quest_dev_id ) REFERENCES sqcdp_question_deviation ( sqcdp_quest_dev_id ) ON DELETE CASCADE ON UPDATE CASCADE, 8 FOREIGN KEY ( sqcdp_questions_sqcdp_quest_id ) REFERENCES sqcdp_questions ( sqcdp_quest_id ) ON DELETE CASCADE ON UPDATE CASCADE, 9 FOREIGN KEY ( sqcdp_dev_actor ) REFERENCES mid_usr ( m id_ us r_ sy st em Na me ) ON DELETE CASCADE ON UPDATE CASCADE, 10 FOREIGN KEY ( sqcdp_dev_closer ) REFERENCES mid_usr ( m id_ us r_ sy st em Na me ) ON DELETE CASCADE ON UPDATE CASCADE, 11 FOREIGN KEY ( sqcdp_dev_opener ) REFERENCES mid_usr ( m id_ us r_ sy st em Na me ) ON DELETE CASCADE ON UPDATE CASCADE, 12 KEY ( sqcdp_dev_status ), 13 KEY ( sqcdp_dev_dateofgather ) 14 ) ENGINE = InnoDB ; Listing 9: Auszug MySQL Create-Skript der Tabelle sqcdp deviations mit Fremdschlüsseln 4 Im ER-Diagramm in Abbildung 20 ist die Struktur der Datenbank für das Programm SQCDP nach der Optimierung abgebildet. 4 Aus Gründen der Übersichtlichkeit wurden in dem CREATE-Skript Informationen, wie die Koalition und NULL-Belegung sowie AUTO INCREMENT der Tabellenspalten weggelassen. 45

51 5 Effizienzsteigerung Abbildung 20: ER-Diagramm nach Optimierungen der Struktur Nutzen Um den Nutzen dieser Maßnahme zu umreißen, wurden Performancemessungen an einer include-datei vorgenommen, deren Zeitverhalten bislang verbesserungswu rdig erschien. Dazu wurde mit den Entwickler-Tools des Internet Explorer eine Messreihe vor- und eine Messreihe nach der Modifikation durchgefu hrt. Die Betrachtung fiel auf die include-datei home.php, die fu r die Darstellung der auf der Startseite befindlichen Schnellu bersicht (siehe Abbildung 9) der vergangenen Fragesessions verantwortlich ist. 46

52 5 Effizienzsteigerung Messung Nr. Aufrufzeit mit Aufrufzeit mit bisheriger Tabellenstruktustruktur neuer Tabellen- [ms] [ms] ,2 68,1 Tabelle 8: Zeitverhalten beim Aufruf von home.php ohne- und mit modifizierter MySQL-Tabellenstruktur Im Beispiel der Datei home.php erbrachte die Optimierung der Datenbankstruktur eine im Mittel rund 40,9% schnellere Ladezeit. 5.7 Caching Eine weitere Möglichkeit, das Zeitverhalten von Programmen positiv zu beeinflussen ist das Caching. Dabei werden verschiedene Inhalte, die häufig benötigt werden oder deren Berechnung viele Ressourcen verlangt, in einem Zwischenspeicher (Cache) abgelegt. Das Caching kann auf dem Webserver und dem Webbrowser in verschiedenen Ebenen stattfinden Browsercache Der Webbrowser speichert besuchte Webseiten gemäß Voreinstellungen in einem temporären Zwischenspeicher, um bei einem erneuten Aufruf der Seite nicht einen HTTP-Request durchführen zu müssen, sondern zeitsparend auf die auf der Fest- 47

53 5 Effizienzsteigerung platte des Client-Systemes gespeicherten Daten zurückzugreifen. Für dynamische Webapplikationen, bei denen sich der Inhalt der Seite häufig ändert, ist es jedoch oft zweckmäßig, den Inhalt der Seite bei jedem Request neu laden zu lassen. Gerade bei asynchronen Anfragen ist es unbedingt notwendig, den Browser per Skript mitzuteilen, dass der Inhalt unter allen Umständen vom Webserver geladen werden muss (siehe Listing 10). 1 $. ajaxsetup ({ cache : false }); Listing 10: jquery-anweisung - Inhalt nicht aus dem Browsercache laden Der Webbrowser cacht neben den HTML-Seiten außerdem auch ausgelagerte CSS- Stylesheets, JavaScript-Funktionen und Bibliotheken sowie Grafiken. Dies kommt auch dynamischen Webanwendungen zugute, da sich diese eingebundenen Dateien während der Benutzung einer solchen Applikation meist nicht verändern. Mit den Entwickler-Tools des Internet Explorer konnte ermittelt werden, dass die zentrale CSS-Datei von SQCDP, mit einer Größe von rund 42 Kilobyte, innerhalb von 15 Millisekunden geladen war, wenn nicht auf den Cache zurückgegriffen wurde. Die gecachte Datei hingegen stand in weniger als einer Millisekunde zur Verfügung. Bei der Entwicklung von Webanwendungen spielt die Einbeziehung des Browser Cache eine untergeordnete Rolle, da der Benutzer des Programmes die relevanten Einstellungen für das Cachingverhalten des Browsers meist manipulieren kann Skriptgesteuertes Caching Eine weitere Möglichkeit oft genutzte oder rechenintensive Inhalte schnell verfügbar zu machen ist das skriptgesteuerte Caching auf PHP-Basis (statifizieren). Dabei wird die statische HTML-Seite, die der Webserver nach allen Berechnungen und Datenbankzugriffen an den Client schickt, auf dem Server gespeichert. Beim nächsten Aufruf der Seite greift der Server dann auf die gecachte Seite zu und muss keine Berechnungen und Datenbankzugriffe durchführen. Großer Vorteil dieser Vorgehensweise ist, dass keinerlei Änderungen am Web- oder Datenbankserver vorgenommen werden müssen. Bei den ersten Implementierungsversuchen zu diesem Thema wurde zunächst auf Ebene der include-seiten (siehe Abbildung 11) gecacht. Dabei wurde festgestellt, dass nicht der Inhalt, den der Browser beim Client anzeigt gecacht wird, sondern 48

54 5 Effizienzsteigerung lediglich die jquery - AJAX - Anweisungen, die die Inhalte nachladen. (siehe Listing 11) 1 $("# sessionleftlayer "). load (" monthlychartsthumbnails. ajx. php "); Listing 11: jquery-anweisung - Inhalt asynchron laden Dies führte zu der Erkenntnis, dass auf der Ebene gecacht werden muss, auf der die rechenintensiven und datenbanklastigen Operationen durchgeführt werden. Für das Caching wurden Seiten ausgewählt bei deren Aufruf serverseitig viel Last erzeugt wird. Exemplarisch wird das Vorgehen zur Entwicklung des Caching- Systems anhand der include-datei monthlystatussheet.php erläutert. Bei der Betrachtung dieser Seite wird dem Benutzer eine grafische Übersicht über die Abweichungen der einzelnen Domains gezeigt (siehe Abbildung 8). Auf dem linken Teil der auf dem Bildschirm angezeigten Seite kann der Benutzer Diagramme, die statistische Informationen über Abweichungen der jeweiligen Domain zeigen, betrachten. Auf der rechten Seite sieht er eine Auflistung der offenen Abweichungen. Die Aufrufstruktur dieser Seite ist der Abbildung 21 zu entnehmen. 49

55 5 Effizienzsteigerung Abbildung 21: Aufrufstruktur der include-datei monthlystatussheet.php Die erste Herausforderung besteht darin, ein Dateisystem für die Speicherung der gecachten Seiten zu entwickeln, um identifizieren zu können, zu welchem Benutzer und zu welcher Abteilung die gecachte Seite gehört. Anhand des Dateinamen der aufgerufenen Seiten ist diese Identifizierung nicht möglich, da für jeden Benutzer die gleichen Seiten bei den gleichen Aufgaben aufgerufen werden. Die Identifikation findet anhand der Session-Variablen $sectionid und $scheduleid statt. 1 <? php 2 $cachepath =./ cache /. $sectionid. /. $scheduleid. / ; 3 if (! file_exists ( $cachepath )) { 4 mkdir ( $cachepath, 0777, TRUE ); 5 } 6?> Listing 12: PHP - Anlegen des Caching-Verzeichnisses Listing 12 verdeutlicht, wie das Caching-Verzeichnis angelegt wird. Dabei wird in Zeile 4 für jede Abteilung ($sectionid) und jede Domain ($scheduleid) eine eigenes 50

56 5 Effizienzsteigerung Verzeichnis angelegt, sofern es noch nicht existiert. Im Austausch der jeweiligen Ids gegen ihre Bezeichnungen ergäbe sich beispielhaft folgende Struktur: Abteilung 1 Safety Quality Cost Delivery People Abteilung 2 Safety Quality Cost Delivery People Nun, da die strukturellen Voraussetzungen für das Caching gegeben sind, können die gewünschten Inhalte gespeichert werden. Für die Anzeige der Diagramme sind Anpassungen an der Datei monthlychartsthumbnails.ajx.php notwendig. Wie in Abbildung 21 ersichtlich, werden die 4 Diagramme (rote Umrandung) von dieser Datei geladen. Demnach muss an dieser Stelle entschieden werden, ob auf den Cache zurückgegriffen wird oder nicht. Listing 13 verdeutlicht dieses Vorgehen. In den Zeilen 2 bis 5 wird ein Array mit Dateinamen gefüllt, welches in der folgenden Schleife iteriert wird. Ist bereits eine gecachte Datei vorhanden, so wird sie aus dem Cache geladen. Wenn nicht, wird die Originaldatei aufgerufen. Im darauf folgenden JavaScript-Block werden dann die Dateien per load()-anweisung geladen. 51

57 5 Effizienzsteigerung 1 <? php 2 $filename [] = chartthumbtop5. ajx. php ; 3 $filename [] = chartthumbopendeviations. ajx. php ; 4 $filename [] = chartthumbdeviationsperquestion. ajx. php ; 5 $filename [] = chartthumbaskedquestions. ajx. php ; 6 $numfiles = count ( $filename ); 7 for ( $i = 0; $i < $numfiles ; $i ++) { 8 // look for existing file in cache 9 if ( file_exists ( $cachepath. $filename [ $i ])) { 10 $loadfile [] = $cachepath. $filename [ $i ]; 11 } else { 12 $loadfile [] = $filename [ $i ]; 13 } 14 } 15 $i = 0; 16?> 17 <script type =" text / javascript "> 18 $( document ). ready ( function () { 19 $("# chartthumb1 "). load (" <? php echo $loadfile [$i ]; $i ++;? > "); 20 $("# chartthumb2 "). load (" <? php echo $loadfile [$i ]; $i ++;? > "); 21 $("# chartthumb3 "). load (" <? php echo $loadfile [$i ]; $i ++;? > "); 22 $("# chartthumb4 "). load (" <? php echo $loadfile [$i ]; $i ++;? > "); 23 }); 24 </ script > Listing 13: PHP, JavaScript - Gecachte Seite zeigen oder Originaldatei aufrufen (monthlychartsthumbnails.ajx.php) Nachdem die Inhalte dargestellt sind, wird die Cache-Belegung erneut ausgewertet und bei Bedarf der Cache mit Inhalt gefüllt (siehe Listing 14). Dazu wird bei einem Cache-Miss in Zeile 4 der Output-Buffer gestartet. Das hat zur Folge, dass alle folgenden Ausgaben nur im Puffer gespeichert und nicht angezeigt werden. In Zeile 7 werden dann die gepufferten Daten in einer Datei abgelegt und gespeichert, bevor letztendlich in Zeile 8 der Ausgabepuffer wieder gelöscht und freigegeben wird. 52

58 5 Effizienzsteigerung 1 <? php 2 for ( $i = 0; $i < $numfiles ; $i ++) { 3 if (! file_exists ( $cachepath. $filename [$i ])) { 4 ob_start (); 5 include_once $filename [ $i ]; 6 // write cache 7 file_put_contents ( $cachepath. $filename [$i], ob_get_contents ()); 8 ob_end_clean (); 9 } 10 } 11?> Listing 14: PHP - Bei Cache-Miss füllen des Caches (monthlychartsthumbnails.ajx.php) Das in diesem Abschnitt beschriebene Vorgehen wurde ebenfalls für die Datei renderopendeviations.ajx.php (siehe Abbildung 21)durchgeführt. Abbildung 22 verdeutlicht, welche Einsparungen beim Aufruf der gecachten Datei gegenüber dem der Originaldatei möglich sind. 53

59 5 Effizienzsteigerung Abbildung 22: Zugriff auf gecachte Datei Im nächsten Schritt muss bestimmt werden, wie lange die gecachten Seiten gültig sind. Die Inhalte der Seite beziehen sich auf Daten, die im Zusammenhang mit Fragesessions und Abweichungen stehen. Demnach ist eine gecachte Seite gültig, so lange sich an diesen Daten nichts ändert. Eine Analyse in diesem Bereich führte zu der Erkenntnis, dass die entsprechenden Daten sich ändern, wenn eine neue Fragesession in der Domain durchgeführt oder wenn der Status einer Abweichung geändert wird. Treten diese Situationen ein, wird das Cache-Verzeichnis mit dem entsprechenden Ordnernamen gelöscht (siehe Listing 15). 54

60 5 Effizienzsteigerung 1 <? php 2 class DeleteCache { 3 public function construct ( $folder ) { 4 $delete = " cache /". $folder ; 5 if ( is_dir ( $delete )) { 6 $objects = scandir ( $delete ); 7 foreach ( $objects as $object ) { 8 if ( $object!= "." && $object!= "..") { 9 unlink ( $delete. "/". $object ); 10 } 11 } 12 rmdir ( $delete ); 13 } 14 } 15 } 16?> Listing 15: PHP - Cache-Dateien löschen (DeleteCache.class.php) Um den Nutzen dieser Maßnahme erfassen zu können, wurden Messungen mit den Entwickler-Tools des Internet Explorer zu dem Zeitverhalten der include-datei monthlystatussheet.php vor- und nach der Implementierung des Caching-Systems durchgeführt. Die Ergebnisse dieser Messungen sind Tabelle 9 zu entnehmen. 55

61 5 Effizienzsteigerung Messung Nr. Aufrufzeit ohne Aufrufzeit Caching [ms] Caching [ms] ,3 21 mit Tabelle 9: Zeitverhalten beim Aufruf von monthlystatussheet.php mit und ohne Caching Die durchschnittliche Ladezeit für das Beispiel monthlystatussheet.php verbesserte sich nach dem Caching um rund 60,6%. 56

62 6 Performancemessung 6.1 Messsystem 6 Performancemessung Das Betriebssystem, auf dem die Messungen durchgeführt werden, ist Windows 7 Ultimate von Microsoft. Um die Portabilität des Systemes gewährleisten zu können und um Kontrolle über die Ressourcen und laufenden Prozesse zu haben, läuft es als virtuelle Maschine in dem Programm VMWare-Player. Der virtuellen Maschine werden 8 GB DDR-3 Arbeitsspeicher mit 1600 MHz, sowie 4 Kerne eines Intel I7-870 (Lynnfield) Prozessors mit 2,93 GHz zugeteilt. Als Webbrowser wurde der Internet-Explorer 9 von Microsoft verwendet. Auf dem System wurde ein XAMPP- Stack mit folgenden relevanten Komponenten installiert: Apache MySQL PHP phpmyadmin XAMPP Control Panel Während der Modifizierungen und Messläufe bestand keine Netzverbindung zu Bestandteilen außerhalb des Systems. 6.2 Datenbankeinträge Um die Messungen vergleichbar zu gestalten, wurde die Datenbank vor jedem Durchlauf skriptgesteuert mit der gleichen Anzahl an Datensätzen versehen. In der Datenbank befanden sich zum Zeitpunkt jeder Messung folgende Mengen an Einträgen: 57

63 6 Performancemessung Datenbank-Tabelle Anzahl der Einträge mid invite user 25 mid sections 24 mid user 67 mid usr section links 121 sqcdp dashboards 18 sqcdp delegated actions 31 sqcdp deviations 233 sqcdp questions 219 sqcdp question deviations 193 sqcdp question files 119 sqcdp schedule 116 sqcdp sessions 2731 sqcdp usr tracking 1119 sqcdp session results 1962 gesamt 6985 Tabelle 10: Anzahl der Datenbankeinträge zum Zeitpunkt der Messung 6.3 Messaufbau und Messmethode Eigenes Messtool Gemäß Kapitel 3.5 wird für die Performancemessung skriptgesteuert eine Sequenz von Seitenaufrufen durchlaufen. Dazu wird bei dem Aufruf der Startseite serverseitig die Anfangszeit der Messung ermittelt und ein superglobales Session-Array initialisiert (siehe Listing 16). In diesem Array befinden sich in jedem Element der einzelnen URL der Sequenz (siehe Listing 17). An den URL ist ein GET-Parameter threshold angehängt. Der Wert des Parameters gibt an, wie viele Elemente in diese Seite index.php asynchron via jquery geladen werden. 58

64 6 Performancemessung 1 <? php // time measurement 4 // benchmark runner 5 if ( $page == 100 && $runbenchmark == TRUE ) { 6 // start measurement 7 $_SESSION [ perfmessstarttime ] = microtime ( TRUE ); 8 include_once performancebenchmark / urls. php ; 9 $threshold = 1; 10 } else { 11 $threshold = $_REQUEST [ threshold ]; 12 } 13 $_SESSION [ urlrunner ]++; 14?> Listing 16: Ablauf der Zeitmessung (index.php) 1 <? php 2 // initial index 3 $_ SESSION [ urlrunner ] = -1; 4 // url 5 $_SESSION [ nexturl ][] = " index. php? page =300& threshold =2"; 6 // kpi & levers 7 $_SESSION [ nexturl ][] = " index. php? page =400& threshold =1"; 8 // overall trend 9 $_SESSION [ nexturl ][] = " index. php? page =500& threshold =4"; 10 // monthly status 11 $_SESSION [ nexturl ][] = " index. php? page =510& threshold =2"; // number urls 14 $_SESSION [ numberurls ] = count ( $_SESSION [ nexturl ]); 15?> Listing 17: Initialisierung des PHP-Session-Array für die Seitendurchlauf-Sequenz (urls.php) In der complete Funktion der jquery-methode load (Listing 18, Zeile 2) wird ein auf 0 initialisierter Zähler inkrementiert. Entspricht der Wert dieses Zählers dem 59

65 6 Performancemessung threshold-wert, dann wird der nächste Seitenaufruf initiiert (siehe Listing 18). 1 $("# sessionrightlayer "). load (" renderopendeviations. ajx. php ", 2 function (fn){ 3 thresholdrunner ++; 4 if( thresholdrunner == <? php echo $threshold ;? >){ 5 jumpnext ( <? php echo $_SESSION [ nexturl ][ $_SESSION [ urlrunner ]]? >); 6 } 7 }); Listing 18: Bedingte Weiterleitung innerhalb der load-complete-callback-funktion Clientseitig wird signalgesteuert nach dem kompletten Aufbau der Seite eine Funktion (siehe Listing 19) aufgerufen, deren Parameter den nächsten URL enthält, um so den folgenden Seitenaufruf zu veranlassen. 1 function jumpnext ( url ){ 2 window. location. href = url ; 3 } Listing 19: JavaScript Funktion für den Wechsel zur nächsten Seite (runthrough.js) Mit dieser Messmethode soll eine möglichen Benutzer-Session simuliert werden, um die Verbesserung des Zeitverhaltens aller durchgeführten Maßnahmen in Summe ermitteln zu können. Vor Beginn des sequenziellen Seitenaufrufes wird der Cache des Webbrowsers gelehrt, um einen definierten Startzustand zu erhalten. Außerdem wurde vor jeder Messreihe der Web- und Datenbankserver neu gestartet. Nach jedem Optimierungsschritt werden zehn Messdurchläufe durchgeführt. Mit dem daraus zu errechnenden arithmetischen Mittel wird ein Beschleunigungsfaktor ermittelt. Die Sequenz der aufgerufenen include-dateien für jede Messung lautet wie folgt: 1. home.php 2. performesession.php 3. overalltrend.php 60

66 6 Performancemessung 4. monthlystatussheet.php 5. delegatedactions.php 6. myactions.php 7. managedeviations.php 8. adminedituser.php 9. admineditsections.php 10. admineditschedule.php 11. admineditquestions.php 12. createdashboard.php 13. showreports.php Die angegebene Veränderung des Zeitverhaltens einer Optimierungsmaßnahme vergleicht immer den gerade optimierten Stand der Software mit dem vorherigen. Aus diesem Grund wurde angestrebt, die Reihenfolge der Optimierungsmaßnahmen so zu wählen, dass der Effizienzzuwachs immer stärker wird. Damit soll gewährleistet sein, dass erhoffte Verbesserungen des Zeitverhaltens stets messbar bleiben. Der errechnete Beschleunigungsfaktor ist demnach relativ zu allen vorangegangenen Optimierungen. 61

67 6 Performancemessung 6.4 Messergebnisse Vor der Optimierung Messung Nr. Ergebnis [sec] 1 38, , , , , , , , , ,2354 Tabelle 11: Performancemessung vor der Optimierung Die Sequenz wurde im Mittel in 39,6891 Sekunden durchlaufen. 62

68 6 Performancemessung Änderungen nach statischer Code-Analyse Messung Nr. Ergebnis [sec] 1 38, , , , , , , , , ,0309 Tabelle 12: Performancemessung nach Optimierungen der statischen Code- Analyse Die Sequenz wurde im Mittel in 39,3966 Sekunden durchlaufen for-schleifen-optimierung Messung Nr. Ergebnis [sec] 1 38, , , , , , , , , ,2491 Tabelle 13: Performancemessung nach for-schleifen Optimierung 63

69 6 Performancemessung Die Sequenz wurde im Mittel in 38,2491 Sekunden durchlaufen Reduzierung der Datenbankverbindungen Messung Nr. Ergebnis [sec] 1 27, , , , , , , , , ,0759 Tabelle 14: Performancemessung nach Reduzierung der Datenbankverbindungen Die Sequenz wurde im Mittel in 27,9996 Sekunden durchlaufen. 64

70 6 Performancemessung Optimierung von slow-queries Messung Nr. Ergebnis [sec] 1 2, , , , , , , , , ,4855 Tabelle 15: Performancemessung nach Optimierung von slow-queries Die Sequenz wurde im Mittel in 2,5056 Sekunden durchlaufen Optimierung der Datenbankstruktur Messung Nr. Ergebnis [sec] 1 2, , , , , , , , , ,4518 Tabelle 16: Performancemessung nach Optimierung der Datenbankstruktur 65

71 6 Performancemessung Die Sequenz wurde im Mittel in 2,4961 Sekunden durchlaufen PHP-Caching Messung Nr. Ergebnis [sec] 1 2, , , , , , , , , ,4310 Tabelle 17: Performancemessung nach dem PHP-skriptgesteuertem Caching Die Sequenz wurde im Mittel in 2,4417 Sekunden durchlaufen. 66

72 7 Auswertung 7 Auswertung Insgesamt kann die praktische Effizienzsteigerung der Software SQCDP als großer Erfolg gewertet werden. In Tabelle 18 sind die Durchschnittszeiten des Performancetests aus Kapitel 6.4 aufgelistet. Optimierung Durchlaufzeit der Performancemessung aus Abschnitt 6.4 [sec] Vor der Optimierung 39,6891 Änderungen nach statischer Code-Analyse 39,3966 for-schleifen-optimierung 38,2491 Reduzierung der Datenbankverbindungen 27,9996 Optimierung von slow-queries 2,5056 Optimierung der Datenbankstruktur 2,4961 skriptgesteuertes Caching 2,4417 Tabelle 18: Durchschnittswerte der Messreihen Mit Grundlage dieser Durchschnittswerte sollen nun Beschleunigungsfaktoren der jeweiligen Optimierungsmaßnahmen ermittelt werden. Dazu ist herauszustellen, worauf sich die Beschleunigungsfaktoren beziehen. Zur Ermittlung des Beschleunigungsfaktors werden die Durchschnittszeit einer Optimierungsmaßnahme aus Tabelle 18 gegen die Ausführungszeit der Software mit den vorangegangenen Optimierungen in Beziehung gesetzt. Das bedeutet, dass der berechnete Beschleunigungsfaktor die jeweils vorangegangenen Optimierungen beinhaltet. Der Beschleunigungsfaktor β aufgrund einer Modifikation ist 5 β = Ausführungszeit vorherige Modifikationen Ausführungszeit aktuelle und vorherige Modifikationen 5 Quelle: Prof. Dr. Thomas Risse, RSTslide.pdf SS 2013, Seite 24. Ursprungsformel wurde auf vorliegende Ausgangssituation angepasst. 67

73 7 Auswertung Optimierung Beschleunigungsfaktor β Änderungen nach statischer Code-Analyse 1,0042 for-schleifen-optimierung 1,0300 Reduzierung der Datenbankverbindungen 1,3661 Optimierung von slow-queries 11,1748 Optimierung der Datenbankstruktur 1,0038 skriptgesteuertes Caching 1,0223 Tabelle 19: Beschleunigungsfaktoren der Optimierungsmaßnahmen Setzt man die Ausführungszeiten der Software vor- und nach allen Optimierungen ins Verhältnis, so ergibt sich ein Beschleunigungsfaktor für die Summe aller Maßnahmen von β =16,2547. Das Diagramm in Abbildung 23 macht ebenso, wie die berechneten Beschleunigungsfaktoren deutlich, dass die Optimierungsmaßnahmen Minimierung der Anzahl der MySQL-Connections und vor allem Optimierung von slow-queries am meisten zur Verbesserung des Zeitverhaltens beigetragen haben. Am Ende der Modifikationen lief der Benchmark in 6,15% der Zeit der Ursprungssoftware durch. Abbildung 23: Diagramm Verbesserung des Zeitverhaltens 68

74 8 Fazit Die Optimierung der Datenbankstruktur mit Indizes und Fremdschlüsseln verbesserte das Zeitverhalten im Mittel lediglich um 95 Millisekunden. Dies liegt vermutlich zum einen daran, dass bereits sehr viel Optimierungspotential in den vorherigen Maßnahmen erschöpft wurde. Zum anderen kommt diese Optimierung voraussichtlich erst bei größeren Datenmengen zur Geltung. 8 Fazit In vielen Fachbeiträgen zum Thema Performanceoptimierung sind oft einzelne Maßnahmen beschrieben, die zur Verbesserung des Zeitverhaltens durchzuführen sind. Praktisch umgesetzt brachten diese Maßnahmen verhältnismäßig wenig Zeitgewinn. Vielmehr erwies es sich als Zielführend, mit den beschriebenen Profiling- Tools die Schwachstellen in der Software ausfindig zu machen und dann zu optimieren. So sollte zunächst beobachtet werden, welche Funktionen, Klassen und Datenbankabfragen häufig aufgerufen werden. Diese oft benutzten Quellcodeabschnitte sollten dann auf Optimierungspotential überprüft werden. Bei der automatischen Code-Analyse ist festgestellt worden, dass viel Energie für die Konfiguration der Analyse-Tools aufgebracht werden muss. Werden die Metriken für die Analyse nicht sehr genau festgelegt, so wird eine sehr große Menge an Funden hervorgebracht. Bei der manuellen Filterung nach Relevanz können so wichtige Punkte schnell übersehen werden. Enttäuschend war das Ergebnis der Dead Code Detection des PHP - Mess Detektor. Es wurde bei der automatischen Analyse mit dem Tool 8 ungenutzte Funktionen und 1 ungenutzte Klasse ausfindig gemacht. Während den manuellen Untersuchungen des kompletten Programms wurden 28 Klassen und 2 Dateien ausfindig gemacht, die während des Programmablaufes nicht genutzt werden. Das Löschen der ungenutzten Dateien verringerte Die Anzahl der Codezeilen (LoC) des Projektes von in 311 Dateien auf in 284 Dateien 6. Die Verringerung von um 2000 Codezeilen und 27 Dateien trägt in hohem Maße zur besseren Wartbarkeit und Übersicht bei. Die große Menge an totem Code ist ein Resultat des inkrementellen, iterativen Vorgehens bei der Entwicklung des Programms, bei dem gelegentlich dem Kunden vorgestellte Funktionalitäten verworfen oder komplett neu entwickelt wurden. 6 Ohne Fremdbibliotheken 69

75 8 Fazit Besonders erkenntnisreich war der Umstand, dass zu Beginn der Modifikationen keine Strukturdokumente zum Softwaredesign existierten. Erst nachdem diese angefertigt waren, war ein Eingriff in die Struktur möglich. Wären vor Beginn der Entwicklung Strukturdokumente erstellt worden, wären einige strukturelle Unzulänglichkeiten der Software im Vorfeld vermeidbar gewesen. Insgesamt klassifiziere ich die Ursachen für die Notwendigkeit der Effizienzsteigerung wie folgt: Fehler in der Struktur Die Optimierungsmaßnahme Minimierung der MySQL-Verbindungsaufbauten (siehe Kapitel 5.5) wäre vermeidbar gewesen, wenn vor Beginn der Entwicklung Strukturdokumente, wie z.b. Objekt- oder Klassendiagramme erstellt worden wären. Anhand dieser Übersichten wäre deutlich geworden, dass bei jeder Datenbankabfrage eine eigene Verbindung aufgebaut wird. Mangelnde Erfahrung Die Optimierungsmaßnahme Optimierung von ineffizienten Datenbankabfragen (siehe Kapitel 5.6.1) ist dem Umstand geschuldet, dass mir bei der Entwicklung der Software nicht bekannt gewesen ist, dass subselects das Datenbanksystem derart belasten. Eine weitere wichtige Erkenntnis ist, dass der Tabellenstruktur der Datenbank die richtige Speicher-Engine sowie Indizes und Fremdschlüssel zugeordnet werden sollen, um die Geschwindigkeit von Datenbankabfragen optimal zu gestalten. Fortgeschrittene Optimierung Das skriptgesteuerte Caching (siehe Kapitel 5.7.2) ist meiner Meinung nach eine fortgeschrittene Maßnahme zu Verbesserung der Performance. Sie ist hilfreich, das Zeitverhalten von dargestellten Inhalten zu verbessern, deren Struktur und Logik nicht weiter mit anderen Mitteln zu optimieren sind. Jedoch sollte bei der Entwicklung das Caching nicht dazu eingesetzt werden, um andere Unzulänglichkeiten, die zu Zeitverzögerungen führen, zu überdecken. Wie im Anhang (siehe Kapitel 10.1) deutlich wird, ist das Testen der modifizierten Software mit einem erheblichen Aufwand verbunden. So sollte man für umfassende Optimierungsmaßnahmen mindestens 50% der veranschlagten Zeit dafür 70

76 9 Ausblick vorsehen. Von großem Vorteil ist, wenn für das Testen auf frühere Testaktivitäten zurückgegriffen werden kann. Ebenso ist es sehr empfehlenswert, automatische Tests, etwa mit PHPUnit, gleich während der Entwicklung einer Software in das Projekt zu integrieren. Eine nachträglich Integration eines solchen Werkzeuges ist mit erheblichen Aufwand verbunden. Die Menge der Optimierungsmaßnahmen führten zu einer deutlichen Verbesserung der Effizienz der komplexen Webanwendung. Der Entwicklungsstand des Programms nach den Modifizierungen bildet eine sehr gute Grundlage für Weiterentwicklungen und gibt so die Sicherheit, dass die Software in Zukunft einer sehr großen Nutzerzahl zur Verfügung gestellt werden kann, ohne dass das Zeitverhalten merklich beeinträchtigt wird. 9 Ausblick Über denen in Kapitel 5 beschriebenen Maßnahmen zur Effizienzsteigerung genannten Maßnahmen hinaus gibt es noch weitere interessante Ansätze, das Zeitverhalten einer Webanwendung positiv zu beeinflussen. Zu einer vielversprechenden Methode zählt das sogenannte Opcode-Caching. Dabei wird mittels einer PHP-Extension der durch den Interpreter erzeugte Opcode in einen Zwischenspeicher geschrieben. Beim nächsten Aufruf der gecachten Funktion erspart man dem Server dadurch das Übersetzen des PHP-Codes (siehe Abbildung 24). 71

77 9 Ausblick Abbildung 24: PHP Opcode-Caching (Vorlage: [Padilla][S.103]) Des Weiteren gibt es auf der Client-Seite noch etwas Optimierungspotential. Jedoch wurde bei den dahingehenden Untersuchungen festgestellt, dass der Aufwand in einem schlechten Verhältnis zum Nutzen steht. So ist mit einer Minimierung des CSS-Codes um ca. 30% eine verbesserte Ladezeit um 1 Millisekunde erreicht worden 7. Möglich wäre es auch, ungenutzte CSS-Klassen ausfindig zu machen, was aber bei der Verteilung der Klassenbezeichner über 3 Sprachen (CSS, PHP und Javascript) einen sehr hohen Aufwand bei der Suche nach sich ziehen würde. Der erwartete Zeitvorteil läge unter einer Millisekunde. 7 Gemessen mit abgeschaltetem Browsercache. Bei aktivem Cache kein Unterschied. 72

78 9 Ausblick Im Gegensatz dazu wäre möglicherweise ein Review der Algorithmen zur Bereitstellung der Daten aus den MySQL-Abfragen noch eine Maßnahme, die die Effizienz positiv beeinflussen könnte. An einigen Stellen werden abgefragte Datensätze mehrfach iteriert. Diese Algorithmen ließen sich ggf. performanter gestalten. 73

79 10 Anhang 10 Anhang 10.1 Testdokumentation Für die im Abschnitt 5 vorgenommenen Modifikationen müssen Softwaretests durchgeführt werden. Im Rahmen dieser Regressionstests ist eine Priorisierung der Testfälle vorzunehmen, um den Umfang der Tests verhältnismäßig zu gestalten. Aus diesem Grund wurde auf jegliche Form von Whitebox-Tests verzichtet. In diesem Abschnitt werden alle durchgeführten Tests für die exemplarisch im Abschnitt 5 beschriebenen Beispiele abgebildet. Um die Vorgänge bei der Durchführung der Tests nachvollziehen zu können, wurde zu diesem Zweck eine eigene Test-Datenbank mit einigen wenigen Einträgen implementiert. Die Struktur von Test-Datenbank und Original-Datenbank sind identisch Regressionstest for-count Optimierungen Für die Modifizierungen an der im Abschnitt 5.4 betrachteten include-datei adminedituser.php wird nun ein Regressionstest durchgeführt Auswirkungsanalyse Um die Tragweite der Modifizierungen erfassen zu können, muss zunächst eine Auswirkungsanalyse durchgeführt werden. Dazu wird anhand der Aufrufstruktur (siehe Abbildung 25) der include-datei adminedituser.php analysiert, an welchen beteiligten Komponenten Veränderungen durchgeführt wurden. Komponenten, an denen Veränderungen durchgeführt wurden, sind in Abbildung 25 rot umrandet. 74

80 10 Anhang Abbildung 25: Aufrufstruktur der Datei adminedituser.php Die Auswirkungsanalyse führte zu dem Entschluss, Komponententests an den Dateien adminedituser.php und GetSectionTree.class.php sowie einen Integrationstest, der das Zusammenwirken aller in Abbildung 25 gezeigten Komponenten prüft, durchzuführen Komponententest GetSectionTree.class.php Die Klasse GetSectionTree hat keinen Übergabeparameter. Sie soll bei Instantiierung ein multidimensionales Array mit den Ids der gesamten, in der Datenbank hinterlegten Unternehmensstruktur liefern. Da die Klasse keinen Übergabeparameter hat, ist nur ein Testfall notwendig. In Tabelle 20 ist ersichtlich, dass die erwartete Ausgabe mit dem Testergebnis übereinstimmt. Daher ist der Komponententest erfolgreich beendet. 75

81 10 Anhang Erwartetes Ergebnis Ergebnis des Komponententestes [1] Array [2] Array [3] 3 [4] 4 Tabelle 20: Komponententest Ergebnis GetSectionTree.class.php GetSectionTree.class.php In der include-datei wurde in der vorangegangenen Optimierung eine for-schleife geändert. Da es sich bei der Datei nicht um eine Klasse oder eine Funktion handelt und es keine return-werte gibt, wird für den Komponententest beim Aufruf der Datei mit der selbst geschriebenen Debug-Funktion divout() der Wert der PHPcount()-Funktion für die modifizierte for-schleife Ausgegeben. Der erwartete Wert 8 entspricht dem durch die Ausgabefunktion divout($countcolumn). Somit ist dieser Komponententest erfolgreich beendet Integrationstest Testziel dieses Integrationstests ist es, das Zusammenwirken aller in Abbildung 25 gezeigten Elemente zu überprüfen. Dabei wird auf die richtige Darstellung der Webseite, sowie die Richtigkeit aller dynamischen Inhalte geachtet. Folgende Punkte wurden geprüft: Prüfung Erwartetes Ergebnis Check Positionierung Hauptmenü Menü soll am oberen, linken Bildschirmrand positioniert sein 76

82 10 Anhang Positionierung linkes Untermenü und Kopfbereich des Contentelements Positionierung und Funktion des Auswahlmenüs für die Abteilung Positionierung und Funktion des Invite user-buttons Untermenü soll am linken Rand ausgerichtet, innerhalb des dafür vorgesehenen Elementes zentriert positioniert sein Untermenü soll ohne Funktion sein, alle Elemente sollen halb transparent und grau sein Kopfbereich soll mit richtiger Überschrift unter dem Hauptmenü positioniert sein Auswahlmenü soll am rechten Rand des dafür vorgesehenen Bereiches positioniert sein, gemäß der Rechte des Testuseraccounts (Admin) sollen alle in der Datenbank vorhandenen Abteilungen wählbar sein bei der Auswahl einer Abteilung sollen Benutzer dieser Abteilung angezeigt werden Button soll am oberen linken Rand des dafür vorgesehene Elementes positioniert sein, Beim Klick auf den Button soll die Grafik des Buttons gegen die Grafik des Klick Status ausgetauscht werden danach soll ein halbtransparentes Overlay über dem Content-Bereich und das Popup mit den Eingabefeldern für die Aktion Invite User erscheinen 77

83 10 Anhang Positionierung der tabellarischen Benutzerübersicht Anzeige Benutzer Tabelle soll unter dem User invite- Button am linken Rand des dafür vorgesehenen Elements positioniert sein Benutzer sollen gemäß Einträgen in Test-Datenbank angezeigt werden Bei Klick auf das Feld Edit soll ein halbtransparentes Overlay über dem Content-Bereich und das Popup mit den Eingabefeldern für die Aktion Edit User erscheinen Bei Klick auf das Feld Delete soll ein halbtransparentes Overlay über dem Content-Bereich und das Popup mit den Eingabefeldern für die Aktion Delete User erscheinen Tabelle 21: Integrationstest Prüfung adminedituser.php Der Integrationstest wurde erfolgreich beendet Regressionstest Anzahl MySQL-Verbindungsaufbauten minimieren. Exemplarisch für die im Kapitel 5.5 betrachtete include-datei admineditschedule.php werden an dieser Stelle die konkreten Testverfahren zum Regressionstest beschrieben Auswirkungsanalyse Um die Auswirkungen der im Kapitel 5.5 beschriebenen Modifizierungen einschätzen zu können, ist es notwendig, alle an der Funktionalität der include-datei admineditschedule.php beteiligten Komponenten zu kennen. In Abbildung 26 ist die Aufrufstruktur von admineditschedule.php skizziert. Die von den Optimierungen betroffenen Einheiten sind rot umrandet. 78

84 10 Anhang Abbildung 26: Aufrufstruktur der Datei admineditschedule.php Priorisierung Modifizierte Klassen und Dateien, die ausschließlich für die Darstellung von Daten verantwortlich sind, werden keinem expliziten Komponententest unterzogen, da ihre Änderungen lediglich Erweiterungen von Aufruf-Parametern enthalten. Jedoch bilden die Unterstrukturen dieser Dateien einzelne Einheiten bei den Integrati- 79

85 10 Anhang onstests, sodass mögliche Fehler in diesen Komponenten schnell lokalisiert werden können Komponententest DbConnect.class.php Diese Klasse ist zentraler Bestandteil der Modifikationen um die Verringerung der Anzahl der MySQL-Verbindungsaufbauten. Gemäß ihres Konstruktors gibt es für die Klasse vier Übergabeparameter. 1 construct ( $dbhost, $dbname, $dbuser, $dbpass ) {...} Listing 20: Konstruktor DbConnect Die durchzuführenden Testfälle der Klasse DbConnect sind in Tabelle 22 aufgeführt Nr. Testfall 1 alle Parameter gültig 2 $dbhost falsch, alle anderen Parameter gültig 3 $dbname falsch, alle anderen Parameter gültig 4 $dbuser falsch, alle anderen Parameter gültig Parameter $dbhost = ; $dbname = mait test ; $dbuser = maitusr ; $dbpass = ; $dbhost = wrong ; $dbname = mait test ; $dbuser = maitusr ; $dbpass = ; $dbhost = ; $dbname = wrong ; $dbuser = maitusr ; $dbpass = ; $dbhost = ; $dbname = mait test ; $dbuser = wrong ; $dbpass = ; 80

86 10 Anhang 5 $dbpass falsch, alle anderen Parameter gültig $dbhost = ; $dbname = mait test ; $dbuser = maitusr ; $dbpass = wrong ; Tabelle 22: Testfälle Komponententest DbConnect Die Testergebnisse der in Tabelle 22 aufgeführten Testfälle sind Tabelle 23 zu entnehmen. Testfall erwartete Rückgabe tatsächliche Rückgabe Nr. 1 PDO Object () PDO Object () 2 Connection Error, unknown host Connection Error, unknown host 3 Connection Error, unknown database Connection Error, unknown database 4 Connection Error, access denied Connection Error, access denied 5 Connection Error, access denied Connection Error, access denied Tabelle 23: Ergebnisse Komponententest DbConnect Der Komponententest für die Klasse DbConnect wurde fehlerfrei abgeschlossen. GetLastOpenSession.class.php Die Database-Action-Klasse GetLastOpenSession liefert Daten über die aktuell offene Fragesession einer Domain. Ihr Konstruktor enthält 2 Übergabeparameter. 1 construct ($DBH, $scheduleid ) {...} Listing 21: Konstruktor GetLastOpenSession In Tabelle 24 sind alle Testfälle für den Komponententest der Klasse GetLastOpenSession aufgeführt. Nr. Testfall 1 Alle Parameter gültig Parameter $DBH = $DBH; $scheduleid = 1; 81

87 10 Anhang 2 $DBH ungültig, $scheduleid gültig 3 $DBH gültig, $scheduleid ungültig $DBH = wrong; $scheduleid = 1; $DBH = $DBH; $scheduleid = wrong; Tabelle 24: Testfälle Komponententest GetLastOpenSession Die Testergebnisse der in Tabelle 24 aufgeführten Testfälle sind Tabelle 25 zu entnehmen. Testfall Nr. 1 erwartete Rückgabe [sqcdp sess id] => 23 [sqcdp sched id] => 1 [sqcdp sess status] => o [sqcdp sess start] => [sqcdp sess stop] => tatsächliche Rückgabe [sqcdp sess id] => 23 [sqcdp sched id] => 1 [sqcdp sess status] => o [sqcdp sess start] => [sqcdp sess stop] => Fehlermeldung, da kein databasehandle übergeben wurde. Fatal error: Call to a member function prepare() on a non-object in GetLastOpenSession.class.php on line 13 3 keine Rückgabedaten keine Rückgabedaten Tabelle 25: Ergebnisse Komponententest GetLastOpenSession Der Komponententest der Klasse GetLastOpenSession wurde ohne auftretende Fehlerwirkungen beendet. GetLastClosedSession.class.php Die Database-Action-Klasse GetLastClosedSession liefert Daten über die letzte geschlossene Fragesession einer Domain. Ihr Konstruktor enthält 2 Übergabeparameter. 1 construct ($DBH, $scheduleid ) {...} Listing 22: Konstruktor GetLastClosedSession 82

88 10 Anhang In Tabelle 26 sind alle Testfälle für den Komponententest der Klasse GetLastClosedSession aufgeführt. Nr. Testfall 1 Alle Parameter gültig 2 $DBH ungültig, $scheduleid gültig 3 $DBH gültig, $scheduleid ungültig Parameter $DBH = $DBH; $scheduleid = 1; $DBH = wrong; $scheduleid = 1; $DBH = $DBH; $scheduleid = wrong; Tabelle 26: Testfälle Komponententest GetLastClosedSession Die Testergebnisse der in Tabelle 26 aufgeführten Testfälle sind Tabelle 27 zu entnehmen. 1 [sqcdp sess id] => 5 [sqcdp sched id] => 1 [sqcdp sess status] => np [sqcdp sess start] => [sqcdp sess stop] => [sqcdp sess id] => 5 [sqcdp sched id] => 1 [sqcdp sess status] => np [sqcdp sess start] => [sqcdp sess stop] => Fehlermeldung, da kein databasehandle übergeben wurde. Fatal error: Call to a member function prepare() on a non-object in GetLastClosedSession.class.php on line 13 3 keine Rückgabedaten keine Rückgabedaten Tabelle 27: Ergebnisse Komponententest GetLastClosedSession Der Komponententest der Klasse GetLastClosedSession wurde ohne eine erkannte Fehlerwirkung beendet. GetPlannedSession.class.php Die Klasse GetPlannedSession liefert bei Aufruf des Konstruktors alle Fragesessions einer Domain, die in der Zukunft geplant sind. Ihr Konstruktor hat 2 83

89 10 Anhang Übergabeparameter. 1 construct ($DBH, $scheduleid ) {...} Listing 23: Konstruktor GetPlannedSession In Tabelle 28 sind alle Testfälle für den Komponententest der Klasse GetPlanned- Session aufgeführt. Nr. Testfall 1 Alle Parameter gültig 2 $DBH ungültig, $scheduleid gültig 3 $DBH gültig, $scheduleid ungültig Parameter $DBH = $DBH; $scheduleid = 1; $DBH = wrong; $scheduleid = 1; $DBH = $DBH; $scheduleid = wrong; Tabelle 28: Testfälle Komponententest GetPlannedSession Die Testergebnisse der in Tabelle 28 aufgeführten Testfälle sind Tabelle 29 zu entnehmen. Testfall Nr. 1 erwartete Rückgabe [0] => [1] => [2] => tatsächliche Rückgabe [0] => [1] => [2] => Fehlermeldung, da kein databasehandle übergeben wurde. Fatal error: Call to a member function prepare() on a non-object in GetPlannedSession.class.php on line 13 3 keine Rückgabedaten keine Rückgabedaten Tabelle 29: Ergebnisse Komponententest GetPlannedSession Der Komponententest der Klasse GetPlannedSession wurde ohne erkannte Fehlerwirkung beendet. 84

90 10 Anhang GetScheduleEntries.class.php Die Klasse GetScheduleEntries liefert bei Aufruf des Konstruktors alle in der Datenbank gespeicherten Informationen zu einem Schedule, also zur Domain einer Section. Der Konstruktor dieser Klasse hat 3 Übergabeparameter. 1 construct ($DBH, $divid, $letter ) {...} Listing 24: Konstruktor GetScheduleEntries In Tabelle 30 sind alle Testfälle für den Komponententest der Klasse GetScheduleEntries aufgeführt. Nr. Testfall 1 Alle Parameter gültig 2 $DBH ungültig, alle anderen Parameter gültig 3 $divid ungültig, alle anderen Parameter gültig 4 $letter ungültig, alle anderen Parameter gültig Parameter $DBH = $DBH; $divid = 1; $letter = s ; $DBH = wrong; $divid = 1; $letter = s ; $DBH = $DBH; $divid = wrong; $letter = s ; $DBH = $DBH; $divid = 1; $letter = wrong ; Tabelle 30: Testfälle Komponententest GetScheduleEntries Die Testergebnisse der in Tabelle 30 aufgeführten Testfälle sind Tabelle 31 zu entnehmen. Testfall Nr. erwartete Rückgabe tatsächliche Rückgabe 85

91 10 Anhang 1 [sqcdp sched id] => 1 [mid sections section id] => 1 [sqcdp sched letter] => s [sqcdp sched interval] => 1 [sqcdp sched interval seg] => d [sqcdp sched timeframe] => 1 [sqcdp sched timeframe seg] => d [sqcdp sched id] => 1 [mid sections section id] => 1 [sqcdp sched letter] => s [sqcdp sched interval] => 1 [sqcdp sched interval seg] => d [sqcdp sched timeframe] => 1 [sqcdp sched timeframe seg] => d 2 Fehlermeldung, da kein databasehandle übergeben wurde Fatal error: Call to a member function prepare() on a non-object in GetScheduleEntries.class.php on line 12 3 keine Rückgabedaten keine Rückgabedaten 4 keine Rückgabedaten keine Rückgabedaten Tabelle 31: Ergebnisse Komponententest GetScheduleEntries Der Komponententest der Klasse GetScheduleEntries wurde ohne erkannte Fehlerwirkung beendet. GetAllSections.class.php Bei Aufruf des Konstruktors liefert die Klasse GetAllSections ein Array mit der Auflistung aller sichtbaren Abteilungen der Unternehmensstruktur, die in der Datenbank gespeichert sind. Ihr Konstruktor hat einen Übergabeparameter. 1 construct ( $DBH ) {...} Listing 25: Konstruktor GetAllSections In Tabelle 32 sind alle Testfälle für den Komponententest der Klasse GetAllSections aufgeführt. Nr. Testfall 1 $DBH gültig 1 $DBH ungültig Parameter $DBH = $DBH; $DBH = wrong; 86

92 10 Anhang Tabelle 32: Testfälle Komponententest GetAllSections Die Testergebnisse der in Tabelle 32 aufgeführten Testfälle sind Tabelle 33 zu entnehmen. Testfall Nr. 1 erwartete Rückgabe [0] => Array( [mid section id] => 1 [mid section parent] => [mid section token] => test1 [mid section name] => 1 [mid section visible] => 1) [1] => Array( [mid section id] => 2 [mid section parent] => 1 [mid section token] => test1.1 [mid section name] => [mid section visible] => 1) [2] => Array( [mid section id] => 3 [mid section parent] => 2 [mid section token] => test1.1.1 [mid section name] => [mid section visible] => 1) [3] => Array( [mid section id] => 4 [mid section parent] => 1 [mid section token] => test1.2 [mid section name] => [mid section visible] => 1) tatsächliche Rückgabe [0] => Array( [mid section id] => 1 [mid section parent] => [mid section token] => test1 [mid section name] => 1 [mid section visible] => 1) [1] => Array( [mid section id] => 2 [mid section parent] => 1 [mid section token] => test1.1 [mid section name] => [mid section visible] => 1) [2] => Array( [mid section id] => 3 [mid section parent] => 2 [mid section token] => test1.1.1 [mid section name] => [mid section visible] => 1) [3] => Array( [mid section id] => 4 [mid section parent] => 1 [mid section token] => test1.2 [mid section name] => [mid section visible] => 1) 2 Fehlermeldung, da kein databasehandle übergeben wurde. Fatal error: Call to a member function prepare() on a non-object in GetAllSections.class.php Tabelle 33: Ergebnisse Komponententest GetAllSections 87

93 10 Anhang Der Komponententest der Klasse GetAllSections wurde ohne erkannte Fehlerwirkung beendet Integrationstest Nachdem alle relevanten Komponeten aus Abbildung 26 getestet worden sind, wird nun ein Integrationstest durchgeführt. Dazu wurde die Aufrufstruktur in verschiedenen Integrationsabschnitte aufgeteilt. In Abbildung 27 sind diese Abschnitte grün umrandet und nummeriert. Der Ablauf des Integrationstestes verläuft gemäß den Nummerierungen. Abschließend werden die Abschnitte zusammengefasst und im Schritt Nummer 4 gemeinsam getestet. 88

94 10 Anhang Abbildung 27: Struktur des Integrationstestes der Datei admineditschedule.php Integrationsabschnitt 1 Gemäß des in Abbildung 27 grün umrandeten Abschnitt 1 des Integrationstestes wird die Schnittstelle zwischen den Klassen GetStartDateNextSess und GetPlannedSession getestet. 89

95 10 Anhang Prüfung Erwartetes Ergebnis Check Startdatum der nächsten Einzelnes Startdatum der nächsten Session geplanten Session soll in UNIX- Sekunden ausgegebene werden Tabelle 34: Integrationstest Abschnitt 1 admineditschedule.php Der Integrationstest Abschnitt 1 wurde erfolgreich beendet. Integrationsabschnitt 2 Gemäß des in Abbildung 27 grün umrandeten Abschnitt 2 des Integrationstestes wird die Darstellung und die Ausgabe der richtigen Sections im entsprechenden Dropdownmenü, sowie die Darstellung der relevanten Komponenten getestet. Prüfung Erwartetes Ergebnis Check Positionierung des Untermenüs Alle 5 Menüpunkte sollen am linken Rand zentriert in der dafür vorgesehenen Box positioniert sein Funktion des Untermenüs Positionierung der Überschriften und Trennlinien Funktion des Dropdownmenüs zur Wahl der Section Beim Klick auf die Menüpunkte soll ein Wechsel zu der Seite der entsprechenden Domain vollzogen werden Die Überschriften und Trennlinien sollen gemäß CSS-Regel positioniert sein Beim Klick auf das Dropdownmenü sollen alle in der Testdatenbank gespeicherten Sections wählbar sein Beim Klick auf eine Section soll zu dem Schedule der gewählten Section gesprungen werden Tabelle 35: Integrationstest Abschnitt 2 admineditschedule.php 90

96 10 Anhang Abschnitt 2 des Integrationstests wurde erfolgreich abgeschlossen. Integrationsabschnitt 3 Gemäß des in Abbildung 27 grün umrandeten Abschnitt 3 des Integrationstestes wird getestet, ob ein Kalender mit den in der Datenbank gespeicherten Daten für die vergangenen, aktuellen und zukünftigen Sessions angezeigt wird. Prüfung Erwartetes Ergebnis Check Anzeige des Kalenders Kalender des aktuellen und der nächsten beiden folgenden Monate soll angezeigt werden Anzeige von Wochenenden, offenen und geplanten Sessions Im Kalender sollen Wochenenden, der aktuelle Tag, offene und geplante Sessions mit unterschiedlichen Farbtönen angezeigt werden! Tabelle 36: Integrationstest Abschnitt 3 admineditschedule.php Bei der Anzeige des Kalenders ist eine Fehlerwirkung erkannt worden. Die einzelnen Kalendertage werden alle mit dem Farbcode des aktuellen Tages angezeigt. Bei der Fehlersuche wurde festgestellt, dass die Ursache dafür eine PHP-Zeitfunktion, die als deprecated deklariert war in der PHP-Version des Testsystems (5.4.19) nicht mehr die ursprünglich üblichen Rückgabewerte lieferte. Nach der Beseitigung dieser Fehlerquelle wurde ein Fehlernachtest im Abschnitt 3 erfolgreich beendet. Integrationsabschnitt 4 Gemäß des in Abbildung 27 grün umrandeten Abschnitt 4 des Integrationstestes wird getestet, ob die vorher getesteten Abschnitte 1-3 und die bislang noch nicht integrierten Komponenten gemäß Anforderung zusammenarbeiten. Prüfung Erwartetes Ergebnis Check Prüfung nach Abschnitt 1 Die in Abschnitt 1 geprüften Punkte sollen in der Gesamtansicht ebenfalls richtige Ausgaben erzeugen 91

97 10 Anhang Prüfung nach Abschnitt 2 Prüfung nach Abschnitt 3 Anzeige der Intervall- Auswahlfelder Anzeige der Aktions- Buttons Die in Abschnitt 2 geprüften Punkte sollen in der Gesamtansicht ebenfalls richtige Ausgaben erzeugen Die in Abschnitt 3 geprüften Punkte sollen in der Gesamtansicht ebenfalls richtige Ausgaben erzeugen Die Auswahlfelder zur Bestimmung der Zeitintervalle sollen angezeigt werden Bei Klick auf ein Auswahlfeld sollen die Zahlen 1-30 erscheinen und wählbar sein Button Safe Schedule soll angezeigt werden Button Delete Schedule soll angezeigt werden Tabelle 37: Integrationstest Abschnitt 4 admineditschedule.php Nach der Beseitigung der Fehlerquelle, die beim Test im Abschnitt 3 aufgespürt wurde, wurden alle Integrationstests um die include-datei admineditschedule.php ohne das Auffinden weiterer Fehlerwirkungen erfolgreich durchgeführt Regressionstest Optimierung slow-queries Exemplarisch für die im Kapitel betrachtete include-datei myactions.php werden an dieser Stelle die konkreten Testverfahren zum Regressionstest beschrieben Auswirkungsanalyse Um die Auswirkungen der im Kapitel beschriebenen Modifizierungen einschätzen zu können, ist es notwendig, alle an der Funktionalität der include- 92

98 10 Anhang Datei myactions.php beteiligten Komponenten zu kennen. In Abbildung 28 ist die Aufrufstruktur von myactions.php skizziert. Die von den Optimierungen betroffenen Einheiten sind rot umrandet. Abbildung 28: Aufrufstruktur der Datei myactions.php 93

99 10 Anhang Komponententest GetAllDeviationsOfAUser.class.php Bei Aufruf des Konstruktors liefert die Klasse GetAllDeviationsOfAUser alle gespeicherten Deviationen, die einem bestimmten Benutzer zugeordnet sind. Der Konstruktor der Klasse hat zwei Übergabeparameter. 1 construct ($DBH, $user ) {...} Listing 26: Konstruktor GetAllDeviationsOfAUser In Tabelle 38 sind alle Testfälle für den Komponententest der Klasse GetAllDeviationsOfAUser aufgeführt. Nr. Testfall 1 Alle Parameter gültig 2 $DBH ungültig, $user gültig 3 $DBH gültig, $user ungültig Parameter $DBH = $DBH; $user = mait ; $DBH = wrong; $user = mait ; $DBH = $DBH; $user = wrong; Tabelle 38: Testfälle Komponententest GetAllDeviationsOfAUser Die Testergebnisse der in Tabelle 38 aufgeführten Testfälle sind Tabelle 39 zu entnehmen. Testfall Nr. erwartete Rückgabe tatsächliche Rückgabe 94

100 10 Anhang 1 [0] => Array( [mid dev id] => 1 [sqcdp quest dev id] => 1 [sqcdp quest id] => 3 [sqcdp dev dateofgather] => [[sqcdp dev opener] => mait [[sqcdp dev dateofclosing] => [[sqcdp dev closer] => [[sqcdp dev title] => test [[sqcdp dev description] => [[sqcdp dev actor] => mait [sqcdp dev timetosolve] => [[sqcdp dev status] => 1) [0] => Array( [mid dev id] => 1 [sqcdp quest dev id] => 1 [sqcdp quest id] => 3 [sqcdp dev dateofgather] => [[sqcdp dev opener] => mait [[sqcdp dev dateofclosing] => [[sqcdp dev closer] => [[sqcdp dev title] => test [[sqcdp dev description] => [[sqcdp dev actor] => mait [sqcdp dev timetosolve] => [[sqcdp dev status] => 1) 2 Fehlermeldung, da kein databasehandle Fatal error: Call to a memobject übergeben wurde ber function prepare() on a non- in GetAllDeviationsOfAUser.class.php on line 19 3 keine Rückgabe keine Rückgabe Tabelle 39: Ergebnisse Komponententest GetAllDeviationsOfAUser Der Komponententest der Klasse GetAllDeviationsOfAUser wurde ohne erkannte Fehlerwirkung beendet. GetSectionOfADeviation.class.php Beim Aufruf des Konstruktors liefert die Klasse GetSectionOfADeviation die Abteilung des Unternehmens, aus der der Benutzer kommt, der die Deviation initiiert hat. Der Konstruktor hat zwei Übergabeparameter. 1 construct ($DBH, $devid ) {...} Listing 27: Konstruktor GetSectionOfADeviation In Tabelle 40 sind alle Testfälle für den Komponententest der Klasse GetSectionOfADeviation aufgeführt. 95

101 10 Anhang Nr. Testfall 1 Alle Parameter gültig 2 $DBH ungültig, $devid gültig 3 $DBH gültig, $devid ungültig Parameter $DBH = $DBH; $devid = 1; $DBH = wrong; $devid = 1; $DBH = $DBH; $devid = wrong; Tabelle 40: Testfälle Komponententest GetSectionOfADeviation Die Testergebnisse der in Tabelle 40 aufgeführten Testfälle sind Tabelle 41 zu entnehmen. Testfall Nr. 1 erwartete Rückgabe [mid section token] => test1 tatsächliche Rückgabe [mid section token] => test1 2 Fehlermeldung, da kein databasehandle Fatal error: Call to a memobject übergeben wurde ber function prepare() on a non- in GetSectionOfADeviation.class.php on line 36 3 keine Rückgabe keine Rückgabe Tabelle 41: Ergebnisse Komponententest GetSectionOfADeviation Der Komponententest der Klasse GetSectionOfADeviation wurde ohne erkannte Fehlerwirkung beendet. GetAllOpenDelegatedActionsForActionee.class.php Die Klasse GetAllOpenDelegatedActionsForActionee liefert bei Aufruf des Konstruktors alle offenen leichtgewichtigen Aktionen, die einem Benutzer zugeordnet sind. Der Konstruktor hat zwei Übergabeparameter. 1 construct ($DBH, $actionee ) {...} Listing 28: Konstruktor GetAllOpenDelegatedActionsForActionee 96

102 10 Anhang In Tabelle 42 sind alle Testfälle für den Komponententest der Klasse GetAllOpen- DelegatedActionsForActionee aufgeführt. 1 Alle Parameter gültig 2 $DBH ungültig, $actionee gültig 3 $DBH gültig, $actionee ungültig $DBH = $DBH; $actionee = mait; $DBH = wrong; $actionee = mait; $DBH = $DBH; $actionee = wrong; Tabelle 42: Testfälle Komponententest GetAllOpenDelegatedActionsForActionee Die Testergebnisse der in Tabelle 42 aufgeführten Testfälle sind Tabelle 43 zu entnehmen. Testfall Nr. 1 erwartete Rückgabe [mid delact id] => 1 [mid delact date of gather] => [mid delact date of closing] => [mid delact actionee] => mait [mid delact opener] => mait [mid delact title] => 1 [mid delact description] => 2 [mid delact log] => 3 [mid delact due date] => [sqcdp dev id] => 1 [sqcdp dev title] => 1 [sqcdp dev timetosolve] => [section] => n.a. [opendays] => 0 tatsächliche Rückgabe [mid delact id] => 1 [mid delact date of gather] => [mid delact date of closing] => [mid delact actionee] => mait [mid delact opener] => mait [mid delact title] => 1 [mid delact description] => 2 [mid delact log] => 3 [mid delact due date] => [sqcdp dev id] => 1 [sqcdp dev title] => 1 [sqcdp dev timetosolve] => [section] => n.a. [opendays] => 0 97

103 10 Anhang 2 Fehlermeldung, da kein databasehandle übergeben wurde Fatal error: Call to a member function prepare() on a non-object in GetAllOpenDelegatedActions- ForActionee.class.php on line 17 3 keine Rückgabe keine Rückgabe Tabelle 43: Ergebnisse Komponententest GetAllOpenDelegatedActionsForActionee Der Komponententest der Klasse GetAllOpenDelegatedActionsForActionee wurde ohne erkannte Fehlerwirkung beendet. GetAllClosedDelegatedActionsForActionee.class.php Die Klasse GetAllClosedDelegatedActionsForActionee liefert bei Aufruf des Konstruktors alle geschlossenen leichtgewichtigen Aktionen, die einem Benutzer zugeordnet sind. Der Konstruktor hat zwei Übergabeparameter. 1 construct ($DBH, $actionee ) {...} Listing 29: Konstruktor GetAllClosedDelegatedActionsForActionee In Tabelle 44 sind alle Testfälle für den Komponententest der Klasse GetAllClosedDelegatedActionsForActionee aufgeführt. 1 Alle Parameter gültig 2 $DBH ungültig, $actionee gültig 3 $DBH gültig, $actionee ungültig $DBH = $DBH; $actionee = mait; $DBH = wrong; $actionee = mait; $DBH = $DBH; $actionee = wrong; Tabelle 44: Testfälle Komponententest GetAllClosedDelegatedActionsForActionee Die Testergebnisse der in Tabelle 44 aufgeführten Testfälle sind Tabelle 45 zu entnehmen. 98

104 10 Anhang Testfall Nr. 1 erwartete Rückgabe [mid delact id] => 1 [mid delact date of gather] => [mid delact date of closing] => [mid delact actionee] => mait [mid delact opener] => mait [mid delact title] => 1 [mid delact description] => 2 [mid delact log] => 3 [mid delact due date] => [sqcdp dev id] => 1 [sqcdp dev title] => 1 [sqcdp dev timetosolve] => [section] => n.a. [closeddays] => 0 tatsächliche Rückgabe [mid delact id] => 1 [mid delact date of gather] => [mid delact date of closing] => [mid delact actionee] => mait [mid delact opener] => mait [mid delact title] => 1 [mid delact description] => 2 [mid delact log] => 3 [mid delact due date] => [sqcdp dev id] => 1 [sqcdp dev title] => 1 [sqcdp dev timetosolve] => [section] => n.a. [closeddays] => 0 2 Fehlermeldung, da kein databasehandle übergeben wurde Fatal error: Call to a member function prepare() on a non-object in GetAllClosedDelegatedActions- ForActionee.class.php on line 17 3 keine Rückgabe keine Rückgabe Tabelle 45: Ergebnisse Komponententest GetAllClosedDelegatedActionsForActionee Der Komponententest der Klasse GetAllClosedDelegatedActionsForActionee wurde ohne erkannte Fehlerwirkung beendet. GetAllSections.class.php und GetScheduleEntries.class.php Die Komponententests der Klassen GetAllSections und GetScheduleEntries wurden nach dem in Abschnitt beschriebenen Schema getestet. Die Tests wurden ohne erkannte Fehlerwirkungen beendet. 99

105 10 Anhang Integrationstest Nach dem Einzeltest aller relevanten Komponenten aus Abbildung 28 wird nun das Zusammenspiel der Einheiten getestet. Abbildung 29: Struktur des Integrationstestes der Datei myactions.php 100

106 10 Anhang Für den Integrationstest werden zunächst kleinere Integrationseinheiten gebildet, die abschließend alle miteinander verbunden werden. In Abbildung 29 sind die Abschnitte grün umrandet und nummeriert. Integrationsabschnitt 1 Gemäß des in Abbildung 29 grün umrandeten Abschnitt 1 des Integrationstestes wird die Darstellung und die Ausgabe aller offenen Aktionen eines Benutzers getestet. Prüfung Erwartetes Ergebnis Check Anzeige der Überschrift Überschrift soll innerhalb des dafür vorgesehenen grafischen Elements (Balken) dargestellt werden Anzeige der offenen Abweichungen Offene Abweichungen sollen tabellarisch aufgelistet sein Bei Klick auf eine Abweichung soll halbtransparentes Overlay über dem Content-Bereich und darüber ein Popup zur Ansicht und Bearbeitung der Deviation erscheinen Tabelle 46: Integrationstest Abschnitt 1 myactions.php Abschnitt 1 des Integrationstests wurde erfolgreich abgeschlossen. Integrationsabschnitt 2 Gemäß des in Abbildung 29 grün umrandeten Abschnitt 2 des Integrationstestes wird die Darstellung und die Ausgabe aller geschlossenen Aktionen eines Benutzers getestet. Prüfung Erwartetes Ergebnis Check Anzeige der Überschrift Überschrift soll innerhalb des dafür vorgesehenen grafischen Elements (Balken) dargestellt werden 101

107 10 Anhang Anzeige der geschlossenen Abweichungen Geschlossenen Abweichungen sollen tabellarisch aufgelistet sein Bei Klick auf eine Abweichung soll halbtransparentes Overlay über dem Content-Bereich und darüber ein Popup zur Ansicht der Deviation erscheinen Tabelle 47: Integrationstest Abschnitt 1 myactions.php Abschnitt 2 des Integrationstests wurde erfolgreich abgeschlossen. Integrationsabschnitt 3 Dieser Teil des Integrationstestes wurden nach dem in Abschnitt beschriebenen Schema getestet. Der Test wurde erfolgreich beendet Integrationsabschnitt 4 Gemäß des in Abbildung 29 grün umrandeten Abschnitt 4 des Integrationstestes wird das Zusammenspiel aller Komponenten und Integrationsabschnitte getestet. Prüfung Erwartetes Ergebnis Check Prüfung nach Abschnitt 1 Die in Abschnitt 1 geprüften Testfälle sollen in der Gesamtansicht ebenfalls richtige Ausgaben erzeugen Prüfung nach Abschnitt 2 Die in Abschnitt 2 geprüften Testfälle sollen in der Gesamtansicht ebenfalls richtige Ausgaben erzeugen 102

108 10 Anhang Prüfung nach Abschnitt 3 Die in Abschnitt 1 geprüften Testfälle sollen in der Gesamtansicht ebenfalls richtige Ausgaben erzeugen Tabelle 48: Integrationstest Abschnitt 3 myactions.php Der Integrationstest um die include-datei myactions ist ohne das Auffinden von Fehlerwirkungen erfolgreich beendet worden Test der referentiellen Integrität nach Optimierungen der Datenbankstruktur Nach der Modifikation der Datenbankstruktur sollen die Fremdschlüsselbeziehungen der Datenbanktabellen getestet werden. Dazu werden exemplarisch Relationen der drei Tabellen mid sections, mid usr und sqcdp deviations betrachtet. Eine vereinfachte Übersicht über die Verbindungen dieser 3 Tabellen ist Abbildung 30 zu entnehmen. Alle im folgenden Abschnitt beschriebenen Aktionen beziehen sich auf diese Abbildung. Abbildung 30: Vereinfachtes ER-Diagramm DB-Test Referentielle Integrität Um die referentielle Integrität überprüfen zu können, werden Test-Datensätze in 103

109 10 Anhang die Tabellen eingetragen. Hierzu gibt es verschiedene Testfälle. Eintrag konsistenter Datensätze Begonnen wird mit einem Eintrag in der übergeordneten Tabelle mid sections. Nach dem Bestätigen der Eingabe soll der MySQL-Server keine Fehlermeldungen werfen. 1 INSERT INTO mait_test. mid_sections ( 2 mid_section_id, 3 mid_section_parent, 4 mid_section_token, 5 mid_section_name, 6 mid_section_visible 7 ) 8 VALUES ( 9 NULL,NULL, test2,null, 1 10 ); Listing 30: Konsistenter Insert in Tabelle mid sections Wie erwartet brachte dieser Insert keine Fehlermeldungen hervor. Die vom Datenbanksystem generierte ID des Datensatzes ist 5. Im nächsten Schritt wird in die Tabelle mid usr ein Datensatz mit dem Fremdschlüsselwert 5 in der Spalte mid section id eingegeben. Nach dem Bestätigen der Eingabe soll der MySQL-Server keine Fehlermeldungen werfen. 1 INSERT INTO mait_test. mid_usr ( 2 mid_usr_id, 3 mid_sections_mid_section_id, 4 mid_usr_systemname, 5 mid_usr_first_name, 6 mid_usr_last_name, 7 mid_usr_ , 8 mid_usr_sqcdp_level, 9 mid_usr_5a_level, 10 mid_usr_register_date, 11 mid_usr_visible 104

110 10 Anhang 12 ) 13 VALUES ( 14 NULL, 5, testuser,null,null,null, 99, 99,, 1 15 ); Listing 31: Konsistenter Insert in Tabelle mid usr Auch dieser Eintrag verursachte keine Fehlermeldungen des Datenbanksystems. Im letzten Schritt dieses Testfalls wird in die Tabelle mid deviations ein Datensatz mit dem referenzierten Wert testuser für die Spalten sqcdp dev opener, sqcdp dev closer und sqcdp dev actor eingefügt. Das Datenbanksystem soll nach Bestätigung dieser Eingabe keinen Fehler anzeigen. 1 INSERT INTO mait_ test. sqcdp_ deviations ( 2 sqcdp_dev_id, 3 sqcdp_question_deviation_sqcdp_quest_dev_id, 4 sqcdp_questions_sqcdp_quest_id, 5 sqcdp_dev_dateofgather, 6 sqcdp_dev_opener, 7 sqcdp_dev_dateofclosing, 8 sqcdp_dev_closer, 9 sqcdp_dev_title, 10 sqcdp_dev_description, 11 sqcdp_dev_action_log, 12 sqcdp_dev_actor, 13 sqcdp_dev_timetosolve, 14 sqcdp_dev_status 15 ) 16 VALUES ( 17 NULL, 1, 1, 1234, testuser, 1234, testuser, test, test, test, testuser, 1234, 1 18 ); Listing 32: Konsistenter Insert in Tabelle mid deviations Wie erwartet, brachte dieser Insert keine Fehlermeldung hervor. 105

111 10 Anhang Eintrag inkonsistenter Datensätze Im nächsten Testschritt wird versucht, Datensätzen in Untertabellen einzufügen, bei denen Spalten mit Einträgen versehen werden, deren Werte nicht in den referenzierten Spalten der Elterntabellen existieren. Das Datenbanksystem soll nach dem Bestätigen der Eingaben eine Fehlermeldung anzeigen und die Datensätze nicht einfügen. Im folgenden Insert soll in die Spalte mid sections mid section id der Wert 50 eingetragen werden. Ein Datensatz mit diesem Wert ist in der Elterntabelle mid sections nicht enthalten. 1 INSERT INTO mait_test. mid_usr ( 2 mid_usr_id, 3 mid_sections_mid_section_id, 4 mid_usr_systemname, 5 mid_usr_first_name, 6 mid_usr_last_name, 7 mid_usr_ , 8 mid_usr_sqcdp_level, 9 mid_usr_5a_level, 10 mid_usr_register_date, 11 mid_usr_visible 12 ) 13 VALUES ( 14 NULL, 50, testuser,null,null,null, 99, 99,, 1 15 ); Listing 33: Inkonsistenter Insert in Tabelle mid usr Wie erwartet lieferte das Datenbanksystem nach Bestätigung der Eingabe folgende Fehlermeldung: Cannot add or update a child row: a foreign key constraint fails( mait test. mid usr, CONSTRAINT mid usr ibfk 1 FOREIGN KEY ( mid sections mid section id ) REFERENCES mid sections ( mid section id ) ON DELETE CASCADE ON UPDATE CASCADE) Im nächsten Schritt wird drei Mal der Versuch unternommen, in die Tabelle 106

112 10 Anhang mid deviations jeweils in den Spalten sqcdp dev opener, sqcdp dev closer und sqcdp dev actor einen ungültigen Benutzer (notestuser) einzutragen. Es wird erwartet, dass das Datenbanksystem nach Bestätigung der Eingabe eine Fehlermeldung anzeigt. Beispielhaft für die 3 ungültigen Eingaben zeigt Listing 34 die ungültige Eingabe für die Spalte sqcdp dev opener 1 INSERT INTO mait_ test. sqcdp_ deviations ( 2 sqcdp_dev_id, 3 sqcdp_question_deviation_sqcdp_quest_dev_id, 4 sqcdp_questions_sqcdp_quest_id, 5 sqcdp_dev_dateofgather, 6 sqcdp_dev_opener, 7 sqcdp_dev_dateofclosing, 8 sqcdp_dev_closer, 9 sqcdp_dev_title, 10 sqcdp_dev_description, 11 sqcdp_dev_action_log, 12 sqcdp_dev_actor, 13 sqcdp_dev_timetosolve, 14 sqcdp_dev_status 15 ) 16 VALUES ( 17 NULL, 1, 1, 1234, notestuser, 1234, testuser, test, test,null, testuser, 1234, 4 18 ); Listing 34: Inkonsistenter Insert in Tabelle sqcdp deviations Erwartungsgemäß erfolgten bei allen 3 Versuchen keine Einträge in die Datenbank und es wurden folgende Fehlermeldungen angezeigt: Cannot add or update a child row: a foreign key constraint fails ( mait test. sqcdp deviations, CONSTRAINT sqcdp deviations ibfk 5 FOREIGN KEY ( sqcdp dev opener ) REFERENCES mid usr ( mid usr systemname ) ON DELETE CASCADE ON UPDATE CASCADE)) 107

113 10 Anhang Cannot add or update a child row: a foreign key constraint fails ( mait test. sqcdp deviations, CONSTRAINT sqcdp deviations ibfk 4 FOREIGN KEY ( sqcdp dev closer ) REFERENCES mid usr ( mid usr systemname ) ON DELETE CASCADE ON UPDATE CASCADE))) Cannot add or update a child row: a foreign key constraint fails ( mait test. sqcdp deviations, CONSTRAINT sqcdp deviations ibfk 3 FOREIGN KEY ( sqcdp dev actor ) REFERENCES mid usr ( mid usr systemname ) ON DELETE CASCADE ON UPDATE CASCADE)))) Dieser Testfall wurde erfolgreich durchgeführt. Ändern von referenzierten Einträgen Gemäß der MySQL-Anweisung ON UPDATE CASCADE müssen die referenzierenden Einträge in den Untertabellen ihre Werte ändern, wenn in den referenzierten Spalten in der Elterntabelle Änderungen vorgenommen werden. Im folgenden Testfall wird der Wert mid section id von der Tabelle mid sections des Eintrags aus Listing 30 geändert. 1 UPDATE mait_test. mid_sections 2 SET mid_section_id = WHERE mid_section_id =5; Listing 35: Update eines Fremdschlüssels in Tabelle mid sections Die Spalte mid sections mid section id des Datensatzes aus Listing 31 der Tabelle mid usr muss nun den Wert 100 enthalten. Abbildung 31: Änderung des referenzierenden MySQL-Eintrages 108

114 10 Anhang Im nächsten Testfall wird der referenzierte Eintrag mid usr systemname des Datensatzes aus Listing 31 geändert. 1 UPDATE mait_test. mid_usr 2 SET mid_usr_systemname = anothertestuser 3 WHERE mid_ usr_ systemname = testuser ; Listing 36: Update eines Fremdschlüssels in Tabelle mid usr Nach dieser Änderung wird erwartet, dass die referenzierenden Spalten in der Untertabelle sqcdp deviations den Wert des neuen mid usr systemname enthalten. Abbildung 32: Prüfung der Änderung des referenzierenden MySQL-Eintrages Dieser Testfall wurde erfolgreich durchgeführt. Löschen von referenzierten Einträgen Werden Einträge in Elterntabellen, die referenzierte Spalten beinhalten, gelöscht, so müssen gemäß MySQL-Anweisung ON DELETE CASCADE die referenzierenden Datensätze der Untertabellen auch automatisch gelöscht werden. Demnach wird nach der Bestätigung des MySQL-Statements aus Listing 37 erwartet, dass die Einträge aus Listing 31 und 32 automatisch gelöscht werden was bei den Abfragen bestätigt wurde. 1 DELETE FROM mait_ test. mid_ sections 2 WHERE mid_ sections. mid_ section_ id = 100; Listing 37: Delete eines Fremdschlüssels in Tabelle mid usr Abbildung 33: Prüfung der Löschung des referenzierenden MySQL-Eintrages 109

115 10 Anhang Abbildung 34: Prüfung der Löschung des referenzierenden MySQL-Eintrages Mit den in diesem Abschnitt aufgeführten Testfällen konnte die referentielle Integrität der 3 in Abbildung 30 gezeigten Tabellen erfolgreich getestet werden Regressionstest nach Implementierung des Caching-Systems Nach der Umsetzung des skriptgesteuerten Caching-Systems werden für jede Seite, auf denen Ausgaben gecacht werden, drei Tests durchgeführt. Nachfolgend werden beispielhaft die Testaktivitäten an der im Abschnitt modifizierten Datei renderopendeviations.ajx.php betrachtet. Im ersten Testschritt werden die gecachte Datei und die HTML-Ausgabe, die die Originaldatei im Browser erzeugt, miteinander verglichen. Dazu wird der Quelltext, der vom Webserver an den Browser geschickt wird, in einer Textdatei gespeichert. Die beiden zu vergleichenden Dateien werden nun mit Hilfe des Programms WinMerge gegenübergestellt. Im Ergebnis soll der Vergleich keine Unterschiede hervorbringen. 110

116 10 Anhang Abbildung 35: Vergleich von Textdateien mit WinMerge Abbildung 35 zeigt einen Screenshot des Programms WinMerge bei dem Vergleich beider Dateien. Es wurden keine Unterschiede festgestellt. Somit sind die beiden verglichenen Dateien äquivalent. Im zweiten Testfall wird überprüft, ob eine vorhandenen gecachte Datei tatsächlich geladen wird. Dazu wird der Cacheordner zunächst gelöscht und die include-datei monthlystatussheet aufgerufen. Erwartungsgemäß erscheint die Übersicht der offenen Abweichungen auf der rechten Seite des Bildschirmes. Danach wird die auf dem Webserver befindliche Ordnerstruktur des Programms überprüft und festgestellt, dass das Cachingverzeichnis erneut angelegt wurde. Darauf folgend wird in den Quelltext der Cachedatei nachträglich die HTML- Ausgabe cachefile eingefügt. Erwartungsgemäß ist beim erneuten Aufruf der Seite diese Textausgabe sichtbar. Somit ist sichergestellt, dass im Falle des Vorhandenseins die gecachte Datei angezeigt wird. 111

7. Datenbank-Zugriff. Vorlesung und Übung Dr. Peter Pfahler Institut für Informatik Universität Paderborn. Zum Beispiel aus PHP-Skripten: Client 7-2

7. Datenbank-Zugriff. Vorlesung und Übung Dr. Peter Pfahler Institut für Informatik Universität Paderborn. Zum Beispiel aus PHP-Skripten: Client 7-2 5 Vorlesung und Übung Dr. Peter Pfahler Institut für Informatik Universität Paderborn 7 7. Datenbank-Zugriff Zum Beispiel aus PHP-Skripten: Client 7-2 Struktur einer Datenbank 7-3 Erzeugen von Datenbanken

Mehr

Softwareentwicklungspraktikum Sommersemester 2007. Testdokumentation

Softwareentwicklungspraktikum Sommersemester 2007. Testdokumentation Softwareentwicklungspraktikum Sommersemester 2007 Testdokumentation Auftraggeber Technische Universität Braunschweig

Mehr

Proseminar: Website-Management-Systeme

Proseminar: Website-Management-Systeme Proseminar: Website-Management-Systeme Thema: Web: Apache/Roxen von Oliver Roeschke email: o_roesch@informatik.uni-kl.de Gliederung: 1.) kurze Einleitung 2.) Begriffsklärung 3.) Was ist ein Web? 4.) das

Mehr

Konzept eines Datenbankprototypen. 30.06.2003 Folie 1 Daniel Gander / Gerhard Schrotter

Konzept eines Datenbankprototypen. 30.06.2003 Folie 1 Daniel Gander / Gerhard Schrotter Konzept eines Datenbankprototypen 30.06.2003 Folie 1 Daniel Gander / Gerhard Schrotter Inhalt (1) Projektvorstellung & Projektzeitplan Softwarekomponenten Detailierte Beschreibung der System Bausteine

Mehr

1 Einleitung. 1.1 Caching von Webanwendungen. 1.1.1 Clientseites Caching

1 Einleitung. 1.1 Caching von Webanwendungen. 1.1.1 Clientseites Caching 1.1 Caching von Webanwendungen In den vergangenen Jahren hat sich das Webumfeld sehr verändert. Nicht nur eine zunehmend größere Zahl an Benutzern sondern auch die Anforderungen in Bezug auf dynamischere

Mehr

09.06.2003 André Maurer andre@maurer.name www.andre.maurer.name Wirtschaftsinformatik FH 3.5 Fachhochschule Solothurn, Olten

09.06.2003 André Maurer andre@maurer.name www.andre.maurer.name Wirtschaftsinformatik FH 3.5 Fachhochschule Solothurn, Olten Aktuelle Themen der Wirtschaftsinformatik Zusammenfassung 09.06.2003 André Maurer andre@maurer.name www.andre.maurer.name Wirtschaftsinformatik FH 3.5 Fachhochschule Solothurn, Olten 1 Serverseitige Webprogrammierung

Mehr

AJAX SSL- Wizard Referenz

AJAX SSL- Wizard Referenz AJAX SSL- Wizard Referenz Version 1.0.2+ - 04.04.2011 Präambel Die vorliegende Dokumentation beschreibt den AJAX basierten SSL- Wizard der CertCenter AG. Der SSL- Wizard kann mit wenigen Handgriffen nahtlos

Mehr

JOB SCHEDULER. Managed User Jobs. Dokumentation Juli 2005. MySQL-Job-Automation

JOB SCHEDULER. Managed User Jobs. Dokumentation Juli 2005. MySQL-Job-Automation MySQL-Job-Automation Managed User Jobs JOB SCHEDULER Dokumentation Juli 2005 Software- und Organisations-Service GmbH Giesebrechtstr. 15 D-10629 Berlin Telefon (030) 86 47 90-0 Telefax (030) 861 33 35

Mehr

7.4 Analyse anhand der SQL-Trace. 7.3.5 Vorabanalyse mit dem Code Inspector

7.4 Analyse anhand der SQL-Trace. 7.3.5 Vorabanalyse mit dem Code Inspector 7.4 Analyse anhand der SQL-Trace 337 7.3.5 Vorabanalyse mit dem Code Inspector Der Code Inspector (SCI) wurde in den vorangegangenen Kapiteln immer wieder erwähnt. Er stellt ein paar nützliche Prüfungen

Mehr

Datenbank - Teil 3. Ziele: Eine Datenbank anlegen mit SQL. Daten eingeben mit SQL. Abfragen stellen mit SQL und PHP.

Datenbank - Teil 3. Ziele: Eine Datenbank anlegen mit SQL. Daten eingeben mit SQL. Abfragen stellen mit SQL und PHP. Ziele: Eine Datenbank anlegen mit SQL Daten eingeben mit SQL Abfragen stellen mit SQL und PHP 1 Datenbankserver Entwickelt von der schwedischen Aktiengesellschaft MySQL Unter GNU General Public License

Mehr

Web 2.0 Software-Architekturen

Web 2.0 Software-Architekturen Web 2.0 Software-Architekturen Servlets als Controller einer MVC Web Architektur Prof. Dr. Nikolaus Wulff HTTP und HTML Das HyperText TransferProtokoll (HTTP) beschreibt eine einfache verbindungslose Kommunikation,

Mehr

UI-Testing mit Microsoft Test Manager (MTM) Philip Gossweiler / 2013-04-18

UI-Testing mit Microsoft Test Manager (MTM) Philip Gossweiler / 2013-04-18 UI-Testing mit Microsoft Test Manager (MTM) Philip Gossweiler / 2013-04-18 Software Testing Automatisiert Manuell 100% 70% 1 Überwiegender Teil der Testing Tools fokusiert auf automatisiertes Testen Microsoft

Mehr

Grundlagen der EDV 3. Vorlesung mit Übungen. Dipl. Ing. Martin Ney

Grundlagen der EDV 3. Vorlesung mit Übungen. Dipl. Ing. Martin Ney Grundlagen der EDV 3 Vorlesung mit Übungen Dipl. Ing. Martin Ney Grundlagen der EDV 3 HTML und CSS HTML und PHP CMS Datenbanken SQL Grundlagen der EDV 2/29 Internetprotokolle HTTP zum Abruf von Internetdateien

Mehr

php Hier soll ein Überblick über das Erstellen von php Programmen gegeben werden. Inhaltsverzeichnis 1.Überblick...2 2.Parameterübergabe...

php Hier soll ein Überblick über das Erstellen von php Programmen gegeben werden. Inhaltsverzeichnis 1.Überblick...2 2.Parameterübergabe... php Hier soll ein Überblick über das Erstellen von php Programmen gegeben werden. Inhaltsverzeichnis 1.Überblick...2 2.Parameterübergabe...7 3.Zugriff auf mysql Daten...11 Verteilte Systeme: php.sxw Prof.

Mehr

Dataport IT Bildungs- und Beratungszentrum. HTML- Grundlagen und CSS... 2. XML Programmierung - Grundlagen... 3. PHP Programmierung - Grundlagen...

Dataport IT Bildungs- und Beratungszentrum. HTML- Grundlagen und CSS... 2. XML Programmierung - Grundlagen... 3. PHP Programmierung - Grundlagen... Inhalt HTML- Grundlagen und CSS... 2 XML Programmierung - Grundlagen... 3 PHP Programmierung - Grundlagen... 4 Java - Grundlagen... 5 Java Aufbau... 6 ASP.NET Programmierung - Grundlagen... 7 1 HTML- Grundlagen

Mehr

Merkblatt: HSM. Version 1.01. Systemvoraussetzungen, Setup und Trouble Shooting. pdfsupport@pdf-tools.com

Merkblatt: HSM. Version 1.01. Systemvoraussetzungen, Setup und Trouble Shooting. pdfsupport@pdf-tools.com Merkblatt: HSM Version 1.01 Systemvoraussetzungen, Setup und Trouble Shooting Kontakt: pdfsupport@pdf-tools.com Besitzer: PDF Tools AG Kasernenstrasse 1 8184 Bachenbülach Schweiz www.pdf-tools.com Copyright

Mehr

SmartExporter 2013 R1

SmartExporter 2013 R1 Die aktuelle Version wartet mit zahlreichen neuen Features und umfangreichen Erweiterungen auf. So können mit SmartExporter 2013 R1 nun auch archivierte Daten extrahiert und das Herunterladen der Daten

Mehr

Systemvoraussetzungen Sitzungsmanager

Systemvoraussetzungen Sitzungsmanager Systemvoraussetzungen Sitzungsmanager Rotenburger Str. 28 30659 Hannover MannisHDD:MTeske:Desktop:Systemvoraussetzungen_Sitzungsmanager.docx Seite 1 von 6 Hannoversche Straße 46 B 30916 Isernhagen Telefon

Mehr

PostgreSQL unter Debian Linux

PostgreSQL unter Debian Linux Einführung für PostgreSQL 7.4 unter Debian Linux (Stand 30.04.2008) von Moczon T. und Schönfeld A. Inhalt 1. Installation... 2 2. Anmelden als Benutzer postgres... 2 2.1 Anlegen eines neuen Benutzers...

Mehr

AixVerein 2.0 - Anleitung zur Einrichtung des

AixVerein 2.0 - Anleitung zur Einrichtung des Seite 1/6 AixVerein 2.0 - Anleitung zur Einrichtung des Datenbank-Servers und der Dokumentenablage Bei der vorliegenden Anwendung handelt es sich um eine Client-Server-Anwendung, d.h. die Software wird

Mehr

Systematisches Testen von Software

Systematisches Testen von Software Programmierung Systematisches Testen von Software Markus Eckstein Systematika Information Systems GmbH Kurfürsten-Anlage 36 69115 Heidelberg markus.eckstein@systematika.com Zusammenfassung Die wichtigsten

Mehr

[DIA] Webinterface 2.4

[DIA] Webinterface 2.4 [DIA] Webinterface 2.4 2 Inhalt Inhalt... 2 1. Einleitung... 3 2. Konzept... 4 2.1 Vorteile und Anwendungen des... 4 2.2 Integration in bestehende Systeme und Strukturen... 4 2.3 Verfügbarkeit... 5 3.

Mehr

Offline Apps mit HTML5

Offline Apps mit HTML5 1 Offline Apps mit HTML5 Entwicklung vollständig offline-tauglicher Webanwendungen W3L AG info@w3l.de 2014 2 Agenda Motivation Situation unter HTML 4.01 Neuerungen durch HTML5 Technologie Offline-Technologien

Mehr

Erstellen von Beiträgen

Erstellen von Beiträgen Erstellen von Beiträgen Hinweis Die Anleitung ist für den Microsoft Internet Explorer 10 erstellt. Wird ein anderer Webbowser wie Firefox, Safari oder Google Chrom usw. verwendet, kann die Darstellung

Mehr

Ruby on Rails. Florian Ferrano Ralf Heller Markus Nagel

Ruby on Rails. Florian Ferrano Ralf Heller Markus Nagel Ruby on Rails Florian Ferrano Ralf Heller Markus Nagel Überblick Ruby on Rails Ruby Rails Geschichte MVC allgemein MVC in Rails Scaffolding Webserver Installation Beispiele Wo wird Rails verwendet? Ausblick

Mehr

Hochschule Darmstadt Fachbereich Informatik

Hochschule Darmstadt Fachbereich Informatik Hochschule Darmstadt Fachbereich Informatik 6.3 Systemarchitektur 430 6.3 Systemarchitektur Drei Schichten Architektur Die "Standardtechniken" des Software-Engineering sind auch auf die Architektur einer

Mehr

Dynamische Webseiten

Dynamische Webseiten Dynamische Webseiten Seminar Medientechnik 30.06.2003 Dynamische Webseiten 1 Inhalt Allgemeine Funktionsweise eines Webservers Grundgedanke von dynamischen Webseiten Einschub: Dynamische Seitenerzeugung

Mehr

ESB - Elektronischer Service Bericht

ESB - Elektronischer Service Bericht Desk Software & Consulting GmbH ESB - Elektronischer Service Bericht Dokumentation des elektronischen Serviceberichts Matthias Hoffmann 25.04.2012 DESK Software und Consulting GmbH Im Heerfeld 2-4 35713

Mehr

Dokumentation QuickHMI-Schnittstelle. Datenbanken

Dokumentation QuickHMI-Schnittstelle. Datenbanken Dokumentation QuickHMI-Schnittstelle für SQLServer Datenbanken Version 1.0 D-28359 Bremen info@indi-systems.de Tel + 49 421-989703-30 Fax + 49 421-989703-39 Inhaltsverzeichnis Was ist die QuickHMI-Schnittstelle

Mehr

Installation und Benutzung AD.NAV.ZipTools

Installation und Benutzung AD.NAV.ZipTools Installation und Benutzung AD.NAV.ZipTools Version 1.0.0.0 ALTENBRAND Datentechnik GmbH Am Gelicht 5 35279 Neustadt (Hessen) Tel: 06692/202 290 Fax: 06692/204 741 email: support@altenbrand.de Die Komponente

Mehr

Swp08-6 Verantwortliche: Yundensuren, Baigalmaa. Testkonzept

Swp08-6 Verantwortliche: Yundensuren, Baigalmaa. Testkonzept Testkonzept 1.Einführung Um die Zuverläsigkeit und die Qualität der Software und des gesamten Systems zu verbessern, sind Tests durchzuführen. Die Testreihe läst sich in drei Stufen einteilen, nülich Komponententest,

Mehr

Angreifbarkeit von Webapplikationen

Angreifbarkeit von Webapplikationen Vortrag über die Risiken und möglichen Sicherheitslücken bei der Entwicklung datenbankgestützter, dynamischer Webseiten Gliederung: Einführung technische Grundlagen Strafbarkeit im Sinne des StGB populäre

Mehr

Datenbank-basierte Webserver

Datenbank-basierte Webserver Datenbank-basierte Webserver Datenbank-Funktion steht im Vordergrund Web-Schnittstelle für Eingabe, Wartung oder Ausgabe von Daten Datenbank läuft im Hintergrund und liefert Daten für bestimmte Seiten

Mehr

Softwareentwicklung in der industriellen Praxis

Softwareentwicklung in der industriellen Praxis Softwareentwicklung in der industriellen Praxis Cloud-Systeme: Besonderheiten bei Programmierung und Betrieb Steffen Gemkow / Paul Fritsche - ObjectFab GmbH 26.11.2012 Simple is beautiful Don t repeat

Mehr

Teststrategie festlegen und Teststufen aufeinander abstimmen

Teststrategie festlegen und Teststufen aufeinander abstimmen Testen Teststrategie festlegen und Teststufen aufeinander abstimmen Bereich Projektplanung und -steuerung Aktivität Projekt planen Ziele Effiziente Testausführung Vermeidung von doppelter Arbeit schnell

Mehr

Grundsätzliche Struktur und Entwurfsprinzipien des Gesamtsystems. Grundsätzliche Struktur und Entwurfsprinzipien der einzelnen Pakete

Grundsätzliche Struktur und Entwurfsprinzipien des Gesamtsystems. Grundsätzliche Struktur und Entwurfsprinzipien der einzelnen Pakete Allgemeines 2 Produktübersicht 2 Grundsätzliche Struktur und Entwurfsprinzipien des Gesamtsystems 3 Grundsätzliche Struktur und Entwurfsprinzipien der einzelnen Pakete Account-Verwaltung 5 Freund-Funktionen

Mehr

Inhaltsverzeichnis. Teil 1 Node.js... 1

Inhaltsverzeichnis. Teil 1 Node.js... 1 xiii Teil 1 Node.js... 1 1 Was ist Node.js? 3 1.1 Die Zeitalter des Webs................................... 3 1.1.1 1990 bis 2000: Das Web 1.0....................... 3 1.1.2 2000 bis 2010: Das Web 2.0.......................

Mehr

VB.net Programmierung und Beispielprogramm für GSV

VB.net Programmierung und Beispielprogramm für GSV VB.net Programmierung und Beispielprogramm für GSV Dokumentation Stand vom 26.05.2011 Tel +49 (0)3302 78620 60, Fax +49 (0)3302 78620 69, info@me-systeme.de, www.me-systeme.de 1 Inhaltsverzeichnis Vorwort...2

Mehr

Handbuch organice Business Intelligence

Handbuch organice Business Intelligence Handbuch organice Business Intelligence Stand: Februar 2014, Version 1.1.0.1 2001-2014 organice Software GmbH Grunewaldstr. 22, 12165 Berlin Alle Rechte vorbehalten. Die Software und dieses Handbuch dürfen

Mehr

1 Installationen. 1.1 Installationen unter Windows

1 Installationen. 1.1 Installationen unter Windows 1 Installationen Dieses Kapitel beschreibt die Installationen, die für die Nutzung von PHP und MySQL unter Windows, unter Ubuntu Linux und auf einem Mac mit OS X notwendig sind. 1.1 Installationen unter

Mehr

Lerox DB/2 Datenbankreferenz in QlikView für IBM System AS/400, iseries i5, System i

Lerox DB/2 Datenbankreferenz in QlikView für IBM System AS/400, iseries i5, System i Lerox DB/2 Datenbankreferenz in QlikView für IBM System AS/400, iseries i5, System i Inhaltsverzeichnis Überblick... 3 Die QlikView Applikation im Kontext... 4 Technische Rahmenbedinungen... 5 Funktionelle

Mehr

Domain Control System. [ Dokumentation und Hilfe ] Stand 10. 05. 2005

Domain Control System. [ Dokumentation und Hilfe ] Stand 10. 05. 2005 Domain Control System [ Dokumentation und Hilfe ] Stand 10. 05. 2005 Seite 1 von 9 Einfü hrung Das 4eins Domain Control System (DCS) stellt Ihnen verschiedene Dienste und Funktionen für die Konfiguration

Mehr

DATENBANKEN SQL UND SQLITE VON MELANIE SCHLIEBENER

DATENBANKEN SQL UND SQLITE VON MELANIE SCHLIEBENER DATENBANKEN SQL UND SQLITE VON MELANIE SCHLIEBENER INHALTSVERZEICHNIS 1. Datenbanken 2. SQL 1.1 Sinn und Zweck 1.2 Definition 1.3 Modelle 1.4 Relationales Datenbankmodell 2.1 Definition 2.2 Befehle 3.

Mehr

PHP Kurs Online Kurs Analysten Programmierer Web PHP

PHP Kurs Online Kurs Analysten Programmierer Web PHP PHP Kurs Online Kurs Analysten Programmierer Web PHP Akademie Domani info@akademiedomani.de Allgemeines Programm des Kurses PHP Modul 1 - Einführung und Installation PHP-Umgebung Erste Lerneinheit Introduzione

Mehr

Übungen zur Softwaretechnik

Übungen zur Softwaretechnik Technische Universität München Fakultät für Informatik Lehrstuhl IV: Software & Systems Engineering Markus Pister, Dr. Bernhard Rumpe WS 2002/2003 Lösungsblatt 1 17. Oktober 2002 www4.in.tum.de/~rumpe/se

Mehr

Finaler Testbericht. Finaler Testbericht. 1 Einführung 2. 1.1 Warum Softwaretests?... 2

Finaler Testbericht. Finaler Testbericht. 1 Einführung 2. 1.1 Warum Softwaretests?... 2 Inhaltsverzeichnis 1 Einführung 2 1.1 Warum Softwaretests?.................................... 2 2 Durchgeführte Tests 2 2.1 Test: allgemeine Funktionalität............................... 2 2.1.1 Beschreibung.....................................

Mehr

Um asynchrone Aufrufe zwischen Browser und Web Anwendung zu ermöglichen, die Ajax Hilfsmittel DWR ist gebraucht.

Um asynchrone Aufrufe zwischen Browser und Web Anwendung zu ermöglichen, die Ajax Hilfsmittel DWR ist gebraucht. Technisches Design Inhalt Design Übersicht Menü und DispatcherServlet DWR Servlet Viewer Servlets Controllers Managers Sicherheit Anwendung Architektur Component Diagram Deployment Diagram Komponente Sequence

Mehr

Hochschule Karlsruhe Technik und Wirtschaft- 10.7.2013. Anhänge: Fakultät für Informatik und Wirtschaftsinformatik SS 2013 Prof. Schmidt.

Hochschule Karlsruhe Technik und Wirtschaft- 10.7.2013. Anhänge: Fakultät für Informatik und Wirtschaftsinformatik SS 2013 Prof. Schmidt. Fakultät für Informatik und Wirtschaftsinformatik SS 2013 Datenbanken und Informationssysteme II Szenario: Projektverwaltung. Es gibt Projekte, Projektleiter, Mitarbeiter und ihre Zuordnung zu Projekten.

Mehr

Arbeiten mit Webalizer Nutzen von Statistiken zur Verbesserung Ihres Onlinemarketing

Arbeiten mit Webalizer Nutzen von Statistiken zur Verbesserung Ihres Onlinemarketing Arbeiten mit Webalizer Nutzen von Statistiken zur Verbesserung Ihres Onlinemarketing Wo finde ich Webalizer? Die Webalizer Statistiken finden Sie in Ihrem Partnernet unter http://partner.dcn.de oder über

Mehr

Inhaltsverzeichnis Abbildungsverzeichnis

Inhaltsverzeichnis Abbildungsverzeichnis Inhaltsverzeichnis Abbildungsverzeichnis... 1 1 Eigener lokaler Webserver... 2 1.1 Download der Installationsdatei... 2 1.2 Installation auf externer Festplatte... 2 1.3 Dienste starten... 5 1.4 Webserver

Mehr

PostgreSQL im praktischen Einsatz. Stefan Schumacher

PostgreSQL im praktischen Einsatz. Stefan Schumacher PostgreSQL im praktischen Einsatz 2. Brandenburger Linux Infotag 2005 Stefan Schumacher , PGP Key http:/// $Header: /home/daten/cvs/postgresql/folien.tex,v 1.11 2005/04/25

Mehr

Projektbericht Gruppe 12. Datenbanksysteme WS 05/ 06. Gruppe 12. Martin Tintel Tatjana Triebl. Seite 1 von 11

Projektbericht Gruppe 12. Datenbanksysteme WS 05/ 06. Gruppe 12. Martin Tintel Tatjana Triebl. Seite 1 von 11 Datenbanksysteme WS 05/ 06 Gruppe 12 Martin Tintel Tatjana Triebl Seite 1 von 11 Inhaltsverzeichnis Inhaltsverzeichnis... 2 1. Einleitung... 3 2. Datenbanken... 4 2.1. Oracle... 4 2.2. MySQL... 5 2.3 MS

Mehr

Übung 1: Ein Website News-System mit MySQL

Übung 1: Ein Website News-System mit MySQL Übung 1: Ein Website News-System mit MySQL In der Vorübung haben wir bereits mit Hilfe eines ERMs den Datenbankentwurf erstellt und daraus die folgenden Tabellen abgeleitet: Nun muss diese Datenbank in

Mehr

Hadoop. Simon Prewo. Simon Prewo

Hadoop. Simon Prewo. Simon Prewo Hadoop Simon Prewo Simon Prewo 1 Warum Hadoop? SQL: DB2, Oracle Hadoop? Innerhalb der letzten zwei Jahre hat sich die Datenmenge ca. verzehnfacht Die Klassiker wie DB2, Oracle usw. sind anders konzeptioniert

Mehr

Integration Services - Dienstarchitektur

Integration Services - Dienstarchitektur Integration Services - Dienstarchitektur Integration Services - Dienstarchitektur Dieser Artikel solle dabei unterstützen, Integration Services in Microsoft SQL Server be sser zu verstehen und damit die

Mehr

Aktuelle Sicherheitsprobleme im Internet: Angriffe auf Web-Applikationen

Aktuelle Sicherheitsprobleme im Internet: Angriffe auf Web-Applikationen FAEL-Seminar Aktuelle Sicherheitsprobleme im Internet: Angriffe auf Web-Applikationen Prof. Dr. Marc Rennhard Institut für angewandte Informationstechnologie InIT ZHAW Zürcher Hochschule für Angewandte

Mehr

Gegenseitige Beeinflussungen von Testautomatisierung, Testmanagement und Entwicklung

Gegenseitige Beeinflussungen von Testautomatisierung, Testmanagement und Entwicklung Gegenseitige Beeinflussungen von Testautomatisierung, Testmanagement und Entwicklung Jan Düttmann Archimedon Software + Consulting GmbH & Co. KG Marienstraße 66 32427 Minden Stephan Kleuker Hochschule

Mehr

combit Relationship Manager / address manager

combit Relationship Manager / address manager combit GmbH Untere Laube 30 78462 Konstanz combit Relationship Manager / address manager Service Pack crm 8.001 / am 18.001 What's new What's new Inhalt - 2 - Inhalt Hinweise zum Einspielen eines Service

Mehr

TWITTER INTERFACE KONFIGURATIONSANLEITUNG. Integrated Analytics GmbH Endenicher Allee 25 D - 53121 Bonn

TWITTER INTERFACE KONFIGURATIONSANLEITUNG. Integrated Analytics GmbH Endenicher Allee 25 D - 53121 Bonn TWITTER INTERFACE KONFIGURATIONSANLEITUNG Integrated Analytics GmbH Endenicher Allee 25 D - 53121 Bonn Tel.: +49.228.1801354 Fax.: +49.228.1801352 Email: info@eanalytics.de www: www.eanalytics.de Letzte

Mehr

Oracle 10g und SQL Server 2005 ein Vergleich. Thomas Wächtler 39221

Oracle 10g und SQL Server 2005 ein Vergleich. Thomas Wächtler 39221 Oracle 10g und SQL Server 2005 ein Vergleich Thomas Wächtler 39221 Inhalt 1. Einführung 2. Architektur SQL Server 2005 1. SQLOS 2. Relational Engine 3. Protocol Layer 3. Services 1. Replication 2. Reporting

Mehr

White Paper. Embedded Treiberframework. Einführung

White Paper. Embedded Treiberframework. Einführung Embedded Treiberframework Einführung White Paper Dieses White Paper beschreibt die Architektur einer Laufzeitumgebung für Gerätetreiber im embedded Umfeld. Dieses Treiberframework ist dabei auf jede embedded

Mehr

Managed VPSv3 Was ist neu?

Managed VPSv3 Was ist neu? Managed VPSv3 Was ist neu? Copyright 2006 VERIO Europe Seite 1 1 EINFÜHRUNG 3 1.1 Inhalt 3 2 WAS IST NEU? 4 2.1 Speicherplatz 4 2.2 Betriebssystem 4 2.3 Dateisystem 4 2.4 Wichtige Services 5 2.5 Programme

Mehr

Ralf Eggert. Zend Framework 2. Das Praxisbuch

Ralf Eggert. Zend Framework 2. Das Praxisbuch Ralf Eggert Zend Framework 2 Das Praxisbuch 7.4 Ein Anwendungsmodul entwickeln 7.3.7 Weitere Konfigurationen Der Modul-Manager ermöglicht auch die Konfiguration weiterer Elemente, für die entsprechende

Mehr

Whitepaper. Produkt: combit Relationship Manager / address manager. Integration der Ansicht "Adressen" in eigene Solution

Whitepaper. Produkt: combit Relationship Manager / address manager. Integration der Ansicht Adressen in eigene Solution combit GmbH Untere Laube 30 78462 Konstanz Whitepaper Produkt: combit Relationship Manager / address manager Integration der Ansicht "Adressen" in eigene Solution Integration der Ansicht "Adressen" in

Mehr

Internetanbindung von Datenbanken

Internetanbindung von Datenbanken Internetanbindung von Datenbanken http://galahad.informatik.fh-kl.de/~miesel/index.html PHP -1 Gliederung Einführung PHP3 Datenbankanbindung mit PHP3 Sicherheitsprobleme Realisierung mit PHP3 Probleme

Mehr

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

Suche schlecht beschriftete Bilder mit Eigenen Abfragen Suche schlecht beschriftete Bilder mit Eigenen Abfragen Ist die Bilderdatenbank über einen längeren Zeitraum in Benutzung, so steigt die Wahrscheinlichkeit für schlecht beschriftete Bilder 1. Insbesondere

Mehr

eadmin Manual Universitätsstraße 3 56070 Koblenz Deutschland

eadmin Manual Universitätsstraße 3 56070 Koblenz Deutschland DOKUMENT: TYP: ERSTELLT VON: Manual nova ratio AG Universitätsstraße 3 56070 Koblenz Deutschland VERSION: STAND: 9.x 23. September 2015 Inhaltsverzeichnis 1 2 2.1 2.2 2.3 3 3.1 3.2 3.3 4 4.1 4.2 4.3 4.4

Mehr

Hochschule Darmstadt Fachbereich Informatik

Hochschule Darmstadt Fachbereich Informatik Hochschule Darmstadt Fachbereich Informatik Entwicklung webbasierter Anwendungen Tipps und Tricks zur Software Installation 1 Vorbemerkung Auf den Laborrechnern ist natürlich alles installiert! Die Installation

Mehr

Microsoft SQL Server 2014 Express & EPLAN Plattform. EPLAN-Product-IT-Support / FOS / 2015 1

Microsoft SQL Server 2014 Express & EPLAN Plattform. EPLAN-Product-IT-Support / FOS / 2015 1 Microsoft SQL Server 2014 Express & EPLAN Plattform 1 Microsoft SQL Server & EPLAN Plattform Übersicht Download - Microsoft SQL Server 2014 Express mit Advances Services Installation - Microsoft SQL Server

Mehr

MySQL Queries on "Nmap Results"

MySQL Queries on Nmap Results MySQL Queries on "Nmap Results" SQL Abfragen auf Nmap Ergebnisse Ivan Bütler 31. August 2009 Wer den Portscanner "NMAP" häufig benutzt weiss, dass die Auswertung von grossen Scans mit vielen C- oder sogar

Mehr

3 Richtlinienbasierte Verwaltung und Multi-Server- Administration

3 Richtlinienbasierte Verwaltung und Multi-Server- Administration Richtlinienbasierte Verwaltung und Multi-Server-Administration 3 Richtlinienbasierte Verwaltung und Multi-Server- Administration SQL Server Management Studio bietet eine Reihe von Unterstützungsmöglichkeiten,

Mehr

1. Einführung 1. 2. Update manuell installieren 1. 3. Update wird immer wieder verlangt 2. 4. Download des Updates bricht ab (keine Meldung) 5

1. Einführung 1. 2. Update manuell installieren 1. 3. Update wird immer wieder verlangt 2. 4. Download des Updates bricht ab (keine Meldung) 5 Inhalt 1. Einführung 1 2. Update manuell installieren 1 3. Update wird immer wieder verlangt 2 4. Download des Updates bricht ab (keine Meldung) 5 5. Download des Updates bricht ab (Meldung: changes must

Mehr

Acrolinx IQ. Verbindung mit einer externen Terminologiedatenbank herstellen 2.7

Acrolinx IQ. Verbindung mit einer externen Terminologiedatenbank herstellen 2.7 Acrolinx IQ Verbindung mit einer externen Terminologiedatenbank herstellen 2.7 2 Inhalt Einleitung 3 Über diesen Leitfaden...3 Verbinden mit externen Terminologiedatenbanken 4 Erstellen von Sicherungen

Mehr

VLADISLAVA ARABADZHIEVA

VLADISLAVA ARABADZHIEVA VLADISLAVA ARABADZHIEVA Bachelor of Science Informatik Geburtsjahr 1987 Profil-Stand August 2015 Triona Information und Technologie GmbH Wilhelm-Theodor-Römheld-Str. 14 55130 Mainz Fon +49 (0) 61 31 9

Mehr

WI-Praktikum Online Börseninformationssystem. Pflichtenheft. Team:

WI-Praktikum Online Börseninformationssystem. Pflichtenheft. Team: WI-Praktikum Online Börseninformationssystem Pflichtenheft Team: Gäckler, Marco (Teamleiter) Abolhassani, Ruhollah Lauer, Christian Mbongo, Max Saissi, Taoufik Inhalt 1. Ausgangssituation...3 2. Zielsetzung...3

Mehr

Typo 3 installieren. Schritt 1: Download von Typo3

Typo 3 installieren. Schritt 1: Download von Typo3 Typo 3 installieren Bevor Sie Typo3 installieren, müssen Sie folgende Informationen beachten: Typo3 benötigt eine leere Datenbank. Mit Ihrem Abonnement verfügen Sie über eine einzige Datenbank. Sie können

Mehr

Modul 2.4.1: Möglichkeiten zur Erweiterung des Internet-Auftritts der Schule zu einem umfassenden Auftritt als Bildungsnetzwerk

Modul 2.4.1: Möglichkeiten zur Erweiterung des Internet-Auftritts der Schule zu einem umfassenden Auftritt als Bildungsnetzwerk Informationsmaterial zum Modul-Nr. 2.4: Bildungsnetzwerke planen (Schwerpunkt: IT-Unterstützung in Bildungsnetzwerken) Modul 2.4.1: Möglichkeiten zur Erweiterung des Internet-Auftritts der Schule zu einem

Mehr

Von der UML nach C++

Von der UML nach C++ 22 Von der UML nach C++ Dieses Kapitel behandelt die folgenden Themen: Vererbung Interfaces Assoziationen Multiplizität Aggregation Komposition Die Unified Modeling Language (UML) ist eine weit verbreitete

Mehr

PHP und MySQL. Integration von MySQL in PHP. Zellescher Weg 12 Willers-Bau A109 Tel. +49 351-463 - 32424. Michael Kluge (michael.kluge@tu-dresden.

PHP und MySQL. Integration von MySQL in PHP. Zellescher Weg 12 Willers-Bau A109 Tel. +49 351-463 - 32424. Michael Kluge (michael.kluge@tu-dresden. Zentrum für Informationsdienste und Hochleistungsrechnen (ZIH) PHP und MySQL Integration von MySQL in PHP Zellescher Weg 12 Willers-Bau A109 Tel. +49 351-463 - 32424 (michael.kluge@tu-dresden.de) MySQL

Mehr

Klausur Kommunikation I. Sommersemester 2003. Dipl.-Ing. T. Kloepfer

Klausur Kommunikation I. Sommersemester 2003. Dipl.-Ing. T. Kloepfer Kommunikation I 1 Klausur Kommunikation I Sommersemester 2003 Dipl.-Ing. T. Kloepfer Bearbeitungsinformationen Aufbau der Klausur Die Klausur ist wie folgt aufgebaut: Die Klausur ist in 18 Aufgaben unterteilt.

Mehr

Sophos Mobile Control Benutzerhandbuch für Apple ios

Sophos Mobile Control Benutzerhandbuch für Apple ios Sophos Mobile Control Benutzerhandbuch für Apple ios Produktversion: 2 Stand: Dezember 2011 Inhalt 1 Über Sophos Mobile Control... 3 2 Einrichten von Sophos Mobile Control auf einem Apple iphone... 4 3

Mehr

DRESDEN, 08.10.2009 CHRISTIAN.KNAUER@INF.TU-DRESEDEN.DE

DRESDEN, 08.10.2009 CHRISTIAN.KNAUER@INF.TU-DRESEDEN.DE DOKUMENTATION MAAS - MONITORING AS A SERVICE DRESDEN, 08.10.2009 CHRISTIAN.KNAUER@INF.TU-DRESEDEN.DE Dokumentation MaaS - Monitoring as a Service Inhalt 1. MaaS - Monitoring as Service... 3 1.1 Einleitung...

Mehr

Benutzerhandbuch MAMP 3! März 2014 (c) appsolute GmbH

Benutzerhandbuch MAMP 3! März 2014 (c) appsolute GmbH Benutzerhandbuch MAMP 3! März 2014 (c) appsolute GmbH I. Installation! 3! 1. Installationsvoraussetzungen 3 2. Installation und Aktualisierung 3 3. De-Installation 3 II. Erste Schritte! 4! III. Einstellungen!

Mehr

Einführung in die Informatik II

Einführung in die Informatik II Einführung in die Informatik II Die Structured Query Language SQL Prof. Dr. Nikolaus Wulff SQL Das E/R-Modell lässt sich eins zu eins auf ein Tabellenschema abbilden. Benötigt wird eine Syntax, um Tabellen

Mehr

Werkzeuge für Datenbank Handwerker: IBM Data Studio und IBM Optim QWT

Werkzeuge für Datenbank Handwerker: IBM Data Studio und IBM Optim QWT Werkzeuge für Datenbank Handwerker: IBM Data Studio und IBM Optim QWT Neue Technologien effizient nutzen Ehningen, 3. Juli 2014 Rodney Krick rk@aformatik.de aformatik Training & Consulting GmbH & Co. KG

Mehr

Einführung in SQL Datenbanken bearbeiten

Einführung in SQL Datenbanken bearbeiten Einführung in SQL Datenbanken bearbeiten Jürgen Thomas Entstanden als Wiki-Buch Bibliografische Information Diese Publikation ist bei der Deutschen Nationalbibliothek registriert. Detaillierte Angaben

Mehr

Dokumentation zum Projekt Mail-Adapter in SAP PI. 17.01.2011 Sinkwitz, Sven 519707 Theel, Thomas 519696

Dokumentation zum Projekt Mail-Adapter in SAP PI. 17.01.2011 Sinkwitz, Sven 519707 Theel, Thomas 519696 Dokumentation zum Projekt Mail-Adapter in SAP PI 17.01.2011 Sinkwitz, Sven 519707 Theel, Thomas 519696 Inhalt 1. Einleitung... 2 2. Vorgehen... 3 1. Datentyp für die Mail einrichten... 3 2. Message Typen

Mehr

Proseminar Website-Management-Systeme im Wintersemester 2003/2004 AG Softwaretechnik. PHP-Nuke. PHP-Nuke. von Andreas Emrich

Proseminar Website-Management-Systeme im Wintersemester 2003/2004 AG Softwaretechnik. PHP-Nuke. PHP-Nuke. von Andreas Emrich AG Softwaretechnik 1 Übersicht 1. Grundlagen und Konzepte 2. Komponenten von 3. Erweiterungsmöglichkeiten und Personalisierung 4. Abschließende Bewertung 5. Literaturangaben 2 1. : Grundlagen und Konzepte

Mehr

PDF FormServer Quickstart

PDF FormServer Quickstart PDF FormServer Quickstart 1. Voraussetzungen Der PDF FormServer benötigt als Basis einen Computer mit den Betriebssystemen Windows 98SE, Windows NT, Windows 2000, Windows XP Pro, Windows 2000 Server oder

Mehr

TimeSafe Leistungserfassung

TimeSafe Leistungserfassung Keep your time safe. TimeSafe Leistungserfassung Adressimport 1/8 Inhaltsverzeichnis Inhaltsverzeichnis... 2 1 Allgemeines... 3 1.1 Adressen in der TimeSafe Leistungserfassung... 3 1.2 Organisationen und/oder

Mehr

Aktuelle Sicherheitsprobleme im Internet

Aktuelle Sicherheitsprobleme im Internet Herbst 2014 Aktuelle Sicherheitsprobleme im Internet Wirtschaftsinformatik: 5. Semester Dozenten: Rainer Telesko / Martin Hüsler Fachhochschule Nordwestschweiz FHNW / Rainer Telesko - Martin Hüsler 1 Inhalt

Mehr

Dynamik bis zur DB-Interaktion. Marc Schanne. CGI Möglichkeiten

Dynamik bis zur DB-Interaktion. Marc Schanne. CGI Möglichkeiten CGI einfach PHP Dynamik bis zur DB-Interaktion 1 CGI Möglichkeiten Das Common Gateway Interface (CGI) ermöglicht den Entwurf von interaktiven, benutzergesteuerten Web-Applikationen. Der WWW-Server ruft

Mehr

Praktikum Internetprotokolle - POP3

Praktikum Internetprotokolle - POP3 Technische Universität Ilmenau Fakultät für Informatik und Automatisierung Institut für Praktische Informatik und Medieninformatik Fachgebiet Telematik/Rechnernetze 19. Mai 2008 1 Aufgabenstellung Praktikum

Mehr

Knottenwäldchen Software

Knottenwäldchen Software Knottenwäldchen Software Installationsanleitung für die netzbasierte Lösung Knottenwäldchen Software März.2011 Knottenwäldchen Software Seite 2 1 Inhalt 1 Inhalt... 2 2 Übersicht... 3 3 Installation...

Mehr

Sophos Mobile Control Benutzerhandbuch für Android

Sophos Mobile Control Benutzerhandbuch für Android Sophos Mobile Control Benutzerhandbuch für Android Produktversion: 2 Stand: Dezember 2011 Inhalt 1 Über Sophos Mobile Control... 3 2 Einrichten von Sophos Mobile Control auf einem Android-Mobiltelefon...

Mehr

Test-Strategien. Grundsätzliches Blackbox-Testen Whitebox-Testen Graybox-Testen Ablauf von Tests Zusammenfassung. HS Mannheim

Test-Strategien. Grundsätzliches Blackbox-Testen Whitebox-Testen Graybox-Testen Ablauf von Tests Zusammenfassung. HS Mannheim Test- Grundsätzliches - - - Ablauf von Tests Grundsätzliche Test- -Tests Äquivalenzklassenbildung Randwertanalyse -Tests Man unterscheidet verschiedene Überdeckungsgrade: Statement Coverage Decision Coverage,

Mehr

Erklärung der Webalizer Statistik

Erklärung der Webalizer Statistik Webhost Linux Erklärung der Webalizer Statistik - 1 - Erklärung der Webalizer-Statistik Dieses Dokument beschreibt den Aufbau der Auswertung der Webserver-Statistiken. Die Auswertungen sind täglich ab

Mehr

Objektorientiertes Programmieren für Ingenieure

Objektorientiertes Programmieren für Ingenieure Uwe Probst Objektorientiertes Programmieren für Ingenieure Anwendungen und Beispiele in C++ 18 2 Von C zu C++ 2.2.2 Referenzen und Funktionen Referenzen als Funktionsparameter Liefert eine Funktion einen

Mehr

PostgreSQL auf Debian System

PostgreSQL auf Debian System PostgreSQL auf Debian System Inhaltsverzeichnis 1. Installation 1.1 Installation 1.2 Mit postgres anmelden 2. Benutzer anlegen 3. Datenbank anlegen 3.1 Optionen 3.2 Datenbank mydatabase anlegen 4. Datenbank

Mehr