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 21 PHP
php 网页游戏开发入门教程一(webgame+design)
Oct 26 PHP
基于Linux调试工具strace与gdb的常用命令总结
Jun 03 PHP
php中mysql连接和基本操作代码(快速测试使用,简单方便)
Apr 25 PHP
php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析
Jun 10 PHP
PHP 将数组打乱 shuffle函数的用法及简单实例
Jun 17 PHP
PHP会话控制实例分析
Dec 24 PHP
php微信开发之关注事件
Jun 14 PHP
php实现多站点共用session实现单点登录的方法详解
Sep 18 PHP
Laravel框架Blade模板简介及模板继承用法分析
Dec 03 PHP
php计数排序算法的实现代码(附四个实例代码)
Mar 31 PHP
laravel7学习之无限级分类的最新实现方法
Sep 30 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统计目录下的文件总数及代码行数(去除注释及空行)
2011/01/17 PHP
PHP中::、-&amp;gt;、self、$this几种操作符的区别介绍
2013/04/24 PHP
Win2003+apache+PHP+SqlServer2008 配置生产环境
2014/07/29 PHP
php中二维数组排序问题方法详解
2015/08/28 PHP
PHP+ajax分页实例简析
2015/12/07 PHP
ThinkPHP实现图片上传操作的方法详解
2017/05/08 PHP
jquery创建div 实现代码
2009/04/27 Javascript
基于jquery的气泡提示效果
2010/05/31 Javascript
仿百度输入框智能提示的js代码
2013/08/22 Javascript
JavaScript运行时库属性一览表
2014/03/14 Javascript
jQuery拖拽插件gridster使用指南
2015/04/21 Javascript
Javascript中的方法和匿名方法实例详解
2015/06/13 Javascript
关于JS中prototype的理解
2015/09/07 Javascript
JavaScript基础知识之方法汇总结
2016/01/24 Javascript
jQuery实现元素拖拽并cookie保存顺序的方法
2016/02/20 Javascript
基于jQuery实现仿百度首页选项卡切换效果
2016/05/29 Javascript
bootstrap table动态加载数据示例代码
2017/03/25 Javascript
layui实现数据表格table分页功能(ajax异步)
2019/07/27 Javascript
Vue3 的响应式和以前有什么区别,Proxy 无敌?
2020/05/20 Javascript
JavaScript实现京东快递单号查询
2020/11/30 Javascript
Python中操作文件之write()方法的使用教程
2015/05/25 Python
Python从MP3文件获取id3的方法
2015/06/15 Python
python Pandas库基础分析之时间序列的处理详解
2019/07/13 Python
python实现人工智能Ai抠图功能
2019/09/05 Python
Python自动化完成tb喵币任务的操作方法
2019/10/30 Python
Python实现aes加密解密多种方法解析
2020/05/15 Python
迷你唐卡软皮鞋:Minnetonka Moccasin
2018/05/01 全球购物
SQL Server提供的3种恢复模型都是什么? 有什么区别?
2012/05/13 面试题
校本教研工作方案
2014/01/14 职场文书
社区助残日活动总结
2014/08/29 职场文书
村党建工作汇报材料
2014/11/02 职场文书
会议邀请函
2015/01/30 职场文书
基督教追悼会答谢词
2015/09/29 职场文书
[有人@你]你有一封绿色倡议书,请查收!
2019/07/18 职场文书
Matlab求解数组中的最大值及它所在的具体位置
2021/04/16 Python
python区块链实现简版工作量证明
2022/05/25 Python