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 session_start()关于Cannot send session cache limiter - headers already sent错误解决方法
Nov 27 PHP
PHP 动态随机生成验证码类代码
Apr 09 PHP
php中实现简单的ACL 完结篇
Sep 07 PHP
PHP乱码问题,UTF-8乱码常见问题小结
Apr 09 PHP
php 中文字符串首字母的获取函数分享
Nov 04 PHP
深入理解PHP类的自动载入机制
Sep 16 PHP
phpcms配置列表页以及获得文章发布时间
Jul 04 PHP
使用php自动备份数据库表的实现方法
Jul 28 PHP
php 中phar包的使用教程详解
Oct 26 PHP
PHP数字金额转换成中文大写显示
Jan 05 PHP
实现laravel 插入操作日志到数据库的方法
Oct 11 PHP
PHP 出现 http500 错误的解决方法
Mar 09 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
使用zend studio for eclipse不能激活代码提示功能的解决办法
2009/10/11 PHP
深入了解PHP类Class的概念
2012/06/14 PHP
apache和PHP如何整合在一起
2015/10/12 PHP
js GridView 实现自动计算操作代码
2009/03/25 Javascript
javascript 一个函数对同一元素的多个事件响应
2009/07/25 Javascript
JS遮罩层效果 兼容ie firefox jQuery遮罩层
2010/07/26 Javascript
Jquery插件 easyUI属性汇总
2011/01/19 Javascript
打造基于jQuery的高性能TreeView(asp.net)
2011/02/23 Javascript
jquery图片延迟加载 前端开发技能必备系列
2012/06/18 Javascript
JavaScript高级程序设计(第3版)学习笔记10 再访js对象
2012/10/11 Javascript
JavaScript地图拖动功能SpryMap的简单实现
2013/07/17 Javascript
javascript页面动态显示时间变化示例代码
2013/12/18 Javascript
如何实现textarea里的不同文本显示不同颜色
2014/01/20 Javascript
JQuery的Pager分页器实现代码
2016/05/03 Javascript
js只执行1次的函数示例
2016/07/20 Javascript
webpack构建换肤功能的思路详解
2017/11/27 Javascript
vue自定义底部导航栏Tabbar的实现代码
2018/09/03 Javascript
jquery+css实现Tab栏切换的代码实例
2019/05/14 jQuery
深入理解基于vue-cli的webpack打包优化实践及探索
2019/10/14 Javascript
VUEX采坑之路之获取不到$store的解决方法
2019/11/08 Javascript
js实现列表向上无限滚动
2020/01/13 Javascript
[40:12]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python冒泡排序算法的实现代码
2013/11/21 Python
python中的turtle库函数简单使用教程
2018/07/23 Python
Python后台开发Django的教程详解(启动)
2019/04/08 Python
用django设置session过期时间的方法解析
2019/08/05 Python
Python实现寻找回文数字过程解析
2020/06/09 Python
巴西箱包、背包、钱包和旅行配件购物网站:Inovathi
2019/12/14 全球购物
电子商务专业求职信
2014/07/10 职场文书
小学生迎国庆演讲稿
2014/09/05 职场文书
学习优秀共产党员先进事迹思想报告
2014/09/17 职场文书
小学生2014国庆节演讲稿:祖国在我心中
2014/09/21 职场文书
歼十出击观后感
2015/06/11 职场文书
幼儿园国培研修日志
2015/11/13 职场文书
小学二年级语文教学反思
2016/03/03 职场文书
详解Laravel框架的依赖注入功能
2021/05/27 PHP