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 相关文章推荐
MySql 按时间段查询数据方法(实例说明)
Nov 02 PHP
php实现从ftp服务器上下载文件树到本地电脑的程序
Feb 10 PHP
php下把数组保存为文件格式的实例应用
Feb 08 PHP
PHP运行时强制显示出错信息的代码
Apr 20 PHP
php文档更新介绍
Jul 22 PHP
重新认识php array_merge函数
Aug 31 PHP
PHP结合jQuery实现找回密码
Jul 22 PHP
ThinkPHP中limit()使用方法详解
Apr 19 PHP
zen cart实现订单中增加paypal中预留电话的方法
Jul 12 PHP
PHP写的简单数字验证码实例
May 23 PHP
PHP htmlentities()函数用法讲解
Feb 25 PHP
PHP使用QR Code生成二维码实例
Jul 07 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
增加反向链接的101个方法 站长推荐
2007/01/31 PHP
PHP-MySQL教程归纳总结
2008/06/07 PHP
一个好用的PHP验证码类实例分享
2013/12/27 PHP
兼容ie6浏览器的php下载文件代码分享
2014/07/14 PHP
php实现给一张图片加上水印效果
2016/01/02 PHP
thinkphp整合微信支付代码分享
2016/11/24 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
jquery的ajax从纯真网(cz88.net)获取IP地址对应地区名
2009/12/02 Javascript
JavaScript实现GriwView单列全选(自写代码)
2013/05/13 Javascript
js利用数组length属性清空和截短数组的小例子
2014/01/15 Javascript
javascript 处理null及null值示例
2014/06/09 Javascript
分享一个自己写的简单的javascript分页组件
2015/02/15 Javascript
JS实现带缓冲效果打开、关闭、移动一个层的方法
2015/05/09 Javascript
聊一聊Vue.js过渡效果
2016/09/07 Javascript
基于KO+BootStrap+MVC实现的分页控件代码分享
2016/11/07 Javascript
js输入框使用正则表达式校验输入内容的实例
2017/02/12 Javascript
vue.js指令v-model使用方法
2017/03/20 Javascript
JS获取url参数,JS发送json格式的POST请求方法
2018/03/29 Javascript
vue.js中npm安装教程图解
2018/04/10 Javascript
Vue页面骨架屏的实现方法
2018/05/22 Javascript
Vue函数式组件-你值得拥有
2019/05/09 Javascript
详解Vue3.0 前的 TypeScript 最佳入门实践
2019/06/18 Javascript
python装饰器实例大详解
2017/10/25 Python
python将秒数转化为时间格式的实例
2018/09/16 Python
详解Appium+Python之生成html测试报告
2019/01/04 Python
在pycharm中显示python画的图方法
2019/08/31 Python
详解Selenium 元素定位和WebDriver常用方法
2020/12/04 Python
canvas实现手机的手势解锁的步骤详细
2020/03/16 HTML / CSS
上海奥佳笔试题面试题
2016/11/16 面试题
助人为乐表扬信范文
2014/01/14 职场文书
运动会广播稿60字
2014/01/15 职场文书
5s标语大全
2014/06/23 职场文书
2014年变电站工作总结
2014/12/19 职场文书
同学毕业留言寄语
2015/02/27 职场文书
酒店收银员岗位职责
2015/04/07 职场文书
Consul在linux环境的集群部署
2022/04/08 Servers