Start · Sprachen · PHP · Referenz · igbinary_serialize

igbinary_serialize

Funktion

Erzeugt eine kompakte, binäre Darstellung eines PHP-Werts, ähnlich wie <code>serialize()</code>, jedoch deutlich speicher- und zeiteffizienter.

Kategorie: misc

Signatur

igbinary_serialize(mixed $value): string|false

Beschreibung

igbinary_serialize() ist eine Funktion der igbinary-Erweiterung und serialisiert einen beliebigen PHP-Wert in ein kompaktes Binärformat. Im Gegensatz zu PHPs eingebautem serialize(), das ein lesbares ASCII-Format erzeugt, produziert igbinary eine deutlich kleinere und schneller verarbeitbare Binärdarstellung – besonders vorteilhaft bei großen Datenstrukturen oder häufigen Cache-Zugriffen.

Die Funktion eignet sich hervorragend als Drop-in-Ersatz für serialize(), wenn die serialisierten Daten nicht von Menschen gelesen werden müssen. Typische Einsatzgebiete sind Caching-Backends wie Redis oder Memcached, bei denen igbinary als Serializer konfiguriert werden kann, um den Speicherbedarf und die Übertragungszeiten zu reduzieren.

Der erzeugte Binär-String kann mit igbinary_unserialize() wieder in den ursprünglichen PHP-Wert umgewandelt werden. Wichtig: Das Format ist nicht kompatibel mit dem nativen serialize()-Format und kann nur von igbinary deserialisiert werden.

Objekte, die das Serializable-Interface oder die magischen Methoden __sleep() und __wakeup() bzw. __serialize() und __unserialize() implementieren, werden korrekt unterstützt.

Parameter

Name Typ Default Beschreibung
$value Pflicht mixed Der zu serialisierende Wert. Alle PHP-Datentypen werden unterstützt – Skalare, Arrays, Objekte und null. Ressourcen können nicht serialisiert werden; ihr Wert geht dabei verloren.

Rückgabewert

Typ
string|false
Beschreibung
Gibt einen binären String mit der serialisierten Darstellung des Werts zurück. Im Fehlerfall wird false zurückgegeben.

Beispiele

Einfache Serialisierung und Deserialisierung

<?php
$data = [
    'name' => 'Alice',
    'age'  => 30,
    'tags' => ['php', 'developer'],
];

$binary = igbinary_serialize($data);
echo 'Binäre Länge: ' . strlen($binary) . ' Bytes' . PHP_EOL;

// Vergleich mit nativem serialize
$native = serialize($data);
echo 'Native Länge:  ' . strlen($native) . ' Bytes' . PHP_EOL;

// Deserialisierung
$restored = igbinary_unserialize($binary);
var_dump($restored['name']); // string(5) "Alice"
Binäre Länge: 57 Bytes Native Länge: 84 Bytes string(5) "Alice"

Serialisierung eines Objekts mit __sleep()

<?php
class User
{
    public string $name;
    public string $password;
    private string $sessionToken;

    public function __construct(string $name, string $password)
    {
        $this->name         = $name;
        $this->password     = $password;
        $this->sessionToken = bin2hex(random_bytes(16));
    }

    // Nur name und password werden serialisiert, nicht das Session-Token
    public function __sleep(): array
    {
        return ['name', 'password'];
    }
}

$user   = new User('Bob', 'geheim');
$binary = igbinary_serialize($user);

$restored = igbinary_unserialize($binary);
echo $restored->name;     // Bob
echo PHP_EOL;
echo $restored->password; // geheim
Bob geheim

Verwendung als Redis-Serializer (Konfigurationsbeispiel)

<?php
// In der php.ini oder direkt per ini_set:
// session.serialize_handler = igbinary

// Redis-Erweiterung mit igbinary als Serializer konfigurieren:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_IGBINARY);

$payload = ['user_id' => 42, 'roles' => ['admin', 'editor']];
$redis->set('user:42', $payload);

$retrieved = $redis->get('user:42');
print_r($retrieved);
// Gibt das Array direkt zurück – Redis deserialisiert automatisch via igbinary
Array ( [user_id] => 42 [roles] => Array ( [0] => admin [1] => editor ) )

// Wichtig · Fallstricke

Sicherheitshinweis: Wie bei unserialize() gilt auch für igbinary_unserialize(): Deserialisieren Sie niemals Daten aus nicht vertrauenswürdigen Quellen (z. B. Benutzereingaben, HTTP-Parameter). Dies kann zu Object-Injection-Angriffen führen, bei denen beliebiger Code ausgeführt wird.

Kompatibilität: Das igbinary-Format ist binär und nicht mit PHPs nativem serialize() kompatibel. Achten Sie bei Datenbankmigrationen oder beim Wechsel des Serializers darauf, bestehende Daten zuerst mit dem alten Format zu deserialisieren und dann neu zu serialisieren.

Voraussetzung: Die igbinary-Erweiterung muss installiert und in der php.ini geladen sein (extension=igbinary). Ohne die Erweiterung ist die Funktion nicht verfügbar und führt zu einem fatalen Fehler.