PHP Pthreads – 使用mysqli
发布时间:2020-12-13 16:52:45 所属栏目:PHP教程 来源:网络整理
导读:我正在尝试在我的Web应用程序中首次使用pthreads.我有pthreads为简单的测试用例工作,但是在pthreads中使用 mysql查询时遇到了麻烦.这是我的php文件: class SqlThread extends Thread{ private $dbc; public $log; public $return; public function __constr
我正在尝试在我的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","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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |