MongoDB php驱动程序,脚本在插入数据时结束


MongoDB php driver, script ends when inserting data

我玩MongoDB和我试图导入。csv文件到DB和我得到奇怪的错误。在上传脚本的过程中,没有理由结束,当我试图再次运行它时,没有任何事情发生,唯一的解决方案是重新启动apache。我已经在php.ini中设置了无限超时,下面是脚本:

$dir = "tokens/";
$fileNames = array_diff( scandir("data/"), array(".", "..") );
foreach($fileNames as $filename)
    if(file_exists($dir.$filename))
        exec("d:'mongodb'bin'mongoimport.exe -d import -c ".$filename." -f Date,Open,Next,Amount,Type --type csv --file ".$dir.$filename."");

我得到了大约7000个。csv文件,它在脚本结束前只插入了大约200个。

有人能帮忙吗?

您缺少后端基础设施。试图将7000个文件作为web请求的一部分加载到数据库中,这是非常疯狂的,并且对于一些软件组件和最终用户来说,这应该是短暂的,并且只持续几秒钟或一分钟。

相反,为这个过程创建一个后端服务以及命令和控件。在web应用程序中,将每个要处理的文件名写入服务器上的数据库表甚至纯文本文件,然后告诉最终用户他们的请求已排队,并将在接下来的NN分钟内处理。然后有一个cron作业,每5分钟(甚至1分钟)运行一次,在正确的地方寻找要做的事情,可以创建成功或失败的报告和/或发送电子邮件告诉原始请求者它已经完成。

如果这是一个导入脚本,并且您打算使用PHP,那么最好至少使用PHP CLI环境,而不是通过web服务器执行此任务。就目前情况而言,CSV文件似乎位于服务器本身,因此我认为没有理由使用HTTP。这将避免web请求终止并突然中止导入过程的问题。

要处理CSV,我将首先查看fgetcsv或str_getcsv。mongoimport命令在验证和清理方面做得很少。自己解析CSV将允许您跳过缺少字段的记录,在必要时提供默认值,或采取其他适当的操作。在遍历记录时,可以收集文档以插入到数组中,然后将结果批量传递给MongoCollection::batchInsert()。驱动程序将负责将大批量拆分为块,以16MB的消息通过网络发送(MongoDB的文档大小限制,这也适用于有线协议通信)。