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 相关文章推荐
smarty section简介与用法分析
Oct 03 PHP
PHP的substr_replace将指定两位置之间的字符替换为*号
May 04 PHP
PHP中time(),date(),mktime()区别介绍
Sep 28 PHP
php实现快速排序的三种方法分享
Mar 12 PHP
php字符串的替换,分割和连接方法
May 23 PHP
使用PHPExcel实现数据批量导出为excel表格的方法(必看)
Jun 09 PHP
PHP简单装饰器模式实现与用法示例
Jun 22 PHP
thinkPHP5项目中实现QQ第三方登录功能
Oct 20 PHP
php ajax confirm 删除实例详解
Mar 06 PHP
yii框架使用分页的方法分析
Jul 25 PHP
PHP7创建销毁session的实例方法
Feb 03 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 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 json与xml序列化/反序列化
2013/10/28 PHP
php preg_replace替换实例讲解
2013/11/04 PHP
yii添删改查实例
2015/11/16 PHP
Mac系统完美安装PHP7详细教程
2017/06/06 PHP
php实现银联商务公众号+服务窗支付的示例代码
2019/10/12 PHP
jQuery easyui datagrid动态查询数据实例讲解
2013/02/26 Javascript
jquery的相对父元素和相对文档定位示例代码
2013/08/02 Javascript
禁止选中文字兼容IE、Chrome、FF等
2013/09/04 Javascript
JavaScript中变量声明有var和没var的区别示例介绍
2014/09/15 Javascript
javascript判断移动端访问设备并解析对应CSS的方法
2015/02/05 Javascript
JavaScript获取指定元素位置的方法
2015/04/08 Javascript
浅析javascript异步执行函数导致的变量变化问题解决思路
2016/05/13 Javascript
浅谈jQuery this和$(this)的区别及获取$(this)子元素对象的方法
2016/11/29 Javascript
javascript DOM的详解及实例代码
2017/03/06 Javascript
Angular directive递归实现目录树结构代码实例
2017/05/05 Javascript
vue-router实现webApp切换页面动画效果代码
2017/05/25 Javascript
Angularjs 手写日历的实现代码(不用插件)
2017/10/18 Javascript
AngularJS实现的生成随机数与猜数字大小功能示例
2017/12/25 Javascript
移动web开发之touch事件实例详解
2018/01/17 Javascript
jQuery使用each遍历循环的方法
2018/09/19 jQuery
nodejs简单抓包工具使用详解
2019/08/23 NodeJs
JS回调函数深入理解
2019/10/16 Javascript
原生javascript的ajax请求及后台PHP响应操作示例
2020/02/24 Javascript
[03:33]TI9战队采访 - Infamous
2019/08/20 DOTA
快速入手Python字符编码
2016/08/03 Python
Python win32com 操作Exce的l简单方法(必看)
2017/05/25 Python
numpy中的高维数组转置实例
2018/04/17 Python
Python对象属性自动更新操作示例
2018/06/15 Python
总结Python图形用户界面和游戏开发知识点
2019/05/22 Python
Python编写一个验证码图片数据标注GUI程序附源码
2019/12/09 Python
python 伯努利分布详解
2020/02/25 Python
python绘制分布折线图的示例
2020/09/24 Python
生产部岗位职责范文
2014/02/07 职场文书
毕业生登记表班级意见
2015/06/05 职场文书
中小学生安全教育观后感
2015/06/17 职场文书
python开发的自动化运维工具ansible详解
2021/08/07 Python