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将fileterms函数返回的结果变成可读的形式
Apr 21 PHP
php数组函数序列之rsort() - 对数组的元素值进行降序排序
Nov 02 PHP
php实现快速排序的三种方法分享
Mar 12 PHP
php实现字符串反转输出的方法
Mar 14 PHP
php分割合并两个字符串的函数实例
Jun 19 PHP
详解在PHP的Yii框架中使用行为Behaviors的方法
Mar 18 PHP
详解PHP实现定时任务的五种方法
Jul 25 PHP
php处理单文件、多文件上传代码分享
Aug 24 PHP
CodeIgniter框架数据库基本操作示例
May 24 PHP
PHP实现会员账号单唯一登录的方法分析
Mar 07 PHP
php实现商城购物车的思路和源码分析
Jul 23 PHP
如何判断微信付款码和支付宝付款码
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
hadoop中一些常用的命令介绍
2013/06/19 PHP
php中OR与|| AND与&amp;&amp;的区别总结
2013/10/26 PHP
ThinkPHP CURD方法之field方法详解
2014/06/18 PHP
php实现refresh刷新页面批量导入数据的方法
2014/12/23 PHP
PHP 5.6.11中CURL模块问题的解决方法
2016/08/08 PHP
?牟┛途W扣了一??效果出?? target=
2007/05/27 Javascript
Javascript 构造函数,公有,私有特权和静态成员定义方法
2009/11/30 Javascript
浅谈javascript中的作用域
2012/04/07 Javascript
用js实现控件的隐藏及style.visibility的使用
2013/06/14 Javascript
浅析js中取绝对值的2种方法
2013/07/09 Javascript
Nodejs关于gzip/deflate压缩详解
2015/03/04 NodeJs
jquery实现的Accordion折叠面板效果代码
2015/09/02 Javascript
javascript同步服务器时间和同步倒计时小技巧
2015/09/24 Javascript
JS实现获取当前URL和来源URL的方法
2016/08/24 Javascript
通过BootStrap实现轮播图的实际应用
2016/09/26 Javascript
详解Angular的双向数据绑定(MV-VM)
2016/12/26 Javascript
浅析Angular2子模块以及异步加载
2017/04/24 Javascript
jQuery实现简单的回到顶部totop功能示例
2017/10/16 jQuery
ES6中let 和 const 的新特性
2018/09/03 Javascript
原生javascript的ajax请求及后台PHP响应操作示例
2020/02/24 Javascript
python实现多线程采集的2个代码例子
2014/07/07 Python
python实现音乐下载器
2018/04/15 Python
设置python3为默认python的方法
2018/10/31 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
2019/02/20 Python
pymongo中聚合查询的使用方法
2019/03/22 Python
Python目录和文件处理总结详解
2019/09/02 Python
如何用用Python将地址标记在地图上
2021/02/07 Python
医疗保健专业人士购物网站:Scrubs & Beyond
2017/02/08 全球购物
物业管理公司实习生自我鉴定
2013/09/19 职场文书
鲜果饮品店创业计划书
2014/01/21 职场文书
庆七一宣传标语
2014/10/08 职场文书
植物园观后感
2015/06/11 职场文书
学校中层领导培训心得体会
2016/01/11 职场文书
vue实现简单数据双向绑定
2021/04/28 Vue.js
JS中如何优雅的使用async await详解
2021/10/05 Javascript
微信小程序 WeUI扩展组件库的入门教程
2022/04/21 Javascript