是否有可能让 Mongo PHP 扩展抛出异常,比如 PDO 的 PDO::ERRMODE_EXEPTION


Is it possible to make the Mongo PHP extension throw Exceptions, like PDO's PDO::ERRMODE_EXEPTION?

我宁愿我的程序早点失败,如果我忽略了对某些东西的错误检查,我就会失败。不幸的是,Mongo扩展要求我不断检查MongoDb->lastError()。有没有一种简单的方法可以模拟 Mongo 的array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXEPTION)

最好是不涉及为所有内容编写包装类的东西,我宁愿只在绝对必要的情况下这样做。

Mongo扩展要求我不断检查MongoDb->lastError()

所以这里实际发生的事情更微妙一些。

默认情况下,MongoDB以"即发即弃"模式运行。因此,它向服务器发送写入(触发),然后简单地相信服务器会处理它(忘记)。这是所有驱动程序的所有写入的默认配置。

您需要

例外,因此您需要在"安全"模式下发布更新。在安全模式下,驱动程序在将控制权返回给调用方之前自动发出 lastError() 命令。

您可以在单个操作上设置安全模式:

$collection->insert(array("x" => 1), array("safe" => true));

驱动程序应支持在连接级别设置此项,但由于某种原因不支持。因此,您将不得不在任何地方添加该array('safe' => true)

最好是不涉及为所有内容编写包装类的东西......

不幸的是,我认为这是不可避免的。"安全"模式只是一个开始。在"安全"模式下,只能保证提交到主服务器上的内存。如果要确保数据在磁盘上,则需要使用"fsync"或"journal"。如果您正在运行副本集,并且想要确保数据位于两个位置,则需要使用一些"w"选项。

此外,如果您使用的是副本集(10gen 建议用于所有生产部署),则必须在主数据库出现故障时处理异常。通常,您希望重试连接,因为打开新连接应强制与新主连接建立新连接。

这以及许多其他调整通常意味着您的代码将转变为需要某种类型的包装类,因为您需要处理各种异常情况。

不,这目前是不可能的。请为此在 http://jira.mongodb.org 提交功能请求。