【问题标题】:How to insert large files in gridfs with php如何使用php在gridfs中插入大文件
【发布时间】:2012-10-21 23:01:13
【问题描述】:

我正在使用 mongodb 在 php 中编写一个 Web 应用程序,我想用 gridfs 存储非常大的文件 (1gb)。

我有两个问题,首先我遇到了超时,我不知道如何设置 MongoGridFS 类的光标超时。

  <?php
  //[...]
  $con = new Mongo();
  $db = $con->selectDB($conf['base']);
  $grid = $db->getGridFS();

  $file_id = $grid->storeFile($_POST['projectfile'], 
                  array('metadata' => array('type' => 'release', 
                  'version' => $query['files'][$time]['version'], 
                  'mime' => mime_content_type($_POST['projectfile']),
                  'filename' => file_name($projectname).'-'.file_name($query['files'][$time]['version']).'.'
                  .getvalue(pathinfo($_POST['projectfile']), 'extension'))), array( 'safe' => false ));
  //[...]
  ?>

其次,我想知道是否可以在后台执行请求?当我使用此查询存储文件时,执行被阻止,并且由于超时而出现错误 500

PHP 致命错误:未捕获的异常“MongoGridFSException”与 消息'无法存储文件:光标超时(超时:30000,时间 左:0:0,状态:0)'

【问题讨论】:

    标签: php mongodb gridfs


    【解决方案1】:

    默认情况下,Gridfs 查询不是“安全的”,但它们不是驱动程序中的单个查询。此函数必须在驱动程序中运行多个查询(一个用于存储fs.files 行,一个用于拆分fs.chunks)。这意味着超时很可能发生在需要处理更多批次信息的find 上,它甚至可能与 PHP tiemout 而不是 MongoDB 相关。

    在后台使用它的最简单方法是通过调用 cronjob 或使用消息队列到另一个服务来创建“作业”。

    至于超时;不幸的是,gridfs 函数(在您这边)无法直接访问正在使用的光标(除了设置安全),您可以在连接上设置超时,但我认为这不是一个明智的主意。

    但是,如果您的光标超时,这意味着(正如我所说)find 查询可能花费的时间太长,在这种情况下,您可能想要监控 MongoDB 日志以找出超时的原因,这可能只是需要更好的索引或更高性能的设置的简单案例。

    正如@Anton 所说,您也可以考虑在 MongoDB 之外存放大文件,但是,没有要求。

    【讨论】:

    • 查看日志后,mongo 在一系列这样的情况下返回超时:getmore db.fs.chunks cid:4130855842018803829 ntoreturn:0 query: { query: { files_id: ObjId(509286b2fbd7cf6750000002) }, orderby: { files_id: 1, n: 1 } } bytes:1048860 nreturned:4 104ms
    • @Goldy 嗯,它似乎在获取所有块时超时。您可以检查fs.chunks 集合上的索引并将其添加到问题中吗?还要检查您的防火墙设置,并确保光标不会因必须重新发送数据而超时
    • @Goldy 您可能会遇到 fs 块的默认大小为 256kb 的问题,这会使您的块集合中有 40K 行。如果你将它增加到 16meg,它可能会帮助只制作 64 行。
    • 我的 mongodb 版本最多只能有 4meg,所以这是不可能的……我将复制磁盘上的文件。
    • @Goldy 是的,你使用的是非常旧的 MongoDB,我强烈建议升级,这个查询实际上可能适用于最新版本。
    【解决方案2】:

    将您的文件存储在某个目录中,并将该文件的唯一位置放入数据库中会更好吗?会比较快。

    【讨论】:

      猜你喜欢
      • 2010-10-04
      • 2014-04-28
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      相关资源
      最近更新 更多