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个人网站架设连环讲(四)
Oct 09 PHP
一个用mysql_odbc和php写的serach数据库程序
Oct 09 PHP
php中的数组操作函数整理
Aug 18 PHP
php array_flip() 删除数组重复元素
Jan 14 PHP
php操作xml
Oct 27 PHP
PHP获取栏目的所有子级和孙级栏目的ID号示例
Apr 01 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
Dec 11 PHP
PHP 类与构造函数解析
Feb 06 PHP
Laravel框架中Blade模板的用法示例
Aug 30 PHP
在PHP中输出JS语句以及乱码问题的解决方案
Feb 13 PHP
php实现的数组转xml案例分析
Sep 28 PHP
laravel框架学习笔记之组件化开发实现方法
Feb 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
PHP 得到根目录的 __FILE__ 常量
2008/07/23 PHP
PHP 类型转换函数intval
2009/06/20 PHP
The specified CGI application misbehaved by not returning a complete set of HTTP headers
2011/03/31 PHP
dedecms函数分享之获取某一栏目所有子栏目
2014/05/19 PHP
PHP的openssl加密扩展使用小结(推荐)
2016/07/18 PHP
PHP 命名空间和自动加载原理与用法实例分析
2020/04/29 PHP
google jQuery 引用文件,jQuery 引用地址集合(jquery 1.2.6至jquery1.5.2)
2011/04/24 Javascript
引用外部脚本时script标签关闭的写法
2014/01/20 Javascript
jquery判断浏览器后退时候弹出消息的方法
2014/08/11 Javascript
简单谈谈javascript代码复用模式
2015/01/28 Javascript
Bootstrap按钮下拉菜单组件详解
2016/05/10 Javascript
使用jQuery Rotare实现微信大转盘抽奖功能
2016/06/20 Javascript
JS中微信小程序自定义底部弹出框
2016/12/22 Javascript
vue.js学习之vue-cli定制脚手架详解
2017/07/02 Javascript
nodejs密码加密中生成随机数的实例代码
2017/07/17 NodeJs
vue-cli2与vue-cli3在一台电脑共存的实现方法
2019/09/25 Javascript
JSONObject与JSONArray使用方法解析
2020/09/28 Javascript
python list中append()与extend()用法分享
2013/03/24 Python
Python实现的石头剪子布代码分享
2014/08/22 Python
PyQt实现界面翻转切换效果
2018/04/20 Python
详解python中Numpy的属性与创建矩阵
2018/09/10 Python
利用PyCharm Profile分析异步爬虫效率详解
2019/05/08 Python
VScode连接远程服务器上的jupyter notebook的实现
2020/04/23 Python
Python设计密码强度校验程序
2020/07/30 Python
Python基于template实现字符串替换
2020/11/27 Python
css3中单位px,em,rem,vh,vw,vmin,vmax的区别及浏览器支持情况
2016/12/06 HTML / CSS
分享一个页面平滑滚动小技巧(推荐)
2019/10/23 HTML / CSS
莫斯科绝对前卫最秘密的商店:SVMoscow
2017/10/23 全球购物
捷克汽车配件和工具销售网站:TorriaCars
2018/02/26 全球购物
伦敦一家领先的精品零售商:IRIS Fashion
2019/05/24 全球购物
美国在线鞋类零售商:LifeStride
2019/06/09 全球购物
产品销售员岗位职责
2013/12/18 职场文书
船舶专业个人求职信范文
2014/01/02 职场文书
2015年小学数学教师个人工作总结
2015/05/25 职场文书
运动会3000米加油稿
2015/07/21 职场文书
pandas进行数据输入和输出的方法详解
2022/03/23 Python