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 相关文章推荐
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
Mar 27 PHP
php session劫持和防范的方法
Nov 12 PHP
Drupal7连接多个数据库及常见问题解决
Mar 02 PHP
CI框架Session.php源码分析
Nov 03 PHP
php制作的简单验证码识别代码
Jan 26 PHP
修改Laravel5.3中的路由文件与路径
Aug 10 PHP
php批量删除操作代码分享
Feb 26 PHP
PHP中Notice错误常见解决方法
Apr 28 PHP
laravel 5.3中自定义加密服务的方案详解
May 09 PHP
php如何修改SESSION的生存存储时间的实例代码
Jul 05 PHP
PHP使用递归按层级查找数据的方法
Nov 10 PHP
PHP程序守护进程化实现方法详解
Jul 16 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中mysql模块部分功能的简单封装
2011/09/30 PHP
linux系统上支持php的 iconv()函数的方法
2011/10/01 PHP
基于php socket(fsockopen)的应用实例分析
2013/06/02 PHP
详解Laravel5.6 Passport实现Api接口认证
2018/07/27 PHP
js 火狐下取本地路径实现思路
2013/04/02 Javascript
JS/jQuery实现默认显示部分文字点击按钮显示全部内容
2013/05/13 Javascript
js中一个函数获取另一个函数返回值问题探讨
2013/11/21 Javascript
写JQuery插件的基本知识
2013/11/25 Javascript
使用原生js写的一个简单slider
2014/04/29 Javascript
jquery.idTabs 选项卡使用示例代码
2014/09/03 Javascript
AngularJS入门教程之MVC架构实例分析
2016/11/01 Javascript
Jquery获取radio选中的值
2017/05/05 jQuery
js图片放大镜实例讲解(必看篇)
2017/07/17 Javascript
angular2/ionic2 实现搜索结果中的搜索关键字高亮的示例
2018/08/17 Javascript
JavaScript时间与时间戳的转换操作实例分析
2018/12/07 Javascript
layui 关闭open弹出框 刷新table表格页面的方法
2019/09/16 Javascript
js实现鼠标点击页面弹出自定义文字效果
2019/12/24 Javascript
vue路由缓存的几种实现方式小结
2020/02/02 Javascript
react使用antd表单赋值,用于修改弹框的操作
2020/10/29 Javascript
在vue中嵌入外部网站的实现
2020/11/13 Javascript
H5 js点击按钮复制文本到粘贴板
2020/11/19 Javascript
Python3访问并下载网页内容的方法
2015/07/28 Python
Python中进程和线程的区别详解
2017/10/29 Python
Python实现批量执行同目录下的py文件方法
2019/01/11 Python
python 画条形图(柱状图)实例
2020/04/24 Python
使用python matploblib库绘制准确率,损失率折线图
2020/06/16 Python
使用pytorch 筛选出一定范围的值
2020/06/28 Python
HTML5 图片悬停放大的实现代码示例
2019/12/04 HTML / CSS
html5移动端自适应布局的实现
2020/04/15 HTML / CSS
设计专业自荐信
2014/06/19 职场文书
汽车质检员岗位职责
2015/04/08 职场文书
市语委办2016年第十九届“推普周”活动总结
2016/04/05 职场文书
2019中秋节祝福语大全,提前收藏啦
2019/09/10 职场文书
Python词云的正确实现方法实例
2021/05/08 Python
python中24小时制转换为12小时制的方法
2021/06/18 Python
Ajax实现异步加载数据
2021/11/17 Javascript