如何使用php在gridfs中插入大文件

时间:2012-11-01 11:04:13

标签: php mongodb gridfs

我正在使用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,时间   left:0:0,status:0)'

2 个答案:

答案 0 :(得分:0)

将文件存储在某个目录中可能会更好,并且只将该文件的位置放在数据库中?它会很快。

答案 1 :(得分:0)

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

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

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

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

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