[Php] Warum kann ein PDO-Objekt nicht serialisiert werden?


Answers

Was unter http://php.net/manual/en/language.oop5.magic.php getan wird, erzeugt einen Wrapper, der serialisiert werden kann, da die PDO-Verbindung selbst nicht sein kann.

<?php
class Connection
{
    protected $link;
    private $dsn, $username, $password;

    public function __construct($dsn, $username, $password)
    {
        $this->dsn = $dsn;
        $this->username = $username;
        $this->password = $password;
        $this->connect();
    }

    private function connect()
    {
        $this->link = new PDO($this->dsn, $this->username, $this->password);
    }

    public function __sleep()
    {
        return array('dsn', 'username', 'password');
    }

    public function __wakeup()
    {
        $this->connect();
    }
}?>

Das PDO-Objekt behält den dsn, user, pwd nach dem Verbinden anscheinend nicht und kann daher nicht direkt serialisiert werden. Wenn Sie jedoch einen Wrapper wie im obigen Beispiel erstellt haben, in dem Sie diese Informationen gespeichert haben, können Sie den Wrapper serialisieren. Wenn Sie dann die Deserialisierung durchführen, wird ein neues PDO-Objekt erstellt und die Verbindung wiederhergestellt, indem die Anmeldeinformationen vom Wrapper an PDO übergeben werden.

Question

Ich mache eine multi-threaded CLI-PHP-Anwendung und muss PDO object serialisieren, um es zwischen Arbeit innerhalb des Threads zu übergeben, und es aus einem schlafenden Thread mit den magischen Methoden __sleep() und __wakeup() . Es unterstützt jedoch weder die mysqli noch die mysqli Erweiterung. Das alte mysql_*() API hat dies getan, aber es wurde veraltet und entfernt.

<?php
    // Application
    $link = new PDO('mysql:host=localhost;port=3306;dbname=testdatabase', 'root', '');

    $obj = serialize($link);

gut erzeugen Fehler

PHP Schwerwiegender Fehler: Nicht erfasste Ausnahme "PDOException" mit der Meldung "PDO-Instanzen können nicht serialisiert oder unserialisiert werden" in W: \ workspace \ Sandbox \ application.php: 5 Stack trace:

# 0 [interne Funktion]: PDO -> __ sleep ()

# 1 W: \ workspace \ Sandbox \ application.php (5): serialisieren (Objekt (PDO))

# 2 {main} wird in W: \ workspace \ Sandbox \ application.php in Zeile 5 geworfen