文档章节

php7 mongodb gridfs操作

k
 kongzong
发布于 2016/06/29 17:10
字数 693
阅读 381
收藏 1

php7性能大幅提升,吸引了不少开发者升级,升级面临的问题不少,mongodb的支持就是其中之一

 

php7使用了新的mongdb驱动:

http://php.net/manual/en/set.mongodb.php

如果仅仅使用驱动封装的类及方法非常的不方便,所以还必须借助另一个项目:

http://php.net/manual/en/mongodb.tutorial.library.php

 

mongo-php-library对应的文档有:

 文档:  http://mongodb.github.io/mongo-php-library/

  API:  http://mongodb.github.io/mongo-php-library/api/

 

mongo-php-library目前的最新版本是1.0.2,这个版本还不支持gridfs的操作。

但是从

https://jira.mongodb.org/browse/PHPLIB/?selectedTab=com.atlassian.jira.jira-projects-plugin:roadmap-panel

roadmap上已经指出将支持gridfs,但是发布日期没有确定

Epic

 

从Github(https://github.com/mongodb/mongo-php-library)代码上看,/src/GridFS下一直都有更新

 

仔细阅读了一下代码

  1. 对GridFS的封装是基于Stream的方式,所以api和旧驱动的GridFS有很大的区别。
  2. 代码总体已经趋于稳定,剩下的TODO都是优化性质的代码居多

 

为了在发布后能很快实现迁移,我想已经完全可以进行开发测试了。

 

经过一番试验,记录一些要点如下:

 

1.既然是迁移,旧代码对GridFS的调用希望尽可能的不用修改,所以可以封装一个MongoDB\GridFS\Bucket的子类,在子类里封装旧版本GridFS的一些常用方法

class MyGridFS extends MongoDB\GridFS\Bucket
{
    //旧驱动有findOne方法,metadata均放在返回对象的file属性以数组方式存放
    function findOne($filename)
    {
        $ret = new stdClass();
        $file = array();
        $o=$this->getCollectionWrapper()->findFileByFilenameAndRevision($filename,0);

        if ($o==NULL) return NULL;

        $file['md5'] = $o->md5;
        $file['length'] = $o->length;
        $file['filename'] = $o->filename;
        $file['chunkSize'] = $o->chunkSize;
        $file['_id'] = $o->_id;
        $file['uploadDate'] = $o->uploadDate;

        $ret->file = $file;
        return $ret;   
    }

    //旧的驱动可以将文件字节字符串直接存入gridfs,新的不再支持,所以变通先存入一个临时文件,然后再打开临时文件的stream进行写入
    //为了提高性能,临时文件所在目录最好为基于内存
    function storeBytes($bytes,$metadata)
    {
        $filename = $metadata['filename'];       
        if (!$filename) return false;

        $tmpfile = WORK_TEMP_PATH.md5($filename.time());
        file_put_contents($tmpfile,$bytes);

        $handle = fopen($tmpfile, "r");
        $this->uploadFromStream($filename,$handle);
        @unlink($tmpfile);
    }

    function storeFile($filepath,$metadata)
    {
        $filename = $metadata['filename'];       
        if (!$filename) return false;

        $handle = fopen($filepath, "r");
        $this->uploadFromStream($filename,$handle);
    }   

    function getBytes($filename,array $options = [])
    {
        $resource = $this->openDownloadStreamByName($filename,$options);
        return stream_get_contents($resource);       
    }
}

 

2.  实例化grid对象,实际上就是Bucket

     $this->grid= new MyGridFS($manage,$dbname,array('bucketName '=>$bucketName));

     注意,构造函数第一个参数必须是 MongoDB\Driver\Manager(驱动自带),不能是mongo-php-library带的MongoDB\Client,这有点难以理解,可能考虑了GridFS这部分能从mongo-php-library独立出来吧。

 

3.findOne里getCollectionWrapper()->findFileByFilenameAndRevision($filename,0); 返回对象里的uploadDate已经不再是MongoDate,而是 MongoDB\BSON\UTCDateTime,所以要取出上传时的时间戳方法要修改:

$o->file['uploadDate']->sec   修改成  $o->file['uploadDate']->toDateTime()->getTimestamp()

 

暂时就这么多!

 

 

 

© 著作权归作者所有

k
粉丝 1
博文 9
码字总数 8383
作品 0
朝阳
程序员
私信 提问
Java MongoDB : Save image example

Java MongoDB : Save image example In this tutorial, we show you how to save an image file into MongoDB, via GridFS API. The GridFS APIs are able to serve other binary files as w......

引鸩怼孑
2015/05/22
274
0
基于GridFS+NGinx构建分布式文件系统 之实战(三)

基于GridFS构建分布式文件系统 首先看看什么是GridFS: GridFS is a mechanism for storing large binary files in MongoDB. There are several reasons why you might consider using GridF......

一枚Sir
2014/06/20
5K
1
浅尝辄止MongoDB:GridFS

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/82894835 一、为什么使用GridFS GridFS是MongoDB的一个子模块,使用GridFS可以基于M...

wzy0623
2018/09/29
0
0
MongoDB进阶系列(13)——GridFS大文件的添加、获取、查看、删除

GridFS是一种在MongoDB中存储大二进制文件的机制,使用GridFS的原因有以下几种: 存储巨大的文件,比如视频、高清图片等。 利用GridFS可以简化需求。 GridFS会直接利用已经建立的复制或分片机...

HappyBKs
2015/03/17
1K
0
MongoDB系列教程(八):GridFS存储详解

MongoDB系列教程(八):GridFS存储详解 GridFS简介 mongoDB的文档以BSON格式存储,支持二进制的数据类型,当我们把二进制格式的数据直接保存到mongoDB的文档中。但是当文件太大时,例如图片...

开元中国2015
2015/07/25
390
0

没有更多内容

加载失败,请刷新页面

加载更多

VMware vSphere ESXi主机的访问控制

在vShpere中,访问ESXi主机的途径很多,如下: ESXi DCUI ESXi Shell ESXi SSH ESXi Host Client vCenter --> vSphere web client / vSphere Client VMware vSphere ESXi主机的访问控制,除了......

大别阿郎
24分钟前
3
0
大神讲解CGI、FastCGI和PHP-FPM关系图解

参考资料 概念了解:CGI,FastCGI,PHP-CGI与PHP-FPM:http://www.nowamagic.net/librarys/veda/detail/1319 php中fastcgi和php-fpm是什么东西:https://www.zybuluo.com/phper/note/50231 ......

网络小虾米
33分钟前
3
0
《DNS攻击防范科普系列3》 -如何保障 DNS 操作安全

引言 前两讲我们介绍了 DNS 相关的攻击类型,以及针对 DDoS 攻击的防范措施。这些都是更底层的知识,有同学就来问能否讲讲和我们的日常操作相关的知识点,今天我们就来说说和我们日常 DNS 操...

Mr_zebra
33分钟前
3
0
zk中ServerCnxn

实现接口Stats, Watcher 内部类 DisconnectReason CloseRequestException EndOfStreamException(流关闭) 属性 方法 getSessionTimeout 获取session失效时间 sendResponse 发送回复数据 se......

writeademo
38分钟前
3
0
如何将 Redis 用于微服务通信的事件存储

来源:Redislabs 作者:Martin Forstner 翻译:Kevin (公众号:中间件小哥) 以我的经验,将某些应用拆分成更小的、松耦合的、可协同工作的独立逻辑业务服务会更易于构建和维护。这些服务(也...

中间件小哥
42分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部