Mysql
 sql >> Base de données >  >> RDS >> Mysql

PHP Pthreads - en utilisant mysqli

Le problème est que l'objet mysqli ne convient pas à une utilisation dans plusieurs threads, vous souhaitez créer une instance de MySQLi pour chaque thread que vous démarrez, afin que chaque thread ait une connexion unique.

<?php
define("SQLHOST", "localhost");
define("SQLUSER", "root");
define("SQLPASS", "");
define("SQLDB",   "test");
define("SQLPORT", 3306);
define("SQLSOCK", "/var/lib/mysql/mysql.sock");

class Mine extends Thread {
    public function run() {
        try {
            $my = new mysqli(SQLHOST, SQLUSER, SQLPASS, SQLDB, SQLPORT, SQLSOCK);
            if ($my) {
                $result = $my->query("SHOW DATABASES;");

                if (is_object($result)) {
                    while (($row = $result->fetch_assoc())) {
                        var_dump($row);
                    }
                }
            }
        } catch(Exception $ex) {
            var_dump($ex);
        }
    }
}

$mine = new Mine();
$mine->start();
?>

Rendements

array(1) {
  ["Database"]=>
  string(18) "information_schema"
}
array(1) {
  ["Database"]=>
  string(5) "mysql"
}
array(1) {
  ["Database"]=>
  string(18) "performance_schema"
}
array(1) {
  ["Database"]=>
  string(4) "test"
}

Notez que l'objet MySQLi n'est jamais stocké dans la portée de l'objet Threads, car vous ne devez stocker dans la portée de l'objet que ce que vous avez l'intention de partager, et puisque vous ne pouvez pas partager une connexion MySQLi, il est préférable de la manipuler dans la portée de la méthode .

Il existe de nombreux exemples sur github, y compris un exemple SQLWorker, vous devriez tous les lire.

Lectures complémentaires :https://gist.github.com/krakjoe/6437782