sql >> Database >  >> RDS >> Mysql

PHP Pthreads - mysqli . gebruiken

Het probleem is dat het mysqli-object niet geschikt is voor gebruik in meerdere threads. U wilt een instantie van MySQLi maken voor elke thread die u start, zodat elke thread een unieke verbinding heeft.

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

Opbrengsten

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

Merk op dat het MySQLi-object nooit wordt opgeslagen in het Threads-objectbereik, omdat je alleen in het objectbereik moet opslaan wat je van plan bent te delen, en aangezien je geen MySQLi-verbinding kunt delen, is het het beste om het in het methodebereik te manipuleren .

Er zijn veel voorbeelden op github, inclusief een SQLWorker-voorbeeld, je zou ze allemaal moeten lezen.

Verder lezen:https://gist.github.com/krakjoe/6437782




  1. Query voor het tellen van verschillende waarden in een voortschrijdend datumbereik

  2. GETDATE() Voorbeelden in SQL Server (T-SQL)

  3. Begrijp de rol van data-architecten in datagovernance

  4. Een PostgreSQL-reeks naar een veld maken (wat niet de ID van de record is)