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 相关文章推荐
实用函数10
Nov 08 PHP
php $_ENV为空的原因分析
Jun 01 PHP
phpmyadmin导入(import)文件限制的解决办法
Dec 11 PHP
php 修改zen-cart下单和付款流程以防止漏单
Mar 08 PHP
php学习笔记 面向对象中[接口]与[多态性]的应用
Jun 16 PHP
PHP UTF8中文字符截断函数代码
Sep 11 PHP
深入PHP FTP类的详解
Jun 13 PHP
微信公众号开发之文本消息自动回复php代码
Aug 08 PHP
PHP针对中英文混合字符串长度判断及截取方法示例
Mar 31 PHP
php实现基于pdo的事务处理方法示例
Jul 21 PHP
PHP htmlspecialchars_decode()函数用法讲解
Mar 01 PHP
php+ajax 文件上传代码实例
Mar 18 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模拟ping命令(php exec函数的使用方法)
2013/10/25 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
2014/06/23 PHP
一个不易被发现的PHP后门代码解析
2014/07/05 PHP
ThinkPHP 表单自动验证运用示例
2014/10/13 PHP
php生成带logo二维码方法小结
2016/04/08 PHP
关于IE中getElementsByClassName不能用的问题解决方法
2013/08/26 Javascript
JS获得QQ号码的昵称,头像,生日的简单实例
2013/12/04 Javascript
jQuery模拟新浪微博首页滚动效果的方法
2015/03/11 Javascript
javascript实现捕捉键盘上按下的键
2015/05/05 Javascript
js实现的二分查找算法实例
2016/01/21 Javascript
Bootstrap Img 图片样式(推荐)
2016/12/13 Javascript
微信小程序 限制1M的瘦身技巧与方法详解
2017/01/06 Javascript
BootStrap的两种模态框方式
2017/05/10 Javascript
vue 2.0 购物车小球抛物线的示例代码
2018/02/01 Javascript
jquery的 filter()方法使用教程
2018/03/22 jQuery
Koa2微信公众号开发之消息管理
2018/05/16 Javascript
Vue组件之极简的地址选择器的实现
2018/05/31 Javascript
Node.js中的cluster模块深入解读
2018/06/11 Javascript
使用post方法实现json往返传输数据的方法
2019/03/30 Javascript
layui清除radio的选中状态实例
2019/11/14 Javascript
如何在微信小程序中存setStorage
2019/12/13 Javascript
CentOS 6.X系统下升级Python2.6到Python2.7 的方法
2016/10/12 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
2017/08/24 Python
django认证系统实现自定义权限管理的方法
2018/07/16 Python
Python将文本去空格并保存到txt文件中的实例
2018/07/24 Python
Python自动重新加载模块详解(autoreload module)
2020/04/01 Python
python实现人脸签到系统
2020/04/13 Python
Hotels.com台湾:饭店订房网
2017/09/06 全球购物
美国酒店控股公司:Choice Hotels
2018/06/15 全球购物
同学聚会老师邀请函
2014/01/28 职场文书
农村葬礼主持词
2014/03/31 职场文书
我的中国梦演讲稿500字
2014/08/19 职场文书
2014年骨干教师工作总结
2014/12/19 职场文书
幼儿园推普周活动总结
2015/05/07 职场文书
本科毕业答辩开场白
2015/05/27 职场文书
乡镇干部学习心得体会
2016/01/23 职场文书