1

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

我有 2 个问题,首先我遇到了超时,我不知道如何设置 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)”

4

2 回答 2

0

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

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

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

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

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

于 2012-11-01T11:53:09.393 回答
0

将文件存储在某个目录中,并将该文件的唯一位置放入数据库中可能会更好吗?它会相当快。

于 2012-11-01T11:11:05.560 回答