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

<?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';
}
} //主线程中的全局变量,子线程中是无法访问的
//php中创建子线程,它会有一个单独的堆,运行在单独的地址空间中
//并不能像有些语言中,子线程是可以访问的到主线程中的变量的。
$num = 666; $GLOBALS['test'] = 'test'; $t = new Task();
$t->start() && $t->join(); //主线程可以访问子线程的变量
var_dump($t->data);

结果如下:

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

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

结果如下:

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

<?php

class 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();

结果如下:

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

<?php

class 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();

结果如下:

代码修改如下:

<?php

class 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

pthreads v3下一些坑和需要注意的地方的更多相关文章

  1. pthreads v3下的Volatile介绍与使用

    由于pthreads v3中引入了Threaded对象自动不变性的概念,所以当我们在构造函数中给成员设置为数组时,在其他地方就无法对成员再次改写了. 例子如下: <?php //pthreads ...

  2. pthreads v3下的同步处理synchronized

    之所以会用到同步,是因为如果多个线程中对同一个资源进行操作时,会发生混乱. 比如2个线程对变量进行加1操作,第1个线程还没来的及改写数据时,第2个线程就对变量进行操作了,那变量最终的结果就是未知的,这 ...

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

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

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

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

  5. JDK动态代理给Spring事务埋下的坑!

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

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

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

  7. .NET Core 图片操作在 Linux/Docker 下的坑

    一.前言 .NET Core 目前更新到2.2了,但是直到现在在 .NET Core 本身依然不包括和图片有关的 Image.Bitmap 等类型.对于图片的操作在我们开发中很常见,比如:生成验证码. ...

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

    问题现场 在多线程环境下使用HttpClient组件对某个HTTP服务发起请求,运行一段时间之后发现客户端主机CPU利用率呈现出下降趋势,而不是一个稳定的状态. 而且,从程序日志中判断有线程处于han ...

  9. C# rtsp 转码rtmp nginx踩下的坑

    最近有一个项目, 进行步态识别的时候,同时需要显示摄像的实时画面.对于 Winform 显示画面,之前针对 rtmp 流的时候,是先写一个HTML 网页加载视频流,然后在IIS上发布,将地址直接赋值给 ...

随机推荐

  1. PDF文档的目录编辑与显示

    为了更好的保护PDF文件,可以将其转换为图片的格式,再重新排版编辑. 使用压缩率更高的JPEG 2000图片格式更佳. ---------------------------------------- ...

  2. 虚拟机centos NAT模式 配置静态ip

    主要的设置有1.配置ip地址段,2.配置NAT(网关.ip地址端.子网掩码),3.修改网卡配置文件(/etc/sysconfig/network-scripts/ifcfg-eth0 ),4.重启网卡 ...

  3. Mastering Creativity:A brief guide on how to overcome creative blocks

    MASTERING CREATIVITY, 1st EditionThis guide is free and you are welcome to share it withothers.From ...

  4. ReactiveX 学习笔记(6)条件操作符

    Conditional and Boolean Operators 本文的主题为处理 Observable 的条件和布尔操作符. 这里的 Observable 实质上是可观察的数据流. RxJava操 ...

  5. Angular2学习笔记

    Angular2 这里 Angular2 是指采用 TypeScript 语言的 Angular 2.0及以上版本.与采用 JavaScript 语言的 AngularJS 相比,Angular2 不 ...

  6. Kotlin语言学习笔记(2)

    类(classes) // 类声明 class Invoice { } // 空的类 class Empty // 主体构造器(primary constructor) class Person co ...

  7. Structs复习 简单数据校验

    jar包 web.XML <?xml version="1.0" encoding="UTF-8"?> <web-app version=&q ...

  8. RMI 、RPC和SOAP

  9. 历届试题 小数第n位-(同余公式+快速幂)

    问题描述 我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数. 如果我们把有限小数的末尾加上无限多个0,它们就有了统一的形式. 本题的任务是:在上面的约定下,求整数除法小数点后的第n位开始 ...

  10. 什么是JIT,写的很好

    什么是JIT 一些其他解释的网站:http://www.sohu.com/a/169704040_464084 1.动态编译(dynamic compilation)指的是“在运行时进行编译”:与之相 ...