php7 mongodb gridfs操作

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()

 

暂时就这么多!

 

 

 

转载于:https://my.oschina.net/u/783079/blog/702817

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值