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新手上路(四)
Oct 09 PHP
随时给自己贴的图片加文字的php水印
Mar 16 PHP
二进制交叉权限微型php类分享
Feb 07 PHP
php中使用PHPExcel读写excel(xls)文件的方法
Sep 15 PHP
php递归遍历删除文件的方法
Apr 17 PHP
PHP中通过trigger_error触发PHP错误示例
Jun 23 PHP
Yii视图CGridView列表用法实例分析
Jul 12 PHP
php+jQuery递归调用POST循环请求示例
Oct 14 PHP
PHP与服务器文件系统的简单交互
Oct 21 PHP
PHP表单验证内容是否为空的实现代码
Nov 14 PHP
掌握PHP垃圾回收机制详解
Mar 13 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 zip文件解压类代码
2009/12/02 PHP
mcrypt启用 加密以及解密过程详细解析
2013/08/07 PHP
PHP实现设计模式中的抽象工厂模式详解
2014/10/11 PHP
PHP伪造来源HTTP_REFERER的方法实例详解
2015/07/06 PHP
php版阿里云OSS图片上传类详解
2016/12/01 PHP
一直复略了的一个问题,关于表单重复提交
2007/02/15 Javascript
Jquery 基础学习笔记
2009/05/29 Javascript
基于jQuery的可以控制左右滚动及自动滚动效果的代码
2010/07/25 Javascript
javascript开发技术大全-第1章javascript概述
2011/07/03 Javascript
js中apply方法的使用详细解析
2013/11/04 Javascript
通过JS来动态的修改url,实现对url的增删查改
2014/09/01 Javascript
详解Javascript几种跨域方式总结
2017/02/27 Javascript
jquery实现左右轮播图效果
2017/09/28 jQuery
详解关于html,css,js三者的加载顺序问题
2019/04/10 Javascript
js回溯法计算最佳旅行线路代码实例
2019/09/11 Javascript
[47:20]DAC2018 4.4 淘汰赛 Optic vs Mineski 第一场
2018/04/05 DOTA
[01:14:19]NAVI vs Mineski 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
python实现图片变亮或者变暗的方法
2015/06/01 Python
Python 类与元类的深度挖掘 II【经验】
2016/05/06 Python
python tensorflow学习之识别单张图片的实现的示例
2018/02/09 Python
Python 比较文本相似性的方法(difflib,Levenshtein)
2018/10/15 Python
python实现停车管理系统
2018/11/30 Python
python的time模块和datetime模块实例解析
2019/11/29 Python
css3实现可滑动跳转的分页插件示例
2014/05/08 HTML / CSS
html5文本内容_动力节点Java学院整理
2017/07/11 HTML / CSS
html5 拖拽及用 js 实现拖拽功能的示例代码
2020/10/23 HTML / CSS
纽约现代艺术博物馆商店:MoMA STORE(室内家具和杂货商品)
2016/08/02 全球购物
德国高性价比网上药店:medpex
2017/07/09 全球购物
一些Solaris面试题
2013/03/22 面试题
如何将一个描述日期或日期/时间的字符串转换为一个Date对象
2015/10/13 面试题
《蜗牛的奖杯》教后反思
2014/04/24 职场文书
社区服务活动报告
2015/02/05 职场文书
公司年会主持词范文!
2019/05/07 职场文书
七个Python必备的GUI库
2021/04/27 Python
css3带你实现3D转换效果
2022/02/24 HTML / CSS
js 实现验证码输入框示例详解
2022/09/23 Javascript