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 相关文章推荐
ASP知识讲座四
Oct 09 PHP
PHP下一个非常全面获取图象信息的函数
Nov 20 PHP
PHP求最大子序列和的算法实现
Jun 24 PHP
分享一下贝贝成长进度的php代码
Sep 14 PHP
浏览器预览PHP文件时顶部出现空白影响布局分析原因及解决办法
Jan 11 PHP
php计划任务之ignore_user_abort函数实现方法
Jan 08 PHP
WordPress中给媒体文件添加分类和标签的PHP功能实现
Dec 31 PHP
PHP结合Ueditor并修改图片上传路径
Oct 16 PHP
php生成图片缩略图功能示例
Feb 22 PHP
windows 2008r2+php5.6.28环境搭建详细过程
Jun 18 PHP
PHP反射原理与用法深入分析
Sep 28 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 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中call_user_func函数使用注意事项
2014/11/21 PHP
php无序树实现方法
2015/07/28 PHP
使用phpstorm和xdebug实现远程调试的方法
2015/12/29 PHP
php使用curl模拟浏览器表单上传文件或者图片的方法
2018/11/10 PHP
IE6/7/8/9不支持exec的简写方式
2011/05/25 Javascript
Node.js:Windows7下搭建的Node.js服务(来玩玩服务器端的javascript吧,这可不是前端js插件)
2011/06/27 Javascript
JavaScript中的变量声明早于赋值分析
2012/03/01 Javascript
js弹出层(jQuery插件形式附带reLoad功能)
2013/04/12 Javascript
javascript判断chrome浏览器的方法
2014/03/26 Javascript
jQuery层级选择器用法分析
2015/02/10 Javascript
JavaScript定时显示广告代码分享
2015/03/02 Javascript
深入理解JavaScript系列(48):对象创建模式(下篇)
2015/03/04 Javascript
Vue常见面试题整理【值得收藏】
2018/09/20 Javascript
[16:27]DOTA2 HEROS教学视频教你分分钟做大人-艾欧
2014/06/11 DOTA
Python编程语言的35个与众不同之处(语言特征和使用技巧)
2014/07/07 Python
Python datetime时间格式化去掉前导0
2014/07/31 Python
对python使用http、https代理的实例讲解
2018/05/07 Python
Python简单计算给定某一年的某一天是星期几示例
2018/06/27 Python
PyCharm鼠标右键不显示Run unittest的解决方法
2018/11/30 Python
Python实现将多个空格换为一个空格.md的方法
2018/12/20 Python
Python中按键来获取指定的值
2019/03/02 Python
python try except返回异常的信息字符串代码实例
2019/08/15 Python
python中seaborn包常用图形使用详解
2019/11/25 Python
python双端队列原理、实现与使用方法分析
2019/11/27 Python
Python计算指定日期是今年的第几天(三种方法)
2020/03/26 Python
Python自定义sorted排序实现方法详解
2020/09/18 Python
UNDONE手表官网:世界领先的定制手表品牌
2018/11/13 全球购物
科颜氏香港官方网店:Kiehl’s香港
2021/03/07 全球购物
会计电算化大学生职业规划书
2014/02/05 职场文书
小学母亲节活动方案
2014/03/14 职场文书
成品库仓管员岗位职责
2014/04/06 职场文书
运动会的口号
2014/06/09 职场文书
临时租车协议范本
2014/09/23 职场文书
《自然之道》读后感3篇
2019/12/17 职场文书
一篇文章弄清楚Ajax请求的五个步骤
2022/03/17 Javascript
MySQL磁盘碎片整理实例演示
2022/04/03 MySQL