簡體   English   中英

PHP Pthreads - 使用mysqli

[英]PHP Pthreads - using mysqli

我正在嘗試在我的Web應用程序中首次使用pthreads。 我有pthreads為簡單的測試用例工作,但是在pthreads中使用mysql查詢時遇到了麻煩。 這是我的php文件:

class SqlThread extends Thread
{
    private $dbc;
    public $log;
    public $return;

    public function __construct(){
        $this->dbc = mysqli_connect("localhost", "root", "rootpassword", "my_database");

        $this->log = "<br>(".__LINE__.") construct finished.";
    }

    //gets called when thread is started
    public function run(){
        $val = $this->testSqlCall();

        $this->log .= "<br>(".__LINE__.") testSqlCall() has finished";

        $this->return = $val;
    }

    /**
     * testing sql queries
     */
    function testSqlCall(){

        $sql = "SELECT *
                FROM client_detail";

        $this->log .= "<br>(".__LINE__.") testSqlCall() - sql: ".$sql;

        $r= @mysqli_query($this->dbc,$sql);
        $num = mysqli_affected_rows($this->dbc);

        $this->log .= "<br>(".__LINE__.") testSqlCall() - total number of returned rows: ".$num;

        return $num;

    }
}

/**
 * threaded test
 */
$thread = new SqlThread();
$thread->start();
$thread->join();

echo "<br><br><br>thread return value:";
var_dump($thread->return);
echo $thread->log;

/**
 * same test, but not threaded
 */

$dbc = mysqli_connect("localhost", "root", "rootpassword", "my_database");
$sql = "SELECT *
        FROM client_detail";
$r = @mysqli_query($dbc,$sql);
$num = mysqli_affected_rows($dbc);
echo "<br><br> --- non-threaded return value: $num";

這是它的回報:

thread return value:

null


(12) construct finished.
(32) testSqlCall() - sql: SELECT * FROM client_detail
(37) testSqlCall() - total number of returned rows:
(19) testSqlCall() has finished

--- non-threaded return value: 39276

正如您所看到的,SqlThread中的mysqli查詢不會返回任何內容,而SqlThread類之外的完全相同的查詢將返回我期望的內容。

有任何想法嗎? 有沒有人在php線程中獲得sql查詢才能工作?

問題是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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM