Arno Hollosi
Von Geodaten bis NoSQL: Leistungsstarke PHP-Anwendungen
Aktuelle Techniken und Methoden für Fortgeschrittene
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
© 2009-2024 ciando GmbH