我正在使用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 ));
//[...]
?>
其次我想知道是否可以在后台执行请求?当我使用此查询存储文件时,执行被阻止,由于超时
我收到错误500PHP致命错误:未捕获异常'MongoGridFSException' 消息'无法存储文件:光标超时(超时:30000,时间 left:0:0,status:0)'
答案 0 :(得分:0)
将文件存储在某个目录中可能会更好,并且只将该文件的位置放在数据库中?它会很快。
答案 1 :(得分:0)
默认情况下,Gridfs查询不是“安全的”,但它们不是驱动程序中的单个查询。此函数必须在驱动程序中运行多个查询(一个用于存储fs.files
行,另一个用于分割fs.chunks
)。这意味着超时很可能发生在处理更多批信息所需的find
上,甚至可能与PHP tiemout而不是MongoDB相关。
在后台使用它的最简单方法是通过调用cronjob或使用消息队列来创建“作业”。
至于超时;不幸的是,gridfs函数(在你身边)没有直接访问正在使用的游标(除了设置安全),你可以在连接上设置超时,但我不认为这是一个明智的想法。
但是,如果你的光标超时,那就意味着(正如我所说的)find
查询可能需要太长时间,在这种情况下你可能想监视MongoDB日志以找出什么是超时,这可能只是需要更好的索引或更高效的设置的简单案例。
正如@Anton所说,你也可以考虑在MongoDB之外存放大文件,但是没有要求。