Vorwort | 16 |
Teil I: Den Benutzer im Fokus: Geodaten, Zeitzonen und Schriftzeichen | 20 |
1 Geodaten | 22 |
1.1 Geolokalisierung in HTML5 | 23 |
1.1.1 Abfrage der aktuellen Position | 23 |
1.1.2 Ergebnis der Positionsabfrage | 24 |
1.1.3 Verfolgen von Positionsänderungen | 25 |
1.1.4 Optionen für die Positionsabfrage | 26 |
1.1.5 Zusammenfassung | 27 |
1.2 Lokalisierung über IP-Adresse | 27 |
1.2.1 Installation der GeoIP-PHP-Erweiterung | 27 |
1.2.2 Installation der Datenbank | 28 |
1.2.3 Auswerten der Daten | 28 |
1.2.4 Vor- und Nachteile | 30 |
1.3 GEOS | 30 |
1.3.1 Installation | 30 |
1.3.2 Geometrische Formen und Datenformate | 31 |
1.3.3 Erzeugen von geometrischen Objekten | 34 |
1.3.4 Abfragen, ob ein Objekt ein anderes beinhaltet | 36 |
1.3.5 Abfragen von Objektüberschneidungen | 38 |
1.3.6 Verändern und Kombinieren von Objekten | 39 |
1.3.7 Abfragen von Eigenschaften | 42 |
1.3.8 Bestimmen von Distanzen, Längen und Flächen | 45 |
1.3.9 Zusammenfassung | 46 |
1.4 Projektionen | 46 |
1.4.1 Arten von Projektionen | 47 |
1.4.2 Georeferenzsysteme | 50 |
1.4.3 Auswahl eines Georeferenzsystems | 52 |
1.5 Zusammenfassung | 55 |
2 Geodaten speichern | 56 |
2.1 MySQL und Geodaten | 56 |
2.1.1 Datentypen und Datenformate | 57 |
2.1.2 Beispieldaten: Landkreise und Geoinformationen | 59 |
2.1.3 Einfache geometrische Funktionen | 62 |
2.1.4 Abfragen geometrischer Beziehungen | 64 |
2.1.5 Erstellen eines geometrischen Index | 66 |
2.1.6 Zusammenfassung | 67 |
2.2 PostGIS | 67 |
2.2.1 Installation | 68 |
2.2.2 Anlegen der Datenbank | 69 |
2.2.3 Erstellen einer Tabelle mit Geodaten | 70 |
2.2.4 Laden von Shape-Dateien | 71 |
2.2.5 Ausgabedatenformate | 72 |
2.2.6 Geography-Datentyp | 74 |
2.2.7 Erstellen geometrischer Indexe | 77 |
2.2.8 Beispiele für Geo-Abfragen | 79 |
2.2.9 Kombinieren mit Maßzahlen (Measure) | 84 |
2.3 Routenberechnung mit SpatiaLite | 89 |
2.3.1 Installation | 89 |
2.3.2 Laden und Indizieren von OSM-Daten | 91 |
2.3.3 Suche des kürzesten Weges | 92 |
2.3.4 Zusammenfassung | 94 |
2.4 Kartendarstellung mit OpenLayers | 95 |
2.4.1 Software für einen Kartendienst | 95 |
2.4.2 Vorteile von OpenLayers | 96 |
2.4.3 Einfache Kartendarstellung | 96 |
2.4.4 Route in einem Layer darstellen | 98 |
2.5 Zusammenfassung | 100 |
3 Zeit und Zeitzonen | 102 |
3.1 Zeitzonen und koordinierte Weltzeit (UTC) | 102 |
3.1.1 Angabe von Zeitzonen | 103 |
3.1.2 Veränderungen der Zeitzonen | 104 |
3.1.3 Zeitzonendatenbank | 104 |
3.2 Sommerzeit | 105 |
3.3 Zeitangaben in PHP | 106 |
3.3.1 Verwendung von Unix-Zeitstempeln | 106 |
3.3.2 DateTime-Objekte | 107 |
3.4 Zeitdatentypen in MySQL | 109 |
3.4.1 Vorbereiten und Aktualisieren der Datenbank | 110 |
3.4.2 Umrechnungen | 110 |
3.4.3 Zeit- und Datumsfunktionen | 111 |
3.4.4 Empfohlene Datentypen | 112 |
3.5 Nicht-Gregorianischer Kalender | 113 |
3.6 Ermitteln der Zeitzone des Benutzers | 115 |
3.6.1 Abfragen der Client-Zeit mit JavaScript | 115 |
3.6.2 Zeitzone über Ort bestimmen | 116 |
3.6.3 Vor- und Nachteile | 117 |
3.7 Zusammenfassung | 117 |
4 Unicode | 118 |
4.1 Zeichenkodierung | 118 |
4.1.1 Kodierung und Decodierung | 119 |
4.1.2 Zeichensatz | 120 |
4.2 Unicode-Grundlagen | 121 |
4.2.1 Codepoints | 122 |
4.2.2 Abstrakte Zeichen und Äquivalente | 122 |
4.2.3 Grapheme und Komposita | 123 |
4.2.4 UTF-8 (Zeichenkodierung) | 124 |
4.2.5 UTF-16 (Zeichenkodierung) | 125 |
4.2.6 UTF-32 (Zeichenkodierung) | 127 |
4.2.7 Zusammenfassung | 127 |
4.3 PHP und Unicode | 128 |
4.3.1 Unicode ist ein Muss | 128 |
4.3.2 Unicode im PHP-Quellcode | 128 |
4.3.3 Unicode ohne Unicode-Unterstützung | 129 |
4.3.4 Validieren und Normalisieren von UTF-8-Zeichenfolgen | 131 |
4.3.5 Multibyte-Strings (PHP-Modul mbstring) | 136 |
4.3.6 Reguläre Ausdrücke | 137 |
4.3.7 Grapheme und die Länge eines Strings | 138 |
4.3.8 Zusammenfassung | 142 |
4.4 MySQL und Unicode | 143 |
4.4.1 Unterstützte Kodierungen | 143 |
4.4.2 Kodierung der Client-Verbindung | 143 |
4.4.3 Sortierfolge und Textvergleich | 144 |
4.4.4 Angeben der gewünschten Sortierfolge | 145 |
4.4.5 Auswirkung auf Indexe | 148 |
4.4.6 Fazit | 149 |
4.5 Zusammenfassung | 150 |
Teil II: Interaktive Websites: Kommunikation zwischen Client und Server | 152 |
5 Interaktive Websites | 154 |
5.1 JavaScript Object Notation (JSON) | 155 |
5.1.1 JSON-Syntax | 155 |
5.1.2 Datentypen | 156 |
5.1.3 JSON & PHP | 157 |
5.1.4 JSON parsen mit JavaScript | 161 |
5.1.5 Zusammenfassung | 165 |
5.2 JavaScript Object Notation with Padding (JSONP) | 165 |
5.2.1 Funktionsweise | 165 |
5.2.2 Sicherheit | 167 |
5.2.3 Zusammenfassung | 169 |
5.3 XMLHttpRequest | 169 |
5.3.1 Basisfunktionalität (XHR Level 1) | 169 |
5.3.2 Beispiel: Nachladen von Textinhalten | 172 |
5.3.3 Beispiel: Nachladen von XML-Inhalten | 175 |
5.4 Cross-Origin Resource Sharing (CORS) | 178 |
5.4.1 Einfache CORS-Anfragen | 178 |
5.4.2 Komplexe CORS-Abfragen (preflighted requests) | 180 |
5.4.3 Mitsenden bzw. Akzeptieren von Cookies | 181 |
5.4.4 Überblick über alle CORS-HTTP-Header | 182 |
5.5 XMLHttpRequest – Level 2 | 183 |
5.5.1 Erweiterte Ereignissteuerung (XHR Level 2) | 183 |
5.5.2 Neue Datentypen (XHR Level 2) | 186 |
5.6 Navigation in AJAX-Anwendungen | 191 |
5.6.1 URL-Fragmente und Hashbang (#!) | 191 |
5.6.2 HTML5-Session-History | 192 |
5.7 Zusammenfassung | 195 |
6 Servergesteuerte Aktualisierung (Server Push) | 196 |
6.1 Kontinuierliches Abfragen (Polling) | 196 |
6.2 Long Polling und Server-sent Events (SSE) | 197 |
6.2.1 Server-sent Events: Client-Seite | 198 |
6.2.2 Server-sent Events: Protokoll | 201 |
6.2.3 Server-sent Events: Serverseite | 202 |
6.2.4 Analyse der notwendigen Ressourcen | 204 |
6.3 Eventbasierter PHP-Server | 204 |
6.3.1 Eventbasierte Architektur | 205 |
6.3.2 libevent | 207 |
6.3.3 PHP-Server mit libevent | 207 |
6.3.4 Beispiel: PHP-Server für Server-sent Events | 213 |
6.3.5 Ressourcen und Geschwindigkeit | 216 |
6.3.6 Zusammenfassung | 216 |
6.4 WebSocket | 217 |
6.4.1 Ablauf | 217 |
6.4.2 Handshake | 218 |
6.4.3 Datenübertragung mit Frames | 221 |
6.4.4 Beispiel: Eventbasierter PHP-WebSocket-Server | 225 |
6.4.5 Client-Seite | 229 |
6.4.6 Fazit | 235 |
6.5 Zusammenfassung | 235 |
Teil III: Immer schneller: Leistungsstarke Webseiten | 236 |
7 Frontend optimieren | 238 |
7.1 Warum ist das Frontend wichtig? | 238 |
7.2 Caching-Mechanismen im HTTP-Protokoll | 241 |
7.2.1 Caching-Dauer begrenzen | 241 |
7.2.2 Veränderliche Inhalte | 245 |
7.2.3 Bedingungen für die Zwischenspeicherung | 248 |
7.2.4 Kombinieren der HTTP-Header | 249 |
7.2.5 Grenzen und Probleme | 250 |
7.3 Auswirkungen des TCP-Protokolls | 250 |
7.3.1 Aufbau einer TCP-Verbindung | 250 |
7.3.2 Durchsatz einer TCP-Verbindung | 251 |
7.3.3 Browser, Verbindungen und Datendurchsatz | 253 |
7.4 Reduzieren der Anzahl der HTTP-Requests | 254 |
7.4.1 Caching | 254 |
7.4.2 Eliminieren von Umleitungen (HTTP Redirect) | 255 |
7.4.3 Zusammenführen von CSS- und JavaScript-Dateien | 256 |
7.4.4 CSS-Sprites | 257 |
7.4.5 Kleine Bilder direkt einbinden (data-Protokoll) | 259 |
7.5 Reduzieren der Größe der Ressourcen | 260 |
7.5.1 Komprimierung bei der Übertragung | 260 |
7.5.2 JavaScript | 262 |
7.5.3 CSS | 263 |
7.5.4 Bilder | 263 |
7.5.5 HTML | 264 |
7.6 Darstellungsgeschwindigkeit | 264 |
7.6.1 Einbinden von Stylesheets | 265 |
7.6.2 Einbinden von JavaScript | 265 |
7.6.3 Dynamisches Nachladen von JavaScript | 267 |
7.6.4 Minimieren von Darstellungsänderungen (Reflow) | 268 |
7.7 Weitere Techniken | 269 |
7.7.1 Flush early | 269 |
7.7.2 Anzahl der Domänen (Sharding) | 271 |
7.7.3 Cookies | 271 |
7.8 HTML 5-Web Storage | 272 |
7.8.1 Web Storage | 273 |
7.8.2 Web Storage als Cache nutzen | 277 |
7.9 Messen und Analysieren | 281 |
7.9.1 Ladezeiten und HTTP-Wasserfall | 281 |
7.9.2 Werkzeuge zur schnellen Analyse | 283 |
7.9.3 Detailanalyse | 284 |
7.10 Zusammenfassung | 285 |
8 Caching von Inhalten | 286 |
8.1 Einsatz und Ablauf von Caching | 286 |
8.1.1 Zwischenspeichern mit einem Reverse Proxy | 287 |
8.1.2 Zwischenspeichern in PHP | 288 |
8.1.3 Geeignete Inhalte auswählen | 289 |
8.2 Aktualisieren von gecachten Inhalten | 292 |
8.2.1 Synchron aktualisieren | 292 |
8.2.2 Asynchron aktualisieren | 293 |
8.2.3 Zu bestimmten Zeitpunkten aktualisieren | 293 |
8.2.4 Vor Ablauf aktualisieren | 293 |
8.2.5 Bei Zugriff aktualisieren | 294 |
8.3 Verhindern eines Cache-Sturms | 294 |
8.4 Zusammenfassung | 296 |
9 Varnish und Edge Side Includes | 298 |
9.1 Installation und Administration | 298 |
9.1.1 Installation vom Quellcode | 298 |
9.1.2 Starten von Varnish | 299 |
9.1.3 Administration | 299 |
9.1.4 Konfigurationsdateien | 301 |
9.2 Reverse Proxy | 302 |
9.2.1 Festlegen eines Webservers | 303 |
9.2.2 Cache-Eigenschaften | 304 |
9.2.3 Mehrere Webserver für unterschiedliche URLs | 305 |
9.2.4 Lastverteilung | 307 |
9.2.5 Cookies und Caching | 308 |
9.3 Edge Side Includes | 309 |
9.3.1 Syntax | 311 |
9.3.2 Konfiguration in Varnish | 311 |
9.3.3 Beispiel | 313 |
9.3.4 Alternative in JavaScript | 315 |
9.4 Zusammenfassung | 315 |
10 Alternative PHP Cache (APC) | 316 |
10.1 Installation | 316 |
10.2 Überblick und Konfiguration | 317 |
10.2.1 Opcode-Cache | 317 |
10.2.2 Benutzer-Cache | 318 |
10.2.3 Konfiguration | 318 |
10.3 Daten mit APC cachen | 320 |
10.4 Ablauf von Daten in APC | 322 |
10.5 Aktualisieren von Einträgen vor Ablauf | 323 |
10.5.1 Übersicht | 323 |
10.5.2 Sichtweise des aufrufenden Programms | 324 |
10.5.3 CachedValue-Klasse | 326 |
10.5.4 Auslesen des Eintrages (get-Methode) | 327 |
10.5.5 Speichern des Eintrages (store-Methode) | 329 |
10.5.6 Verhalten bei parallelen Zugriffen | 329 |
10.6 APC anfüttern | 331 |
10.7 Monitoring | 332 |
10.7.1 APC-eigenes Skript (apc.php) | 332 |
10.7.2 APC-Funktionen zum Monitoring | 333 |
10.8 Zusammenfassung | 335 |
11 Memcached | 336 |
11.1 Funktionsweise | 336 |
11.1.1 Übersicht und Prinzipien | 336 |
11.1.2 Datenverteilung auf Server und konsistentes Hashing | 338 |
11.1.3 Lebensdauer von Einträgen | 339 |
11.2 Installation | 340 |
11.2.1 Installieren des Servers | 340 |
11.2.2 Installieren des PHP-Moduls | 341 |
11.3 Daten cachen | 343 |
11.3.1 Zu Memcached verbinden | 343 |
11.3.2 Daten in Memcached speichern und abfragen | 345 |
11.3.3 Kombinieren mehrerer Abfragen | 347 |
11.4 Gruppieren von Werten | 348 |
11.4.1 Beispielprogramm: Benutzerklasse | 349 |
11.4.2 Beispielprogramm: Nachrichtenklasse | 350 |
11.4.3 Beispielprogramm: Nachricht schreiben und speichern | 350 |
11.4.4 Beispielprogramm: Asynchrones Auslesen aller Nachrichten | 352 |
11.5 Aktualisieren von Einträgen | 354 |
11.5.1 Überblick | 354 |
11.5.2 CachedValue-Klasse | 355 |
11.5.3 Auslesen eines Eintrages (get-Methode) | 356 |
11.5.4 Neuberechnung eines Eintrages | 357 |
11.5.5 Sichtweise des aufrufenden Programms | 358 |
11.5.6 Verhalten bei parallelen Zugriffen | 359 |
11.6 Ausfallsicherheit | 360 |
11.7 Hinweise zum Praxiseinsatz | 361 |
11.7.1 Auswahl der Server | 361 |
11.7.2 Memcached und Sessions | 362 |
11.7.3 Cachen des Fehlerfalls | 362 |
11.7.4 Speichern von statischen Inhalten | 363 |
11.7.5 Monitoring | 363 |
11.8 Zusammenfassung | 365 |
Teil IV: Datenbanken à la carte: MySQL und NoSQL | 366 |
12 MySQL für Fortgeschrittene | 368 |
12.1 Sakila-Beispieldatenbanken | 368 |
12.2 Index-Strategien | 370 |
12.2.1 Grundlagen | 370 |
12.2.2 Verwenden von Indexen | 372 |
12.2.3 Abdeckender Index (Covering Index) | 375 |
12.2.4 Sortieren von Daten | 376 |
12.2.5 Indexgröße | 379 |
12.3 Optimieren von Abfragen | 381 |
12.3.1 Abfragen von nicht benötigten Daten | 381 |
12.3.2 Seitenweises Blättern mit LIMIT | 382 |
12.3.3 Bereichsabfragen mit mehrspaltigen Indexen | 383 |
12.3.4 Beispiel: JOIN optimieren | 385 |
12.3.5 Zusammenfassung | 387 |
12.4 Transaktionen | 387 |
12.4.1 SQL-Transaktionen | 388 |
12.4.2 Isolationsstufen von Transaktionen | 390 |
12.4.3 MVCC und Lock-Mechanismen der Isolationsstufen | 391 |
12.4.4 Transaktionen mit PHP | 395 |
12.4.5 Fazit | 397 |
12.5 Zusammenfassung | 398 |
13 Redis | 400 |
13.1 Warum NoSQL? | 400 |
13.2 Übersicht | 403 |
13.3 Installation | 404 |
13.3.1 Installation als Boot-Service | 404 |
13.3.2 Installation des PHP-Moduls | 405 |
13.4 Aufbauen der Verbindung zu Redis | 406 |
13.4.1 Persistente Verbindungen | 406 |
13.4.2 Optionen | 406 |
13.5 Datentypen | 407 |
13.5.1 Zeichenketten | 407 |
13.5.2 Listen | 414 |
13.5.3 Mengen | 421 |
13.5.4 Sortierte Mengen | 431 |
13.5.5 Hashes | 439 |
13.6 Weitere Funktionen | 442 |
13.6.1 Befehle zur Schlüsselverwaltung | 443 |
13.6.2 Ablauf von Einträgen | 444 |
13.6.3 Sortieren | 445 |
13.7 Transaktionen und Pipelining | 449 |
13.8 Persistieren der Datenbank | 451 |
13.8.1 Snapshot der Datenbank | 451 |
13.8.2 Speichern per Logdatei | 452 |
13.9 Zusammenfassung | 453 |
14 MongoDB | 454 |
14.1 Installation | 454 |
14.1.1 Mongo-Shell | 455 |
14.1.2 Installation der PHP-Erweiterung | 455 |
14.2 Datenbanken und Datenschema | 456 |
14.2.1 Verbinden und Auswahl der Datenbank | 456 |
14.2.2 Auswahl und Erzeugen von Kollektionen | 457 |
14.2.3 Dokumente und Datentypen | 458 |
14.2.4 Entwerfen des Datenschemas | 460 |
14.3 CRUD-Operationen | 462 |
14.3.1 Einfügen von Dokumenten | 463 |
14.3.2 Fehlerbehandlung | 464 |
14.3.3 Primäre Schlüssel | 466 |
14.3.4 Finden von Dokumenten | 467 |
14.3.5 Aktualisieren von Dokumenten (Update) | 468 |
14.3.6 Aktualisieren verschachtelter Dokumente | 471 |
14.3.7 Löschen von Dokumenten und Kollektionen | 475 |
14.4 MongoDB-Abfragesprache | 476 |
14.4.1 Operatoren | 476 |
14.4.2 Verschachtelte Dokumente und Arrays | 478 |
14.4.3 Komplexe Bedingungen ($where) | 480 |
14.4.4 Sortieren | 482 |
14.4.5 Gruppieren | 484 |
14.5 Indizieren von Feldern | 487 |
14.5.1 Indexarten | 488 |
14.5.2 Verwenden von Indexen | 489 |
14.5.3 Analysieren von Abfragen mit explain() | 490 |
14.6 Map/Reduce | 494 |
14.6.1 Prinzip | 495 |
14.6.2 Ablauf und Parameter | 497 |
14.6.3 Inkrementelle Berechnung | 501 |
14.7 Replikation und Verfügbarkeit | 504 |
14.7.1 Funktionsweise | 504 |
14.7.2 Anlegen einer Replikationsgruppe | 504 |
14.7.3 Verwenden in PHP | 505 |
14.8 Sharding und Skalierung | 506 |
14.8.1 Funktionsweise | 507 |
14.8.2 Sharding konfigurieren | 507 |
14.8.3 Verwendung | 508 |
14.8.4 Sharding-Schlüssel auswählen | 509 |
14.9 Zusammenfassung | 510 |
Bildnachweise | 512 |
Index | 514 |