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 相关文章推荐
资料注册后发信小技巧
Oct 09 PHP
php桌面中心(三) 修改数据库
Mar 11 PHP
生成php程序的php代码
Apr 07 PHP
新安装的MySQL数据库需要注意的安全知识
Jul 30 PHP
PHP 获取远程文件内容的函数代码
Mar 24 PHP
PHP命名空间(namespace)的动态访问及使用技巧
Aug 18 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
Nov 19 PHP
php实现生成验证码实例分享
Apr 10 PHP
php实现图片按比例截取的方法
Feb 06 PHP
PHP反射机制原理与用法详解
Feb 15 PHP
PHP设计模式之状态模式定义与用法详解
Apr 02 PHP
PHP 7.4中使用预加载的方法详解
Jul 08 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 Http_Template_IT类库进行模板替换
2009/03/19 PHP
PHP 文件缓存的性能测试
2010/04/25 PHP
帝国CMS留言板回复后发送EMAIL通知客户
2015/07/06 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
PHP实现微信退款的方法示例
2019/03/26 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
2019/08/27 PHP
laravel csrf排除路由,禁止,关闭指定路由的例子
2019/10/21 PHP
javascript下查找父节点的简单方法
2007/08/13 Javascript
javascript的trim,ltrim,rtrim自定义函数
2008/09/21 Javascript
中文字符串截取的js函数代码
2013/04/17 Javascript
jQuery构造函数init参数分析
2015/05/13 Javascript
JS更改select内option属性的方法
2015/10/14 Javascript
学习JavaScript设计模式(封装)
2015/11/26 Javascript
jQuery html表格排序插件tablesorter使用方法详解
2017/02/10 Javascript
详解vue axios二次封装
2018/07/22 Javascript
Flutter实现仿微信底部菜单栏功能
2019/09/18 Javascript
基于Vue的商品主图放大镜方案详解
2019/09/19 Javascript
python计算文本文件行数的方法
2015/07/06 Python
使用python加密自己的密码
2015/08/04 Python
程序员写Python时的5个坏习惯,你有几条?
2018/11/26 Python
Flask核心机制之上下文源码剖析
2018/12/25 Python
pyqt5 实现在别的窗口弹出进度条
2019/06/18 Python
Python FTP文件定时自动下载实现过程解析
2019/11/12 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
2019/12/19 Python
python小程序之4名牌手洗牌发牌问题解析
2020/05/15 Python
哪种Python框架适合你?简单介绍几种主流Python框架
2020/08/04 Python
python 实用工具状态机transitions
2020/11/21 Python
如何通过安装HomeBrew来安装Python3
2020/12/23 Python
一款利用css3的鼠标经过动画显示详情特效的实例教程
2014/12/29 HTML / CSS
高三自我鉴定
2013/10/23 职场文书
店长岗位职责
2013/11/21 职场文书
节水倡议书范文
2014/04/15 职场文书
幼儿园开学温馨提示
2015/07/15 职场文书
保护环境建议书作文400字
2015/09/14 职场文书
Kubernetes关键组件与结构组成介绍
2022/03/31 Servers
试用1103暨1103、1101同门大比武 [ DAIWEI ]
2022/04/05 无线电