如果我忽略錯誤檢查某些內容,我更喜歡我的程序提前失敗並且難以實現。不幸的是,Mongo延期需要我經常檢查MongoDb->lastError()
。有沒有簡單的方法來模擬Mongo的array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXEPTION)
?是否有可能使Mongo PHP擴展引發異常,例如PDO的PDO :: ERRMODE_EXEPTION?
最好是不涉及爲所有東西寫封裝類的東西,如果我絕對必須的話,我寧願這樣做。
如果我忽略錯誤檢查某些內容,我更喜歡我的程序提前失敗並且難以實現。不幸的是,Mongo延期需要我經常檢查MongoDb->lastError()
。有沒有簡單的方法來模擬Mongo的array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXEPTION)
?是否有可能使Mongo PHP擴展引發異常,例如PDO的PDO :: ERRMODE_EXEPTION?
最好是不涉及爲所有東西寫封裝類的東西,如果我絕對必須的話,我寧願這樣做。
不,目前不可能。請爲此在http://jira.mongodb.org提交功能請求。
蒙戈擴展需要我不斷地檢查
MongoDb->lastError()
那麼什麼實際發生在這裏是一個小更微妙。
默認情況下,MongoDB以「fire and forget」模式運行。所以它發送一個寫入服務器(火),然後簡單地相信服務器將處理它(忘記)。這是所有驅動程序的所有寫入的默認配置。
你需要例外,所以你需要在「安全」模式下發布你的更新。在安全模式下,驅動程序在將控制權返回給調用者之前自動發出lastError()
命令。
您可以在單獨的操作設置安全模式:
$collection->insert(array("x" => 1), array("safe" => true));
駕駛員應支持在連接級別設置此,但由於某種原因沒有。所以你必須在任何地方添加array('safe' => true)
。
最好的東西,不涉及編寫包裝類一切......
不幸的是,我認爲這是不可避免的。 「安全」模式僅僅是一個開始。在「安全」模式下,您只能保證在主服務器上提交內存。如果你想確保數據在磁盤上,你需要使用「fsync」或「journal」。如果您正在運行副本集,並且要確保數據位於兩個位置,則需要使用一些「w」選項。另外,如果您正在使用副本集(,其中10gen建議所有生產部署),那麼當主要發生故障時,您將不得不處理異常。通常,您希望重新嘗試連接,因爲打開新連接應該強制新連接到新的主連接。
這和其他許多調整一起意味着你的代碼將轉移到需要某種類型的包裝類,因爲你需要處理各種異常情況。
我添加了一個問題。謝謝,Derick – Shabbyrobe 2012-04-15 09:36:32
我沒有看到它彈出。你有鏈接嗎? – Derick 2012-04-16 14:56:11
https://jira.mongodb.org/browse/PHP-367 – Shabbyrobe 2012-04-17 01:14:56