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 相关文章推荐
AJAX for PHP简单表数据查询实例
Jan 02 PHP
php 数组的合并、拆分、区别取值函数集
Feb 15 PHP
PHP 伪静态隐藏传递参数名的四种方法
Feb 22 PHP
PHP序列号生成函数和字符串替换函数代码
Jun 07 PHP
php调整gif动画图片尺寸示例代码分享
Dec 05 PHP
PHP设计模式之装饰者模式代码实例
May 11 PHP
Zend Framework动作助手Redirector用法实例详解
Mar 05 PHP
php array_multisort 对数组进行排序详解及实例代码
Oct 27 PHP
php编程实现简单的网页版计算器功能示例
Apr 26 PHP
详解laravel安装使用Passport(Api认证)
Jul 27 PHP
php输出文字乱码的解决方法
Oct 04 PHP
laravel框架模型和数据库基础操作实例详解
Jan 25 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
overlord人气高涨,却被菲利普频繁举报,第四季很难在国内上映
2020/05/06 日漫
smtp邮件发送一例
2006/10/09 PHP
linux系统上支持php的 iconv()函数的方法
2011/10/01 PHP
php中根据变量的类型 选择echo或dump
2012/07/05 PHP
Docker 如何布置PHP开发环境
2016/06/21 PHP
Visual Studio中的jQuery智能提示设置方法
2010/03/27 Javascript
js/jQuery简单实现选项卡功能
2014/01/02 Javascript
JS控制表格实现一条光线流动分割行的方法
2015/03/09 Javascript
jQuery复制表单元素附源码分享效果演示
2015/09/30 Javascript
动态设置form表单的action属性的值的简单方法
2016/05/25 Javascript
Node.js配合node-http-proxy解决本地开发ajax跨域问题
2016/08/31 Javascript
概述BootStrap中role=&quot;form&quot;及role作用角色
2016/12/08 Javascript
微信小程序 配置文件详细介绍
2016/12/14 Javascript
nodejs处理图片的中间件node-images详解
2017/05/08 NodeJs
vue使用iframe嵌入网页的示例代码
2020/06/09 Javascript
React中阻止事件冒泡的问题详析
2019/04/12 Javascript
js实现图片无缝循环轮播
2019/10/28 Javascript
vue中注册自定义的全局js方法
2019/11/15 Javascript
javascript使用Blob对象实现的下载文件操作示例
2020/04/18 Javascript
浅谈Vue3 Composition API如何替换Vue Mixins
2020/04/29 Javascript
python做量化投资系列之比特币初始配置
2018/01/23 Python
使用python实现快速搭建简易的FTP服务器
2018/09/12 Python
使用Django连接Mysql数据库步骤
2019/01/15 Python
Python字符串的一些操作方法总结
2019/06/10 Python
基于树莓派的语音对话机器人
2019/06/17 Python
Pytorch实现基于CharRNN的文本分类与生成示例
2020/01/08 Python
Python3 shelve对象持久存储原理详解
2020/03/23 Python
12个不为大家熟知的HTML5设计小技巧
2016/06/02 HTML / CSS
美国知名男士服饰品牌:Brooks Brothers(布克兄弟)
2016/08/25 全球购物
干部培训自我鉴定
2014/01/22 职场文书
应聘文员自荐信范文
2014/03/11 职场文书
早读课迟到检讨书
2014/09/25 职场文书
一年级语文上册复习计划
2015/01/17 职场文书
写作之关于描写老人的好段摘抄
2019/11/14 职场文书
用Python创建简易网站图文教程
2021/06/11 Python
MySQL8.0升级的踩坑历险记
2021/11/01 MySQL