Vấn đề là đối tượng mysqli không phù hợp để sử dụng trong nhiều luồng, bạn muốn tạo một phiên bản của MySQLi cho mỗi luồng bạn bắt đầu, vì vậy mỗi luồng có một kết nối duy nhất.
<?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();
?>
Lợi nhuận
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"
}
Lưu ý rằng, đối tượng MySQLi không bao giờ được lưu trữ trong phạm vi đối tượng Threads, vì bạn chỉ nên lưu trữ trong phạm vi đối tượng mà bạn định chia sẻ và vì bạn không thể chia sẻ kết nối MySQLi, nên tốt nhất là thao tác nó trong phạm vi phương thức .
Có rất nhiều ví dụ trên github, bao gồm cả ví dụ về SQLWorker, bạn nên đọc hết chúng.
Đọc thêm: https://gist.github.com/krakjoe/6437782