php 代码中的 Mongoimport shell 查询

Mongoimport shell query in php code

如何使用 PHP 代码执行 mongoimport / mongoexport (shell) 查询?我试过使用 exec()、shell_exec()、system()、passthru() 命令。 None 其中用于从程序级别执行此类查询代码。

我的代码:

$result = exec('mongoimport --host hostname --db mycoll
--collection mycoll --type json --file /home/xxx/filename.json --jsonArray 2>&1  ',$outputArray);  
print_r($outputArray);

注意:通过在命令中添加 2>&1 来检查 error_reporting。遇到这些错误:

mongoimport: /opt/lampp/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by mongoimport)
mongoimport: /opt/lampp/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by mongoimport)
mongoimport: /opt/lampp/lib/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by mongoimport)
mongoimport: /opt/lampp/lib/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by /usr/lib/libboost_thread.so.1.46.1)
mongoimport: /opt/lampp/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by /usr/lib/libboost_program_options.so.1.46.1)
mongoimport: /opt/lampp/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by /usr/lib/libboost_program_options.so.1.46.1)

如果在终端中执行相同的查询,则会将 json 数据导入我的 mongo 集合。如何解决这些版本问题以便通过 php 代码导入此查询?

我刚刚在 ubuntu 14、PHP 7、MongoDB v3.4(for mongoimport) 上测试了你上面的代码示例,它运行没有问题。

根据您发布的输出,PHP 似乎正在使用 /opt/lampp/lib/libstdc++.so.6 的环境执行 mongoimport。此文件版本可能太旧,未定义 GLIBCXX_3.4.x 版本。

The same query if executed in terminal imports json data to my mongo collection.

这很可能是因为您使用了不同的 libstdc++.so.6。例如:/usr/lib/libstdc++.so.6 可能符合 GLIBCXX 标准。

您可以通过以下命令 运行 找出 shell 上正在使用哪个 libstdc++

/sbin/ldconfig -p | grep stdc++

可能的解决方案:

  1. 删除 /opt/lampp/lib/libstdc++.so.6 并使用您的工作 libstdc++.so.6
  2. 在 PHP 中取消设置 LD_LIBRARY_PATH,以便您的系统安装执行源 libstdc++
  3. 如果您安装的 LAMPP 是旧的,请卸载并重新安装到 reset/update libstdc++

另一种方法是不调用外部脚本mongoimport。而是编写 PHP 代码来读取 JSON 文件并使用 MongoDB PHP library to insert documents. See Tutorials: Insert Documents。 例如,您可以迭代读取 json 文件,如下所示:

$data = fopen("/home/xxx/filename.json", "r");
while(($line = fgets($data)) !== false) {
    $json = json_decode($line, true);
    print_r($json); 
    //Add logic to insert document to MongoDB.
}
fclose($data);