Проблемът е, че обектът mysqli не е подходящ за използване в множество нишки, искате да създадете екземпляр на MySQLi за всяка нишка, която стартирате, така че всяка нишка има уникална връзка.
<?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();
?>
Добив
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"
}
Обърнете внимание, че обектът MySQLi никога не се съхранява в обхвата на обекта Threads, тъй като трябва да съхранявате в обхвата на обекта само това, което възнамерявате да споделите, и тъй като не можете да споделяте MySQLi връзка, най-добре е да го манипулирате в обхвата на метода .
В github има много примери, включително пример за SQLWorker, трябва да ги прочетете всичките.
Допълнително четене:https://gist.github.com/krakjoe/6437782