2024 年日本 PHP 研討會

連線處理和持久化

注意在 Unix 平台上,此擴充功能對於使用 fork() 系統呼叫卻未呼叫 exec() 的腳本很敏感。建議使用者不要在 fork 的子行程中重複使用 MongoDB\Driver\Manager 執行個體。

連線和拓撲持續性(PHP 1.2.0 以後的版本)

自 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.comrs2.example.com 各一個的連線。如果擴充功能在發出 hello 命令後發現複寫集的其他成員,它也會開啟與這些伺服器的其他連線。

如果同一個 worker 在第二個請求中再次執行指令碼,則會重複使用這三個用戶端,並且不會建立新的連線。根據前一個請求的處理時間,擴充功能可能需要發出額外的 hello 命令來更新其拓撲視圖。

通訊端持續性(1.2.0 之前的 PHP 版本)

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 內容選項

新增註解

使用者貢獻的註解

此頁面沒有使用者貢獻的註解。
To Top