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 相关文章推荐
一键删除顽固的空文件夹 软件下载
Jan 26 PHP
Php Image Resize图片大小调整的函数代码
Jan 17 PHP
显示youtube视频缩略图和Vimeo视频缩略图代码分享
Feb 13 PHP
PHP curl实现抓取302跳转后页面的示例
Jul 04 PHP
php实现的Curl封装类Curl.class.php用法实例分析
Sep 25 PHP
php短信接口代码
May 13 PHP
用PHP写的一个冒泡排序法的函数简单实例
May 26 PHP
PHP简单数据库操作类实例【支持增删改查及链式操作】
Oct 10 PHP
php实现的mysqldb读写分离操作类示例
Feb 07 PHP
PHP实现批量删除(封装)
Apr 28 PHP
ThinkPHP实现的rsa非对称加密类示例
May 29 PHP
Laravel向公共模板赋值方法总结
Jun 25 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
一个没有MYSQL数据库支持的简易留言本的编写
2006/10/09 PHP
实用函数10
2007/11/08 PHP
PHP开发中常用的三个表单验证函数使用小结
2010/03/03 PHP
laravel 实现向公共模板中传值 (view composer)
2019/10/22 PHP
js类中获取外部函数名的方法
2007/08/19 Javascript
微信小程序 textarea 组件详解及简单实例
2017/01/10 Javascript
jQuery插件FusionCharts绘制2D双折线图效果示例【附demo源码】
2017/04/14 jQuery
基于JavaScript实现前端数据多条件筛选功能
2020/08/19 Javascript
vue-resource请求实现http登录拦截或者路由拦截的方法
2018/07/11 Javascript
vue实现动态列表点击各行换色的方法
2018/09/13 Javascript
浅谈vue引用静态资源需要注意的事项
2018/09/28 Javascript
移动端(微信等使用vConsole调试console的方法
2019/03/05 Javascript
微信小程序批量上传图片到七牛(推荐)
2019/12/19 Javascript
JS window对象简单操作完整示例
2020/01/14 Javascript
vue-cli创建的项目中的gitHooks原理解析
2020/02/14 Javascript
JavaScript eval()函数定义及使用方法详解
2020/07/07 Javascript
[02:04]2014DOTA2国际邀请赛 DK一个时代的落幕
2014/07/21 DOTA
Python中返回字典键的值的values()方法使用
2015/05/22 Python
python获取命令行输入参数列表的实例代码
2018/06/23 Python
python中自带的三个装饰器的实现
2019/11/08 Python
基于torch.where和布尔索引的速度比较
2020/01/02 Python
美国知名的家庭连锁百货商店:Boscov’s
2017/07/27 全球购物
标记环网Toke Ring IEEE802.5
2014/05/26 面试题
StringBuilder和String的区别
2015/05/18 面试题
高级Java程序员面试要点
2013/08/02 面试题
普通大学毕业生自荐信
2013/11/04 职场文书
财务会计实习报告体会
2013/12/20 职场文书
工作会议欢迎词
2014/01/16 职场文书
面试后的英文感谢信
2014/02/01 职场文书
开业庆典策划方案
2014/02/18 职场文书
安全标语口号
2014/06/09 职场文书
村干部群众路线整改措施思想汇报
2014/10/12 职场文书
教师个人总结范文
2015/02/11 职场文书
小学生学习保证书
2015/02/26 职场文书
2015年音乐教学工作总结
2015/07/22 职场文书
预备党员入党感言
2015/08/01 职场文书