PHP pthreads v3使用中的一些坑和注意点分析
本文实例讲述了PHPpthreadsv3使用中的一些坑和注意点。分享给大家供大家参考,具体如下:
一、子线程无法访问父线程的全局变量,但父线程可以访问子线程的变量
data='abc'; //这是打印null var_dump($GLOBALS); $GLOBALS['test']='def'; } } //主线程中的全局变量,子线程中是无法访问的 //php中创建子线程,它会有一个单独的堆,运行在单独的地址空间中 //并不能像有些语言中,子线程是可以访问的到主线程中的变量的。 $num=666; $GLOBALS['test']='test'; $t=newTask(); $t->start()&&$t->join(); //主线程可以访问子线程的变量 var_dump($t->data);
结果如下:
二、子线程无法修改父线程的变量
data=$data; } publicfunctionrun() { echo"taskdata:",$this->data,"\n"; $this->data='def'; echo"taskdata:",$this->data,"\n"; } } $data='abc'; //我们这里传入的是引用 $t=newTask($data); $t->start()&&$t->join(); //但是$data变量数据并没改变 //这说明我们通过构造函数传入Task对象中的$data只是一个拷贝 //子线程中并不能够操作主线程中的变量 var_dump($data);
结果如下:
三、pthreadsv3版本可以设置成员为匿名函数
call=function($param1,$param2){ echo"taskcallparam1:{$param1}param2:{$param2}\n"; }; } publicfunctionrun() { //直接调用成员匿名函数 ($this->call)("hello","world"); } } $t=newTask(); $t->start()&&$t->join();
结果如下:
四、对于数据库连接资源,我们需要声明为静态成员
db=newPDO('mysql:dbname=test;host=192.168.33.226','root',''); } publicfunctionrun() { $result=$this->db->query("selectid,namefromtb_user"); while($row=$result->fetch(PDO::FETCH_ASSOC)){ echo"{$row['id']}\t{$row['name']}\n"; } } } $t=newTask(); $t->start()&&$t->join();
结果如下:
代码修改如下:
query("selectid,namefromtb_user"); while($row=$result->fetch(PDO::FETCH_ASSOC)){ echo"{$row['id']}\t{$row['name']}\n"; } } } $t=newTask(); $t->start()&&$t->join();
结果如下:
最后说明,不排除pthreads以后的版本升级上面的有些问题不会出现。
我的php版本是7.2.4,pthreads的版本是3.1.7dev
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP进程与线程操作技巧总结》、《PHP网络编程技巧总结》、《PHP基本语法入门教程》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。