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输出表格的实现代码(修正版)
Dec 29 PHP
php通过ajax实现双击table修改内容
Apr 28 PHP
php 使用file_get_contents读取大文件的方法
Nov 13 PHP
ThinkPHP模版中导入CSS和JS文件的方法
Nov 29 PHP
jQuery+PHP实现的掷色子抽奖游戏实例
Jan 04 PHP
php支付宝手机网页支付类实例
Mar 04 PHP
php计算整个目录大小的方法
Jun 01 PHP
PHP编写RESTful接口
Feb 23 PHP
示例详解Laravel的注册重构
Aug 14 PHP
Docker配置PHP开发环境教程
Dec 21 PHP
PHP+jQuery实现滚屏无刷新动态加载数据功能详解
May 04 PHP
phpStudy2016 配置多个域名期间遇到的问题小结
Oct 19 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 中的4种标记风格介绍
2012/05/10 PHP
php中的字符编码转换函数用法示例
2014/10/20 PHP
PHP最常用的正则表达式
2017/02/13 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
PHP使用curl_multi实现并发请求的方法示例
2018/04/29 PHP
php的lavarel框架中join和orWhere的用法
2020/12/28 PHP
传智播客学习之java 反射
2009/11/22 Javascript
简单的js表单验证函数
2013/10/28 Javascript
node.js中的fs.readFile方法使用说明
2014/12/15 Javascript
Bootstrap开关(switch)控件学习笔记分享
2016/05/30 Javascript
用js控件div的滚动条,让它在内容更新时自动滚到底部的实现方法
2016/10/27 Javascript
angular实现表单验证及提交功能
2017/02/01 Javascript
简单谈谈axios中的get,post方法
2017/06/25 Javascript
解决vue页面刷新或者后退参数丢失的问题
2018/03/13 Javascript
Vue项目pdf(base64)转图片遇到的问题及解决方法
2018/10/19 Javascript
详解JavaScript原生封装ajax请求和Jquery中的ajax请求
2019/02/14 jQuery
javascript验证form表单数据的案例详解
2019/03/25 Javascript
说说如何利用 Node.js 代理解决跨域问题
2019/04/22 Javascript
用js简单提供增删改查接口
2019/05/12 Javascript
详解vue中的父子传值双向绑定及数据更新问题
2019/06/13 Javascript
nodejs实现获取本地文件夹下图片信息功能示例
2019/06/22 NodeJs
微信小程序移动拖拽视图-movable-view实例详解
2019/08/17 Javascript
[05:22]DOTA2 2015国际邀请赛中国区预选赛首日TOP10
2015/05/26 DOTA
pip 错误unused-command-line-argument-hard-error-in-future解决办法
2014/06/01 Python
Python cookbook(数据结构与算法)通过公共键对字典列表排序算法示例
2018/03/15 Python
windows python3安装Jupyter Notebooks教程
2020/04/13 Python
Python操作dict时避免出现KeyError的几种解决方法
2020/09/20 Python
如何在vscode中安装python库的方法步骤
2021/01/06 Python
纯CSS3实现绘制各种图形实现代码详细整理
2012/12/26 HTML / CSS
H5最强接口之canvas实现动态图形功能
2019/05/31 HTML / CSS
英国计算机产品零售商:Novatech(定制个人电脑、笔记本电脑、工作站和服务器)
2018/01/28 全球购物
Tirendo比利时:在线购买轮胎
2018/10/22 全球购物
中科创达面试题
2016/12/28 面试题
运动会标语
2014/06/21 职场文书
婚礼嘉宾致辞
2015/07/28 职场文书
python实战之90行代码写个猜数字游戏
2021/04/22 Python