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小偷相关截取函数备忘
Nov 28 PHP
PHP判断图片格式的七种方法小结
Jun 03 PHP
PHP分页详细讲解(有实例)
Oct 30 PHP
php 根据url自动生成缩略图并处理高并发问题
Jan 23 PHP
codeigniter中实现一次性加载多个view的方法
Mar 20 PHP
基于ThinkPHP实现批量删除
Dec 18 PHP
PHP验证码生成原理和实现
Jan 24 PHP
浅谈PHP中pack、unpack的详细用法
Mar 12 PHP
浅析php如何实现爬取数据原理
Sep 27 PHP
PHP正则匹配到2个字符串之间的内容方法
Dec 24 PHP
关于Laravel-admin的基础用法总结和自定义model详解
Oct 08 PHP
eval(cmd)与eval($cmd)的区别与联系
Jul 07 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运行环境配置与开发环境的配置(图文教程)
2013/06/04 PHP
解析php下载远程图片函数 可伪造来路
2013/06/25 PHP
Laravel 实现添加多语言提示信息
2019/10/25 PHP
javascript与CSS复习(二)
2010/06/29 Javascript
打印json对象的内容及JSON.stringify函数应用
2013/03/29 Javascript
jQuery教程 $()包装函数来实现数组元素分页效果
2013/08/13 Javascript
js取消单选按钮选中示例代码
2013/11/14 Javascript
JS 屏蔽按键效果与改变按键效果的示例代码
2013/12/24 Javascript
手机端图片缩放旋转全屏查看PhotoSwipe.js插件实现
2016/08/25 Javascript
AngularJS入门教程之MVC架构实例分析
2016/11/01 Javascript
three.js快速入门【推荐】
2017/01/21 Javascript
JavaScript实现职责链模式概述
2018/01/25 Javascript
Vue中 v-if/v-show/插值表达式导致闪现的原因及解决办法
2018/10/12 Javascript
如何在现代JavaScript中编写异步任务
2021/01/31 Javascript
python 生成目录树及显示文件大小的代码
2009/07/23 Python
深入分析在Python模块顶层运行的代码引起的一个Bug
2014/07/04 Python
Python中的闭包详细介绍和实例
2014/11/21 Python
pymongo实现控制mongodb中数字字段做加法的方法
2015/03/26 Python
深入学习python的yield和generator
2016/03/10 Python
Python利用前序和中序遍历结果重建二叉树的方法
2016/04/27 Python
python3中property使用方法详解
2019/04/23 Python
numpy.random模块用法总结
2019/05/27 Python
如何更优雅地写python代码
2019/07/02 Python
Python使用enumerate获取迭代元素下标
2020/02/03 Python
OpenCV Python实现拼图小游戏
2020/03/23 Python
Python select及selectors模块概念用法详解
2020/06/22 Python
Python xlrd/xlwt 创建excel文件及常用操作
2020/09/24 Python
python实现xml转json文件的示例代码
2020/12/30 Python
英国人最爱的饰品网站:Accessorize
2016/08/22 全球购物
爱尔兰电脑、家电和家具购物网站:Buy It Direct
2019/07/09 全球购物
社会学专业求职信
2014/07/17 职场文书
办公室主任岗位职责范本
2015/03/31 职场文书
家庭暴力离婚起诉书
2015/05/18 职场文书
遗嘱范文
2015/08/07 职场文书
在pycharm中无法import所安装的库解决方案
2021/05/31 Python
前端JavaScript大管家 package.json
2021/11/02 Javascript