一、子线程无法访问父线程的全局变量,但父线程可以访问子线程的变量

<?phpclass Task extends Thread
{public $data;public function run(){global $num;var_dump($num);$this->data = 'abc';//这是打印nullvar_dump($GLOBALS);$GLOBALS['test'] = 'def';}
}//主线程中的全局变量,子线程中是无法访问的
//php中创建子线程,它会有一个单独的堆,运行在单独的地址空间中
//并不能像有些语言中,子线程是可以访问的到主线程中的变量的。
$num = 666;$GLOBALS['test'] = 'test';$t = new Task();
$t->start() && $t->join();//主线程可以访问子线程的变量
var_dump($t->data);

结果如下:

二、子线程无法修改父线程的变量

<?phpclass 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变量数据并没改变
//这说明我们通过构造函数传入Task对象中的$data只是一个拷贝
//子线程中并不能够操作主线程中的变量
var_dump($data);

结果如下:

三、pthreads v3版本可以设置成员为匿名函数

<?phpclass Task extends Thread
{private $call;public function __construct(){//pthreads v3版本好像可以设置成员为匿名函数//在v2版本中好像是不可以的$this->call = function ($param1, $param2) {echo "task call param1 : {$param1} param2 : {$param2}\n";};}public function run(){//直接调用成员匿名函数($this->call)("hello", "world");}
}$t = new Task();
$t->start() && $t->join();

结果如下:

四、对于数据库连接资源,我们需要声明为静态成员

<?phpclass Task extends Thread
{private $db;public function __construct(){//注意这里会报错,不能对PDO实例进行序列化或反序列化$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();

结果如下:

代码修改如下:

<?phpclass Task extends Thread
{//我们需要把数据库连接资源,声明为静态成员,然后调用静态方法进行创建private static $db;//我们直接在__construct()构造函数里对$db进行实例化,好像会是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();

结果如下:

最后说明,不排除pthreads以后的版本升级上面的有些问题不会出现。

我的php版本是7.2.4,pthreads的版本是3.1.7dev

转载于:https://www.cnblogs.com/jkko123/p/8919013.html

pthreads v3下一些坑和需要注意的地方相关推荐

  1. pthreads v3下的worker和pool的使用

    有些人会想,明明用thread已经可以很好的工作了,为什么还要搞个worker和pool? 之所以要用到worker和pool还是因为效率,因为系统创建一个新线程代价是比较昂贵,每个创建的线程会复制当 ...

  2. pthreads v3在centos7下的安装与配置

    我的centos版本是7.4.1708,php的版本是7.2.4(注意要是线程安全版),如下图所示: 首先我们在如下网址下载好pthreads的源码: http://pecl.php.net/pack ...

  3. (转)面试必备技能:JDK动态代理给Spring事务埋下的坑!

    一.场景分析 最近做项目遇到了一个很奇怪的问题,大致的业务场景是这样的:我们首先设定两个事务,事务parent和事务child,在Controller里边同时调用这两个方法,示例代码如下: 1.场景A ...

  4. 分析动态代理给Spring事务埋下的坑

    前言 Spring的声明式事务让我们不在编写获得连接.关闭连接.开启事务.提交事务.回滚事务等代码,通过一个简单的@Transactional注解,就让我们轻松进行事务处理.我们知道Spring事务基 ...

  5. spring 动态代理_分析动态代理给 Spring 事务埋下的坑

    前言 Spring的声明式事务让我们不在编写获得连接.关闭连接.开启事务.提交事务.回滚事务等代码,通过一个简单的@Transactional注解,就让我们轻松进行事务处理.我们知道Spring事务基 ...

  6. JS——nth-child和nth-of-type的区别以及nth-of-type下的坑

    CSS3:nth-child()选择器 :nth-child(n)选择器匹配属于其父元素的第n个子元素,无论元素的类型 <!DOCTYPE html> <html><he ...

  7. HttpClient在多线程环境下踩坑总结

    HttpClient在多线程环境下踩坑总结 问题现场 在多线程环境下使用HttpClient组件对某个HTTP服务发起请求,运行一段时间之后发现客户端主机CPU利用率呈现出下降趋势,而不是一个稳定的状 ...

  8. PageHelper这种情况下有坑

    闲话少说,进入本期内容的正题. 省流版本:PagerHelper在与PostgreSQL搭配使用时,会有坑! 你如果想知道具体是什么样的一个坑,往下看,我来给大伙儿展开说说. 背景 小黑最近在做一个项 ...

  9. PageHelper这种情况下有坑!

    背景 小黑最近在做一个项目,常规的SpringBoot+Mybatis架构,数据库使用的是PostgreSQL,并且有一些场景需要使用到分页查询,很自然的就使用了PageHelper这个分页工具,如果 ...

最新文章

  1. 解决kalilinux: E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用) E: 无法对目录 /var/lib/apt/lists/
  2. jquery中offset和position的区别
  3. css中的一些常用选择器
  4. MySQL(二)——DQL数据查询语言
  5. 2012年第一篇博文——致谢:2011年中国IT十大杰出博客获奖感言
  6. 在JBoss Fuse / Fabric8 / Karaf中使用Byteman
  7. matlab铁路平板车装货问题,两辆铁路平板车的装货问题最终论文
  8. flutter java混编_有赞 Flutter 混编方案
  9. ik分词器 分词原理_ElasticSearch 集成Ik分词器
  10. bzoj1336[Balkan2002]Alien最小圆覆盖
  11. 虚拟路由器冗余协议VRRP原理详解!
  12. uniapp跨域两次请求解决方案
  13. python 安装matlab,python – Anaconda在Linux上安装Matlab Engine
  14. Debugging a Plug-in
  15. Netty NioEventLoop 启动过程源码分析
  16. 【信息系统项目管理师】2018年下半年信息系统项目管理师上午综合知识真题
  17. MyBatisPlus 开启事务并交由 Springboot 管理
  18. 自定义原生jsonp跨域请求
  19. PHP获取客户端的IP
  20. SCB_SCR寄存器

热门文章

  1. IE与firefox区别
  2. angularjs跨页面传参遇到的一些问题
  3. linux任务计划学习
  4. bootstrap今天的学习心得
  5. dup和dup2详解
  6. 【Shell】sed实例之第三部分
  7. IIS错误信息--另一个程序正在使用此文件,进程无法访问!
  8. 数据结构计算机专业教学计划编制,[实验报告]教学计划编制问题
  9. Android TextView 显示HTML加图片
  10. oracle学习日志---返回RemoteOperationException: ERROR: Wrong password for user-错误的用户名密码-的错误的解决办法...