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+dbfile开发小型留言本
Oct 09 PHP
php xml文件操作实现代码(二)
Mar 20 PHP
PHP similar_text 字符串的相似性比较函数
May 26 PHP
解析Ubuntu下crontab命令的用法
Jun 24 PHP
PHP 双链表(SplDoublyLinkedList)简介和使用实例
May 12 PHP
轻松掌握php设计模式之访问者模式
Sep 23 PHP
简单实现PHP留言板功能
Dec 21 PHP
Laravel框架路由设置与使用示例
Jun 12 PHP
PHP静态方法和静态属性及常量属性的区别与介绍
Mar 22 PHP
php基于协程实现异步的方法分析
Jul 17 PHP
Laravel框架Eloquent ORM简介、模型建立及查询数据操作详解
Dec 04 PHP
tp5.1 框架join方法用法实例分析
May 26 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
简单的页面缓冲技术
2006/10/09 PHP
PHP实现定时生成HTML网站首页实例代码
2008/11/20 PHP
PHP 冒泡排序算法的实现代码
2010/08/08 PHP
PHP实现获取图片颜色值的方法
2014/07/11 PHP
使用PHP生成图片的缩略图的方法
2015/08/18 PHP
PHP实现的ID混淆算法类与用法示例
2018/08/10 PHP
PHP+redis实现微博的拉模型案例详解
2019/07/10 PHP
《JavaScript高级程序设计》阅读笔记(二) ECMAScript中的原始类型
2012/02/27 Javascript
raphael.js绘制中国地图 地图绘制方法
2014/02/12 Javascript
js使用递归解析xml
2014/12/12 Javascript
js中判断变量类型函数typeof的用法总结
2016/08/09 Javascript
Bootstrap弹出框modal上层的输入框不能获得焦点问题的解决方法
2016/12/13 Javascript
基于AngularJS实现的工资计算器实例
2017/06/16 Javascript
React Native使用Modal自定义分享界面的示例代码
2017/10/31 Javascript
利用JS判断客户端类型你应该知道的四种方法
2017/12/22 Javascript
父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法
2018/04/25 Javascript
微信小程序的mpvue框架快速上手指南
2019/05/15 Javascript
使用vue制作滑动标签
2019/09/21 Javascript
js实现上下左右键盘控制div移动
2020/01/16 Javascript
原生JS实现贪吃蛇小游戏
2020/03/09 Javascript
Vue优化:常见会导致内存泄漏问题及优化详解
2020/08/04 Javascript
Python使用metaclass实现Singleton模式的方法
2015/05/05 Python
python tensorflow基于cnn实现手写数字识别
2018/01/01 Python
Python实现多态、协议和鸭子类型的代码详解
2019/05/05 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
2019/08/21 Python
python同时替换多个字符串方法示例
2019/09/17 Python
基于Python实现船舶的MMSI的获取(推荐)
2019/10/21 Python
tensorflow模型保存、加载之变量重命名实例
2020/01/21 Python
咖啡为什么会有酸味?你喝到的咖啡為什麼是酸的?
2021/03/17 冲泡冲煮
美国奢侈品在线团购网站:Gilt City
2017/11/16 全球购物
日本即尚网:JSHOPPERS.com(支持中文)
2019/12/03 全球购物
Arti-shopping中文官网:大型海外商品一站式直邮平台
2020/03/23 全球购物
一些关于MySql加速和优化的面试题
2014/01/30 面试题
小学教师见习总结
2015/06/23 职场文书
浅谈MySQL 亿级数据分页的优化
2021/06/15 MySQL
SSM VUE Axios详解
2021/10/05 Vue.js