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 25 PHP
PHP获取163、gmail、126等邮箱联系人地址【已测试2009.10.10】
Oct 11 PHP
使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT
Apr 23 PHP
解析PHP中的unset究竟会不会释放内存
Jul 18 PHP
PHP生成指定长度随机数最简洁的方法
Jul 14 PHP
如何让thinkphp在模型中自动完成session赋值小教程
Sep 05 PHP
PHP图片处理之使用imagecopyresampled函数裁剪图片例子
Nov 19 PHP
thinkphp框架page类与bootstrap分页(美化)
Jun 25 PHP
浅谈PHP中new self()和new static()的区别
Aug 11 PHP
PHP实现微信对账单处理
Oct 01 PHP
php生成word并下载代码实例
Mar 15 PHP
php中array_fill函数的实例用法
Mar 02 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
神族 PROTOSS 概述
2020/03/14 星际争霸
ThinkPHP标签制作教程
2014/07/10 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
PHP解决高并发的优化方案实例
2020/12/10 PHP
从阶乘函数对比Javascript和C#的异同
2012/05/31 Javascript
javascript动画对象支持加速、减速、缓入、缓出的实现代码
2012/09/30 Javascript
你必须知道的JavaScript 中字符串连接的性能的一些问题
2013/05/07 Javascript
详解JavaScript中void语句的使用
2015/06/04 Javascript
JavaScript中setMonth()方法的使用详解
2015/06/11 Javascript
js鼠标点击图片切换效果代码分享
2015/08/26 Javascript
jQuery的选择器中的通配符[id^='code']或[name^='code']及jquery选择器总结
2015/12/24 Javascript
jQuery 自定义下拉框(DropDown)附源码下载
2016/07/22 Javascript
Angularjs 制作购物车功能实例代码
2016/09/14 Javascript
JavaScript实现邮箱地址自动匹配功能代码
2016/11/28 Javascript
使用JavaScript开发跨平台的桌面应用详解
2017/07/27 Javascript
Node.js中,在cmd界面,进入退出Node.js运行环境的方法
2018/05/12 Javascript
Vue验证码60秒倒计时功能简单实例代码
2018/06/22 Javascript
微信JS-SDK updateAppMessageShareData安卓不能自定义分享详解
2019/03/29 Javascript
JavaScript实现简单随机点名器
2019/11/21 Javascript
浅谈关于vue中scss公用的解决方案
2019/12/02 Javascript
Python中的作用域规则详解
2015/01/30 Python
go和python变量赋值遇到的一个问题
2017/08/31 Python
Python3 翻转二叉树的实现
2019/09/30 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
2020/02/04 Python
python3 字符串知识点学习笔记
2020/02/08 Python
python3中sys.argv的实例用法
2020/04/24 Python
keras多显卡训练方式
2020/06/10 Python
意大利奢侈品零售商:ilDuomo Novara
2019/09/11 全球购物
如何打印出当前源文件的文件名以及源文件的当前行号
2015/04/05 面试题
电气工程师岗位职责
2014/01/01 职场文书
房屋租赁合同协议书范本
2014/10/19 职场文书
优秀教育工作者事迹材料
2014/12/24 职场文书
《普罗米修斯》教学反思
2016/02/22 职场文书
Python绘制地图神器folium的新人入门指南
2021/05/23 Python
mysql中如何用命令创建联合唯一索引
2022/04/20 MySQL
Python软件包安装的三种常见方法
2022/07/07 Python