Start · Sprachen · PHP · Referenz · simdjson_is_valid

simdjson_is_valid

Funktion

Prüft mit der SIMD-beschleunigten simdjson-Bibliothek, ob ein JSON-String gültig ist, ohne ihn vollständig zu dekodieren.

seit PHP 8.0.0 Kategorie: json

Signatur

simdjson_is_valid(string $json, int $depth = 512, int $options = 0): bool

Beschreibung

simdjson_is_valid() validiert einen JSON-String mithilfe der hochperformanten simdjson-Bibliothek, die moderne SIMD-CPU-Instruktionen (AVX2, SSE4.2, NEON) nutzt, um JSON deutlich schneller zu verarbeiten als die klassische json_decode()-Funktion. Das Ergebnis ist ein einfaches true oder false – ideal für Vorprüfungen, bevor aufwändiges Dekodieren stattfindet.

Im Vergleich zu json_validate() (eingeführt in PHP 8.3) oder dem Muster json_decode() + json_last_error() bietet diese Funktion durch die SIMD-Optimierung eine erheblich bessere Leistung bei großen JSON-Dokumenten oder bei hohem Durchsatz in Web-APIs und Datenpipelines.

Typische Einsatzgebiete sind die Validierung von API-Anfragen, das Prüfen von JSON-Nutzlasten aus Nachrichtenwarteschlangen (z. B. RabbitMQ, Kafka) sowie das schnelle Aussortieren ungültiger Eingaben vor dem eigentlichen Verarbeitungsschritt.

Die Funktion gehört zur PECL-Erweiterung simdjson und muss daher explizit installiert und in der php.ini aktiviert werden. Sie setzt eine CPU voraus, die SIMD-Befehle unterstützt; auf älteren oder eingebetteten Systemen fällt die Bibliothek auf einen Fallback-Parser zurück.

Parameter

Name Typ Default Beschreibung
$json Pflicht string Der zu prüfende JSON-String.
$depth int 512 Maximale Verschachtelungstiefe des JSON-Dokuments. Dokumente, die tiefer verschachtelt sind, gelten als ungültig. Der Wert muss > 0 und <= 2147483647 sein.
$options int 0 Reserviertes Optionen-Bitmuster für zukünftige Erweiterungen. Derzeit wird nur 0 unterstützt.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der übergebene String ein syntaktisch gültiges JSON-Dokument ist, andernfalls false. Bei einem Fehler aufgrund ungültiger Parameter (z. B. depth <= 0) wird eine RuntimeException geworfen.

Beispiele

Einfache Validierung eines JSON-Strings

<?php
$valid   = '{"name": "Alice", "age": 30}';
$invalid = '{name: Alice}';

var_dump(simdjson_is_valid($valid));   // true
var_dump(simdjson_is_valid($invalid)); // false
bool(true) bool(false)

Validierung vor dem Dekodieren einer API-Anfrage

<?php
// Simulierter HTTP-Request-Body
$body = file_get_contents('php://input') ?: '{"user":"bob","action":"login"}';

if (!simdjson_is_valid($body)) {
    http_response_code(400);
    echo json_encode(['error' => 'Ungültiger JSON-Body']);
    exit;
}

$data = simdjson_decode($body, true);
echo 'Benutzer: ' . htmlspecialchars($data['user']);
Benutzer: bob

Maximale Verschachtelungstiefe begrenzen

<?php
// Stark verschachteltes JSON erzeugen
$nested = str_repeat('{"a":', 20) . '1' . str_repeat('}', 20);

// Standard-Tiefe 512 – gültig
var_dump(simdjson_is_valid($nested));     // true

// Eigene Tiefenbeschränkung auf 5
var_dump(simdjson_is_valid($nested, 5));  // false
bool(true) bool(false)

// Wichtig · Fallstricke

Installation: Die Funktion ist nicht Teil des PHP-Kerns. Installation via PECL: pecl install simdjson, anschließend extension=simdjson in der php.ini aktivieren.

Sicherheit: Da die Funktion nur validiert und nicht dekodiert, gibt es kein Risiko durch tiefe Rekursion beim eigentlichen Parsen. Dennoch sollte die depth-Begrenzung auf praxisnahe Werte gesetzt werden, um DoS-Angriffe durch extrem tief verschachtelte JSON-Nutzlasten zu erschweren.

Kompatibilität: Auf CPUs ohne SIMD-Unterstützung (z. B. sehr alte x86-32-Bit-Systeme oder bestimmte ARM-Varianten) fällt simdjson automatisch auf einen kompatiblen, aber langsameren Fallback-Pfad zurück.

Alternative ab PHP 8.3: json_validate() erfüllt denselben Zweck ohne externe Erweiterung, ist aber typischerweise langsamer als simdjson.