PHP pthreads v3使用中的一些坑和注意點(diǎn)分析
本文實(shí)例講述了PHP pthreads v3使用中的一些坑和注意點(diǎn)。分享給大家供大家參考,具體如下:
一、子線程無(wú)法訪問(wèn)父線程的全局變量,但父線程可以訪問(wèn)子線程的變量
<?php class Task extends Thread { public $data; public function run() { global $num; var_dump($num); $this->data = 'abc'; //這是打印null var_dump($GLOBALS); $GLOBALS['test'] = 'def'; } } //主線程中的全局變量,子線程中是無(wú)法訪問(wèn)的 //php中創(chuàng)建子線程,它會(huì)有一個(gè)單獨(dú)的堆,運(yùn)行在單獨(dú)的地址空間中 //并不能像有些語(yǔ)言中,子線程是可以訪問(wèn)的到主線程中的變量的。 $num = 666; $GLOBALS['test'] = 'test'; $t = new Task(); $t->start() && $t->join(); //主線程可以訪問(wèn)子線程的變量 var_dump($t->data);
結(jié)果如下:
二、子線程無(wú)法修改父線程的變量
<?php class Task extends Thread { private $data; public function __construct(&$data) { $this->data = $data; } public function run() { echo "task data : ", $this->data, "\n"; $this->data = 'def'; echo "task data : ", $this->data, "\n"; } } $data = 'abc'; //我們這里傳入的是引用 $t = new Task($data); $t->start() && $t->join(); //但是$data變量數(shù)據(jù)并沒(méi)改變 //這說(shuō)明我們通過(guò)構(gòu)造函數(shù)傳入Task對(duì)象中的$data只是一個(gè)拷貝 //子線程中并不能夠操作主線程中的變量 var_dump($data);
結(jié)果如下:
三、pthreads v3版本可以設(shè)置成員為匿名函數(shù)
<?php class Task extends Thread { private $call; public function __construct() { //pthreads v3版本好像可以設(shè)置成員為匿名函數(shù) //在v2版本中好像是不可以的 $this->call = function ($param1, $param2) { echo "task call param1 : {$param1} param2 : {$param2}\n"; }; } public function run() { //直接調(diào)用成員匿名函數(shù) ($this->call)("hello", "world"); } } $t = new Task(); $t->start() && $t->join();
結(jié)果如下:
四、對(duì)于數(shù)據(jù)庫(kù)連接資源,我們需要聲明為靜態(tài)成員
<?php class Task extends Thread { private $db; public function __construct() { //注意這里會(huì)報(bào)錯(cuò),不能對(duì)PDO實(shí)例進(jìn)行序列化或反序列化 $this->db = new PDO('mysql:dbname=test;host=192.168.33.226', 'root', ''); } public function run() { $result = $this->db->query("select id,name from tb_user"); while ($row = $result->fetch(PDO::FETCH_ASSOC)) { echo "{$row['id']}\t{$row['name']}\n"; } } } $t = new Task(); $t->start() && $t->join();
結(jié)果如下:
代碼修改如下:
<?php class Task extends Thread { //我們需要把數(shù)據(jù)庫(kù)連接資源,聲明為靜態(tài)成員,然后調(diào)用靜態(tài)方法進(jìn)行創(chuàng)建 private static $db; //我們直接在__construct()構(gòu)造函數(shù)里對(duì)$db進(jìn)行實(shí)例化,好像會(huì)是null,有興趣的可以試試 public static function getConn() { if (!is_resource(self::$db)) { self::$db = new PDO('mysql:dbname=test;host=192.168.33.226', 'root', ''); } return self::$db; } public function run() { $result = self::getConn()->query("select id,name from tb_user"); while ($row = $result->fetch(PDO::FETCH_ASSOC)) { echo "{$row['id']}\t{$row['name']}\n"; } } } $t = new Task(); $t->start() && $t->join();
結(jié)果如下:
最后說(shuō)明,不排除pthreads以后的版本升級(jí)上面的有些問(wèn)題不會(huì)出現(xiàn)。
我的php版本是7.2.4,pthreads的版本是3.1.7dev
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP進(jìn)程與線程操作技巧總結(jié)》、《PHP網(wǎng)絡(luò)編程技巧總結(jié)》、《PHP基本語(yǔ)法入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
基于wordpress主題制作的具體實(shí)現(xiàn)步驟
本篇文章是對(duì)wordpress主題制作的具體實(shí)現(xiàn)步驟進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下2013-05-05php獲取當(dāng)前時(shí)間的毫秒數(shù)的方法
php本身沒(méi)有提供返回毫秒數(shù)的函數(shù),但提供了一個(gè)microtime()函數(shù),借助此函數(shù),可以很容易定義一個(gè)返回毫秒數(shù)的函數(shù)2014-01-01PHP使用內(nèi)置函數(shù)file_put_contents寫入文件及追加內(nèi)容的方法
這篇文章主要介紹了PHP使用內(nèi)置函數(shù)file_put_contents寫入文件及追加內(nèi)容的方法,結(jié)合實(shí)例形式分析了file_put_contents函數(shù)通過(guò)參數(shù)設(shè)置實(shí)現(xiàn)寫入文件及追加內(nèi)容的相關(guān)技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-12-12php遞歸實(shí)現(xiàn)無(wú)限分類生成下拉列表的函數(shù)
php自定義函數(shù)之遞歸實(shí)現(xiàn)無(wú)限分類生成下拉列表,這樣可以提高效率,不用每次都從數(shù)據(jù)庫(kù)讀取數(shù)據(jù)。2010-08-08php支持?jǐn)帱c(diǎn)續(xù)傳、分塊下載的類
這篇文章主要介紹了php支持?jǐn)帱c(diǎn)續(xù)傳、分塊下載的類的相關(guān)資料,需要的朋友可以參考下2016-05-05