Von Geodaten bis NoSQL: Leistungsstarke PHP-Anwendungen - Aktuelle Techniken und Methoden für Fortgeschrittene

Arno Hollosi

Von Geodaten bis NoSQL: Leistungsstarke PHP-Anwendungen

Aktuelle Techniken und Methoden für Fortgeschrittene

2012

528 Seiten

Format: PDF, Online Lesen

E-Book: €  27,99

E-Book kaufen

E-Book kaufen

ISBN: 9783446431225

 

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