PHP pthreads v3使用中的一些坑和注意点分析


Posted in PHP onFebruary 21, 2020

本文实例讲述了PHP pthreads v3使用中的一些坑和注意点。分享给大家供大家参考,具体如下:

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

<?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 pthreads v3使用中的一些坑和注意点分析

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

<?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);

结果如下:

PHP pthreads v3使用中的一些坑和注意点分析

三、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 pthreads v3使用中的一些坑和注意点分析

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

<?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 pthreads v3使用中的一些坑和注意点分析

代码修改如下:

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

结果如下:

PHP pthreads v3使用中的一些坑和注意点分析

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

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

PHP pthreads v3使用中的一些坑和注意点分析

PHP pthreads v3使用中的一些坑和注意点分析

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
把PHP安装为Apache DSO
Oct 09 PHP
一个简单的php实现的MySQL数据浏览器
Mar 11 PHP
php调整gif动画图片尺寸示例代码分享
Dec 05 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
Jul 01 PHP
PHP伪造来源HTTP_REFERER的方法实例详解
Jul 06 PHP
yii实现model添加默认值的方法(2种方法)
Jan 06 PHP
thinkPHP分组后模板无法加载问题解决方法
Jul 12 PHP
CentOS 7.2 下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1的方法详解(mini版本)
Sep 01 PHP
PHP实现基于3DES算法加密解密字符串示例
Aug 24 PHP
Ajax+PHP实现的删除数据功能示例
Feb 12 PHP
PHP精确到毫秒秒杀倒计时实例详解
Mar 14 PHP
PHP+Oracle本地开发环境搭建方法详解
Apr 01 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
Feb 21 #PHP
php操作redis数据库常见方法实例总结
Feb 20 #PHP
php使用redis的几种常见操作方式和用法示例
Feb 20 #PHP
PHP使用openssl扩展实现加解密方法示例
Feb 20 #PHP
php使用redis的有序集合zset实现延迟队列应用示例
Feb 20 #PHP
解决windows上php xdebug 无法调试的问题
Feb 19 #PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 18 #PHP
You might like
DC动漫人物排行
2020/03/03 欧美动漫
PHP实现返回JSON和XML的类分享
2015/01/28 PHP
微信利用PHP创建自定义菜单的方法
2016/08/01 PHP
Javascript this指针
2009/07/30 Javascript
Js获取事件对象代码
2010/08/05 Javascript
23个Javascript弹出窗口特效整理
2011/02/25 Javascript
基于jquery的代码显示区域自动拉长效果
2011/12/07 Javascript
JQuery勾选指定name的复选框集合并显示的方法
2015/05/18 Javascript
JS+CSS实现表格高亮的方法
2015/08/05 Javascript
Bootstrap框架下下拉框select搜索功能
2020/03/26 Javascript
深入理解JavaScript函数参数(推荐)
2016/07/26 Javascript
JS从数组中随机取出几个数组元素的方法
2016/08/02 Javascript
AngularJS之依赖注入模拟实现
2016/08/19 Javascript
AngularJS中run方法的巧妙运用
2017/01/04 Javascript
bootstrap制作jsp页面(根据值让table显示选中)
2017/01/05 Javascript
JavaScript实现为事件句柄绑定监听函数的方法分析
2017/11/14 Javascript
Vue+mui实现图片的本地缓存示例代码
2018/05/24 Javascript
JavaScript中click和onclick本质区别与用法分析
2018/06/07 Javascript
Vue.js自定义指令学习使用详解
2019/10/19 Javascript
JS控制GIF图片的停止与显示
2019/10/24 Javascript
JavaScript实现图片合成下载的示例
2020/11/19 Javascript
tf.truncated_normal与tf.random_normal的详细用法
2018/03/05 Python
解决Python二维数组赋值问题
2019/11/28 Python
python ImageDraw类实现几何图形的绘制与文字的绘制
2020/02/26 Python
python的flask框架难学吗
2020/07/31 Python
python中scrapy处理项目数据的实例分析
2020/11/22 Python
FOREO斐珞尔官方旗舰店:LUNA露娜洁面仪
2018/03/11 全球购物
Lookfantastic台湾:英国彩妆美发保养购物网
2018/03/26 全球购物
土耳其风格手工珠宝:Ottoman Hands
2019/07/26 全球购物
某科技软件测试面试题
2013/05/19 面试题
街道党工委党的群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
政风行风评议工作总结
2014/10/21 职场文书
起诉书格式范文
2015/05/20 职场文书
军事博物馆观后感
2015/06/05 职场文书
怎样做好公众演讲能力?
2019/08/28 职场文书
分享15个Webpack实用的插件!!!
2021/03/31 Javascript