Start · Sprachen · PHP · Referenz · simdjson_decode

simdjson_decode

Funktion

Dekodiert einen JSON-String mit der hochperformanten simdjson-Bibliothek und gibt das Ergebnis als PHP-Wert zurück.

seit PHP 2.0.0 Kategorie: json

Signatur

simdjson_decode(string $json, bool $associative = false, int $depth = 512): mixed

Beschreibung

simdjson_decode() ist das PECL-Äquivalent zu json_decode(), nutzt jedoch intern die simdjson-Bibliothek, die SIMD-Prozessorinstruktionen (SSE4.2, AVX2 etc.) einsetzt, um JSON-Daten deutlich schneller zu verarbeiten als klassische Implementierungen. Gerade bei großen JSON-Payloads (ab einigen Kilobyte) zeigt sich ein deutlicher Geschwindigkeitsvorteil gegenüber der eingebauten json_decode()-Funktion.

Wird $associative auf true gesetzt, werden JSON-Objekte als assoziative PHP-Arrays zurückgegeben; andernfalls als Instanzen von stdClass. Das Verhalten entspricht damit dem von json_decode(), sodass ein nahtloser Austausch möglich ist.

Der Parameter $depth begrenzt die maximale Verschachtelungstiefe des zu parsenden JSON. Wird dieser Wert überschritten, schlägt das Parsen fehl. Dies dient als Schutz vor exzessiv tief verschachtelten Strukturen.

Die Funktion ist besonders empfehlenswert in Hochlast-Szenarien, etwa bei API-Servern, die viele oder große JSON-Dokumente verarbeiten. Sie setzt die PECL-Extension simdjson voraus und ist nicht im PHP-Kern enthalten.

Parameter

Name Typ Default Beschreibung
$json Pflicht string Der zu dekodierenden JSON-String. Muss UTF-8-kodiert sein.
$associative bool false Gibt an, ob JSON-Objekte als assoziative Arrays (true) oder als stdClass-Objekte (false) zurückgegeben werden sollen.
$depth int 512 Maximale erlaubte Verschachtelungstiefe des JSON-Dokuments. Bei Überschreitung wird ein Fehler ausgelöst.

Rückgabewert

Typ
mixed
Beschreibung
Gibt den dekodierten PHP-Wert zurück. Dies kann ein stdClass-Objekt, ein Array, ein Skalar (string, int, float, bool) oder null sein. Bei einem Fehler wird eine SimdJsonException geworfen (ab simdjson 2.x) oder false zurückgegeben.

Beispiele

Einfaches JSON-Objekt dekodieren

<?php
$json = '{"name": "Alice", "age": 30, "admin": true}';

// Als stdClass-Objekt
$obj = simdjson_decode($json);
echo $obj->name;  // Alice
echo $obj->age;   // 30

// Als assoziatives Array
$arr = simdjson_decode($json, true);
echo $arr['name']; // Alice
Alice 30 Alice

Große JSON-Payload performant verarbeiten

<?php
// Simuliertes großes JSON-Array (z. B. aus einer API-Antwort)
$json = file_get_contents('/var/data/produkte.json');

$start = microtime(true);
$produkte = simdjson_decode($json, true);
$dauer = microtime(true) - $start;

echo sprintf(
    '%d Produkte in %.4f Sekunden geladen.\n',
    count($produkte),
    $dauer
);
1500 Produkte in 0.0021 Sekunden geladen.

Fehlerbehandlung bei ungültigem JSON

<?php
$ungueltig = '{name: Alice}';

try {
    $ergebnis = simdjson_decode($ungueltig, true);
} catch (\SimdJsonException $e) {
    echo 'JSON-Fehler: ' . $e->getMessage() . "\n";
}
JSON-Fehler: The JSON document has an improper structure: missing or superfluous commas, braces, missing keys, etc.

// Wichtig · Fallstricke

Voraussetzungen: Die Funktion ist nicht im PHP-Kern enthalten, sondern erfordert die Installation der PECL-Extension simdjson (pecl install simdjson). Außerdem benötigt der Prozessor SIMD-Unterstützung (SSE4.2 oder AVX2); auf sehr alten oder eingeschränkten Systemen (z. B. manchen virtuellen Maschinen) kann die Extension den Fallback-Modus nutzen oder gar nicht kompilierbar sein.

Fehlerbehandlung: Anders als json_decode(), das bei Fehlern stillschweigend null zurückgibt und auf json_last_error() setzt, wirft simdjson_decode() bei ungültigem JSON eine SimdJsonException. Der Code muss entsprechend mit try/catch abgesichert werden.

Kompatibilität: Die API orientiert sich bewusst an json_decode(); ein Austausch ist in den meisten Fällen möglich. Der Parameter $flags (z. B. JSON_BIGINT_AS_STRING) existiert in dieser Funktion jedoch nicht, was ein wichtiger Unterschied ist.

Sicherheit: Wie bei json_decode() sollte die $depth bei nicht vertrauenswürdigen Eingaben bewusst niedrig gesetzt werden, um Denial-of-Service durch übermäßige Rekursion zu verhindern.