注意:在 Unix 平台上,此擴充功能對於使用 fork() 系統呼叫卻未呼叫 exec() 的腳本很敏感。建議使用者不要在 fork 的子行程中重複使用 MongoDB\Driver\Manager 執行個體。
自 1.2.0 版以來,所有版本的擴充功能都會在 PHP worker 程序中持續保存 » libmongoc 用戶端物件,這讓它可以在多個請求之間重複使用資料庫連線、驗證狀態 *和* 拓撲資訊。
當呼叫 MongoDB\Driver\Manager::__construct() 時,會從其引數(即 URI 字串和陣列選項)建立雜湊值。擴充功能會嘗試找到先前為該雜湊值保存的 » libmongoc 用戶端物件。如果找不到現有的用戶端物件,則會建立一個新的用戶端物件並保存以供將來使用。可以透過 "disableClientPersistence"
驅動程式選項停用此行為。
每個用戶端都包含自己的資料庫連線和伺服器拓撲的視圖(例如獨立伺服器、複寫集、分片叢集)。透過在 PHP 請求之間保存用戶端,擴充功能可以重複使用已建立的資料庫連線,並且無需在每個請求上都 » 探索伺服器拓撲。
請參考以下範例
<?php
$managers = [
new MongoDB\Driver\Manager('mongodb://127.0.0.1'),
new MongoDB\Driver\Manager('mongodb://127.0.0.1'),
new MongoDB\Driver\Manager('mongodb://127.0.0.1:27017'),
new MongoDB\Driver\Manager('mongodb://rs1.example.com,rs2.example.com/', ['replicaSet' => 'myReplicaSet']),
];
foreach ($managers as $manager) {
$manager->executeCommand('test', new MongoDB\Driver\Command(['ping' => 1]));
}
?>
前兩個 Manager 物件將共用同一個 » libmongoc 用戶端,因為它們的建構函式引數相同。第三個和第四個物件將各自使用自己的用戶端。總共將建立三個用戶端,執行此指令碼的 PHP worker 將開啟兩個到 127.0.0.1
的連線,以及一個到 rs1.example.com
和 rs2.example.com
各一個的連線。如果擴充功能在發出 hello
命令後發現複寫集的其他成員,它也會開啟與這些伺服器的其他連線。
如果同一個 worker 在第二個請求中再次執行指令碼,則會重複使用這三個用戶端,並且不會建立新的連線。根據前一個請求的處理時間,擴充功能可能需要發出額外的 hello
命令來更新其拓撲視圖。
1.2.0 之前的擴充版本使用 PHP 的 Streams API 進行資料庫連線,並利用 » libmongoc 中的 API 來指定 socket 通訊的客製化處理器;然而,每個 MongoDB\Driver\Manager 都會建立一個新的 libmongoc 用戶端。因此,擴充功能會維持個別的資料庫連線,但不會維持驗證狀態或拓撲資訊。這表示擴充功能需要在每個請求開始時發出命令來進行驗證和 » 探索伺服器拓撲。
資料庫連線會透過一個雜湊值來維持,該雜湊值衍生自伺服器的主機、埠以及用於建構 MongoDB\Driver\Manager 的 URI 字串。建構器的陣列選項不包含在此雜湊值中。
注意:版本 >= 1.1.8 且 < 1.2.0 的擴充功能不會維持 SSL 連線的 sockets。有關更多資訊,請參閱 » PHPC-720。
儘管在維持 SSL 連線和拓撲資訊方面存在一些缺點,但由於此版本的擴充功能使用 PHP 的 Streams API,因此它支援所有 SSL 內容選項。