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 相关文章推荐
Apache设置虚拟WEB
Oct 09 PHP
php中批量修改文件后缀名的函数代码
Oct 23 PHP
PHP+Memcache实现wordpress访问总数统计(非插件)
Jul 04 PHP
php中Y2K38的漏洞解决方法实例分析
Sep 22 PHP
PHP中的替代语法介绍
Jan 09 PHP
新浪SAE搭建PHP项目教程
Jan 28 PHP
php选择排序法实现数组排序实例分析
Feb 16 PHP
Linux系统递归生成目录中文件的md5的方法
Jun 29 PHP
php使用gzip压缩传输js和css文件的方法
Jul 29 PHP
php创建图像具体步骤
Mar 13 PHP
PHP hex2bin()函数用法讲解
Feb 25 PHP
浅谈laravel框架sql中groupBy之后排序的问题
Oct 17 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
ThinkPHP中where()使用方法详解
2016/04/19 PHP
php中引用符号(&amp;)的使用详细介绍
2016/12/06 PHP
php实现保存周期为1天的购物车类
2017/07/07 PHP
PHP PDOStatement::errorCode讲解
2019/01/31 PHP
JavaScript学习笔记之定时器
2015/01/22 Javascript
Node.js node-schedule定时任务隔多少分钟执行一次的方法
2015/02/10 Javascript
js进行表单验证实例分析
2015/02/10 Javascript
jquery插件corner实现圆角边框的方法
2015/03/09 Javascript
js实现键盘上下左右键选择文字并显示在文本框的方法
2015/05/07 Javascript
JavaScript对HTML DOM使用EventListener进行操作
2015/10/21 Javascript
基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard
2016/06/17 Javascript
自动化测试读写64位操作系统的注册表
2016/08/15 Javascript
老生常谈Javascript中的原型和this指针
2016/10/09 Javascript
JS实现物体带缓冲的间歇运动效果示例
2016/12/22 Javascript
JS实现的自动打字效果示例
2017/03/10 Javascript
Vue props用法详解(小结)
2018/07/03 Javascript
js实现图片局部放大效果详解
2019/03/18 Javascript
JavaScript仿京东轮播图效果
2021/02/25 Javascript
在Python中移动目录结构的方法
2016/01/31 Python
浅谈python中的getattr函数 hasattr函数
2016/06/14 Python
Python内置函数—vars的具体使用方法
2017/12/04 Python
Python实现查询某个目录下修改时间最新的文件示例
2018/08/29 Python
CentOS 7下安装Python3.6 及遇到的问题小结
2018/11/08 Python
Python获取好友地区分布及好友性别分布情况代码详解
2019/07/10 Python
使用OpenCV实现仿射变换—平移功能
2019/08/29 Python
基于python的itchat库实现微信聊天机器人(推荐)
2019/10/29 Python
Python中__repr__和__str__区别详解
2019/11/07 Python
python可以用哪些数据库
2020/06/22 Python
软件配置管理有什么好处
2015/04/15 面试题
Lucene推荐的分页方式是什么?
2015/12/07 面试题
纪念建党演讲稿范文
2014/01/13 职场文书
公司授权委托书
2014/04/04 职场文书
网络技术专业求职信
2014/07/13 职场文书
2016圣诞节贺卡寄语
2015/12/07 职场文书
重温经典:乔布斯在斯坦福大学的毕业演讲(双语)
2019/08/26 职场文书
Python Pygame实战在打砖块游戏的实现
2022/03/17 Python