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自动加载的两种实现方法
Jun 21 PHP
Yii PHP Framework实用入门教程(详细介绍)
Jun 18 PHP
PHP类继承 extends使用介绍
Jan 14 PHP
php遍历数组的4种方法总结
Jul 05 PHP
php实现俄罗斯乘法实例
Mar 07 PHP
通过Email发送PHP错误的方法
Jul 20 PHP
浅析php设计模式之数据对象映射模式
Mar 03 PHP
Yii净化器CHtmlPurifier用法示例(过滤不良代码)
Jul 15 PHP
PHP简单实现冒泡排序的方法
Dec 26 PHP
PHP实现打包zip并下载功能
Jun 12 PHP
PHP模版引擎原理、定义与用法实例
Mar 29 PHP
PHP进阶学习之反射基本概念与用法分析
Jun 18 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
SONY ICF-F10中波修复记
2021/03/02 无线电
php提示Call-time pass-by-reference has been deprecated in的解决方法[已测]
2012/05/06 PHP
PHP生成sitemap.xml地图函数
2013/11/13 PHP
ThinkPHP表单自动验证实例
2014/10/13 PHP
文本框根据输入内容自适应高度的代码
2011/10/24 Javascript
SOSO地图JS画出标注和中心点以html形式运行
2013/08/09 Javascript
javascript版2048小游戏
2015/03/18 Javascript
详解AngularJS中的表达式使用
2015/06/16 Javascript
深入浅析javascript立即执行函数
2015/10/23 Javascript
javascript中利用柯里化函数实现bind方法
2016/04/29 Javascript
ion content 滚动到底部会遮住一部分视图的快速解决方法
2016/09/06 Javascript
微信小程序开发之麦克风动画 帧动画 放大 淡出
2017/04/18 Javascript
浅谈JavaScript_DOM学习篇_图片切换小案例
2019/03/19 Javascript
npm qs模块使用详解
2020/02/07 Javascript
python调用java模块SmartXLS和jpype修改excel文件的方法
2015/04/28 Python
Python读写ini文件的方法
2015/05/28 Python
举例讲解Python设计模式编程中的访问者与观察者模式
2016/01/26 Python
Django处理文件上传File Uploads的实例
2018/05/28 Python
python3的print()函数的用法图文讲解
2019/07/16 Python
pytorch 自定义卷积核进行卷积操作方式
2019/12/30 Python
python设置代理和添加镜像源的方法
2020/02/14 Python
PyCharm刷新项目(文件)目录的实现
2020/02/14 Python
基于pytorch padding=SAME的解决方式
2020/02/18 Python
Pycharm pyuic5实现将ui文件转为py文件,让UI界面成功显示
2020/04/08 Python
Python监听键盘和鼠标事件的示例代码
2020/11/18 Python
利用html5的websocket实现websocket聊天室
2013/12/12 HTML / CSS
ETO男装官方网店:ETO Jeans
2019/02/28 全球购物
Prototype如何更新局部页面
2013/03/03 面试题
实习自我鉴定
2013/12/15 职场文书
大学生自我鉴定书
2014/03/24 职场文书
乡村教师党员四风问题对照检查材料思想汇报
2014/10/08 职场文书
幼儿园见习报告范文
2014/10/30 职场文书
旷工辞退通知书
2015/04/17 职场文书
幼儿园推普周活动总结
2015/05/07 职场文书
英文诗歌翻译方法(赏析)
2019/08/16 职场文书
详解Java分布式事务的 6 种解决方案
2021/06/26 Java/Android