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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。