sql >> Base de Datos >  >> RDS >> Mysql

PHP Pthreads - usando mysqli

El problema es que el objeto mysqli no es adecuado para su uso en múltiples subprocesos, desea crear una instancia de MySQLi para cada subproceso que inicie, de modo que cada subproceso tenga una conexión única.

<?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();
?>

Rendimientos

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"
}

Tenga en cuenta que el objeto MySQLi nunca se almacena en el alcance del objeto Threads, porque solo debe almacenar en el alcance del objeto lo que pretende compartir, y dado que no puede compartir una conexión MySQLi, es mejor manipularlo en el alcance del método .

Hay muchos ejemplos en github, incluido un ejemplo de SQLWorker, debe leerlos todos.

Lectura adicional:https://gist.github.com/krakjoe/6437782