我正在尝试在我的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 (编辑:北几岛)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|