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 相关文章推荐
Memcache 在PHP中的使用技巧
Feb 08 PHP
php删除与复制文件夹及其文件夹下所有文件的实现代码
Jan 23 PHP
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
Dec 25 PHP
PHP嵌套输出缓冲代码实例
May 12 PHP
PHP附件下载中文名称乱码的解决方法
Dec 17 PHP
ThinkPHP中html:list标签用法分析
Jan 09 PHP
PHP读取大文件的多种方法介绍
Apr 04 PHP
PHP中session跨子域的三种实现方法
Jul 25 PHP
PHP获取路径和目录的方法总结【必看篇】
Mar 04 PHP
详解PHP神奇又有用的Trait
Mar 25 PHP
PHP实现微信提现(企业付款到零钱)
Aug 01 PHP
phpmyadmin在宝塔面板里进不去的解决方案
Jul 06 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
NT IIS下用ODBC连接数据库
2006/10/09 PHP
php读取文件内容至字符串中,同时去除换行、空行、行首行尾空格(Zjmainstay原创)
2012/07/31 PHP
php自定义时间转换函数示例
2016/12/07 PHP
PHP+Apache实现二级域名之间共享cookie的方法
2019/07/24 PHP
PHP调用接口API封装的例子
2019/10/11 PHP
将光标定位于输入框最右侧实现代码
2012/12/04 Javascript
js 金额格式化来回转换示例
2014/02/23 Javascript
jQuery中:disabled选择器用法实例
2015/01/04 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记9)
2015/12/24 Javascript
详解Angular4中路由Router类的跳转navigate
2017/06/09 Javascript
图解JS原型和原型链实现原理
2020/09/15 Javascript
[53:21]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-CDEC
2014/05/22 DOTA
[01:36]DOTA2完美大师赛趣味视频之与队友相处的十万个技巧
2017/11/19 DOTA
Python基于sftp及rsa密匙实现远程拷贝文件的方法
2016/09/21 Python
python操作mysql数据库
2017/03/05 Python
Python使用正则表达式实现文本替换的方法
2017/04/18 Python
一百行python代码将图片转成字符画
2021/02/19 Python
python 求某条线上特定x值或y值的点坐标方法
2019/07/09 Python
python如何实现不用装饰器实现登陆器小程序
2019/12/14 Python
python super用法及原理详解
2020/01/20 Python
利用python实现凯撒密码加解密功能
2020/03/31 Python
pandas中read_csv、rolling、expanding用法详解
2020/04/21 Python
aws 通过boto3 python脚本打pach的实现方法
2020/05/10 Python
在pycharm中创建django项目的示例代码
2020/05/28 Python
Python sqlalchemy时间戳及密码管理实现代码详解
2020/08/01 Python
C++和python实现阿姆斯特朗数字查找实例代码
2020/12/07 Python
css3实现简单的白云飘动背景特效
2020/10/28 HTML / CSS
英国领先的野生鸟类食品供应商:GardenBird
2018/08/09 全球购物
请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1
2015/07/16 面试题
文言文形式的学生求职信
2013/12/03 职场文书
孝敬父母的活动方案
2014/08/28 职场文书
小学副班长竞选稿
2015/11/21 职场文书
又涨知识了,自律到底多重要?
2019/06/27 职场文书
员工保密协议范本,您一定得收藏!很有用!
2019/08/08 职场文书
python如何正确使用yield
2021/05/21 Python
python内置进制转换函数的操作
2021/06/02 Python