【问题标题】:How to use uri with database name in php mongodb library如何在 php mongodb 库中使用带有数据库名称的 uri
【发布时间】:2017-03-22 01:21:18
【问题描述】:

我可能在这方面花费的时间比我应该的要多。 我正在使用 heroku 来部署 php & mongodb 应用程序。

Heroku mLab 通过 getenv('MONGODB_URI') 提供 php 中可访问的环境变量 MONGODB_URI,其中包含标准 MongoDBURI,例如:

mongodb://<dbuser>:<dbpassword>@dsxxxxxx.mlab.com:31899/heroku_lxxxxxx

其中已经包含现有的数据库名称,但是 php mongodb 库教程建议不使用它的连接字符串:

$client = new MongoDB\Client("mongodb://localhost:27017");
$collection = $client->demo->beers;

所以问题是我可以以某种方式使用默认 heroku 的 MONGODB_URI 字符串,或者我必须 parse_uri 它然后单独提供给 php。

【问题讨论】:

  • 您是否尝试过使用 mlab 连接字符串创建客户端? php.net/manual/en/mongoclient.construct.php。顺便说一句,您应该使用最新的 php 驱动程序。 php.net/manual/en/mongodb-driver-manager.construct.php
  • 是的,我已经创建了客户端,但是我仍然需要解析 uri 以提取 dbname 并手动选择它,因为它已经传递给客户端构造函数。
  • 这是身份验证数据库作为 URI 的一部分。您只需连接到保存您的收藏的数据库。类似$db = $client-&gt;selectDB("dbname"); $collection = $db-&gt;collectionname

标签: php mongodb heroku mlab


【解决方案1】:

首先你需要了解字符串 'mongodb://localhost:27017' 是什么。它基本上告诉驱动程序连接到在 localhost 的 27017 端口上运行的 mongodb 服务器,无需身份验证。那相当简单。现在 heroku 管理你的数据库,它托管在单独的服务器上并且需要授权,所以新代码应该是

$client = new MongoDB\Client("mongodb://<dbuser>:<dbpassword>@dsxxxxxx.mlab.com:31899/heroku_lxxxxxx");

现在上面所说的又是错误的,因为用户名和密码甚至主机将来可能会发生变化,而您不想仅仅因此而在代码库中进行更改。这就是为什么环境变量来救援。使用 php getenv 方法从 heroku 实例中获取字符串。我不知道变量的确切名称,但您可以从文档中获取,最后在初始化 mongodb 驱动程序时传递该字符串。

编辑

刚刚注意到你在问题中提到了MONGODB_URI,所以代码是

$mongoHost = getenv('MONGODB_URI');
$client = new MongoDB\Client($mongoHost);

【讨论】:

  • 嗨,georoot!是的,我明白这一点并且有类似的代码,但我现在如何访问收藏?在 php doc 示例中,它们具有类似 $collection = $client->{$dbname}->{$collectionname} 的行。如果我将 dbname 传递给客户端构造函数,那我该怎么办?
  • 查看文档php.net/manual/en/class.mongodb.php 。文档中的 $m 与此处的 $client 相同。
  • 所以还是需要先解析uri来分离dbname?我确实知道这只是 1-2 行代码,但它只是感觉不对,只要旧的 Mongo php 扩展没有必要。
猜你喜欢
  • 2018-09-09
  • 2022-07-22
  • 1970-01-01
  • 2014-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多