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的变量总结 新手推荐
Apr 18 PHP
php中修改浏览器的User-Agent来伪装你的浏览器和操作系统
Jul 29 PHP
PHP提示Warning:phpinfo() has been disabled函数禁用的解决方法
Dec 17 PHP
smarty自定义函数htmlcheckboxes用法实例
Jan 22 PHP
Yii2数据库操作常用方法小结
May 04 PHP
Yii 2.0自带的验证码使用经验分享
Jun 19 PHP
PHP简单计算两个时间差的方法示例
Jun 20 PHP
使用PHP连接数据库_实现用户数据的增删改查的整体操作示例
Sep 01 PHP
PHP的mysqli_ssl_set()函数讲解
Jan 23 PHP
phpStorm+XDebug+chrome 配置详解
Apr 01 PHP
php利用array_search与array_column实现二维数组查找
Jul 08 PHP
laravel框架之数据库查出来的对象实现转化为数组
Oct 23 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 采集程序中常用的函数
2009/12/09 PHP
PHP中uploaded_files函数使用方法详解
2011/03/09 PHP
php动态生成函数示例
2014/03/21 PHP
php+mysql实现无限分类实例详解
2015/01/15 PHP
PHP中for循环与foreach的区别
2017/03/06 PHP
PHP文件类型检查及fileinfo模块安装使用详解
2019/05/09 PHP
accesskey 提交
2006/06/26 Javascript
div当滚动到页面顶部的时候固定在顶部实例代码
2013/05/27 Javascript
javascript回车完美实现tab切换功能
2014/03/13 Javascript
jQuery 中的 DOM 操作
2016/04/26 Javascript
JavaScript中浅讲ajax图文详解
2016/11/11 Javascript
node文件上传功能简易实现代码
2017/06/16 Javascript
Javascript es7中比较实用的两个方法示例
2017/07/21 Javascript
AngularJS中的路由使用及实现代码
2017/10/09 Javascript
浅谈 Vue 项目优化的方法
2017/12/16 Javascript
element ui里dialog关闭后清除验证条件方法
2018/02/26 Javascript
聊聊JS动画库 Velocity.js的使用
2018/03/13 Javascript
Angular服务Request异步请求的实例讲解
2018/08/13 Javascript
[01:13:18]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
tensorflow实现softma识别MNIST
2018/03/12 Python
Python功能点实现:函数级/代码块级计时器
2019/01/02 Python
Python3中编码与解码之Unicode与bytes的讲解
2019/02/28 Python
pymongo中group by的操作方法教程
2019/03/22 Python
django框架自定义模板标签(template tag)操作示例
2019/06/24 Python
python3.6+selenium实现操作Frame中的页面元素
2019/07/16 Python
基于Python中的yield表达式介绍
2019/11/19 Python
Python 如何测试文件是否存在
2020/07/31 Python
Python基于template实现字符串替换
2020/11/27 Python
使用html2canvas实现将html内容写入到canvas中生成图片
2020/01/03 HTML / CSS
canvas简单连线动画的实现代码
2020/02/04 HTML / CSS
联想法国官方网站:Lenovo法国
2018/10/18 全球购物
薪酬专员岗位职责
2014/02/18 职场文书
全国优秀教师事迹材料
2014/08/26 职场文书
领导班子个人查摆问题对照检查材料
2014/10/02 职场文书
民事上诉状范文
2015/05/22 职场文书
正则表达式拆分url实例代码
2022/02/24 Java/Android