PHP 日本會議 2024

OCI8 連線處理與連線池

連線函式

OCI8 擴充提供三種不同的函式來連線到 Oracle。標準連線函式是 oci_connect()。這會建立到 Oracle 資料庫的連線,並傳回後續資料庫呼叫所使用的資源。

連線到 Oracle 伺服器在完成所需的時間方面是相當耗費資源的操作。oci_pconnect() 函式使用持續性連線快取,可在不同的腳本要求中重複使用。這表示連線額外負荷通常只會發生在每個 PHP 程序 (或 Apache 子程序) 一次。

如果應用程式為每個網路使用者使用一組不同的資料庫認證連線到 Oracle,則 oci_pconnect() 使用的持續性快取將隨著並行使用者數量的增加而變得較不有用,甚至會因為維護過多的閒置連線而開始對 Oracle 伺服器的整體效能產生負面影響。如果應用程式以這種方式架構,建議使用 oci8.max_persistentoci8.persistent_timeout 設定 (這將控制持續性連線快取大小和生命週期) 來調整應用程式,使用 Oracle 資料庫常駐連線池 (在 Oracle 資料庫 11g 或更新版本中),或改用 oci_connect()

oci_connect()oci_pconnect() 都使用連線快取;如果對 oci_connect() 的多次呼叫在給定的腳本中使用相同的參數,則第二次和後續呼叫會傳回現有的連線控制代碼。oci_connect() 使用的快取會在腳本執行結束時或明確關閉連線控制代碼時清除。函式 oci_pconnect() 具有類似的行為,儘管其快取是單獨維護的,並且在 HTTP 要求之間保留。

此快取功能表示這兩個控制代碼在事務上不是隔離的 (它們實際上是相同的連線控制代碼,因此沒有任何形式的隔離)。如果應用程式需要兩個單獨的、事務隔離的連線,則使用 oci_new_connect()

當 PHP 程序終止時,oci_pconnect() 快取會被清除,並且所有資料庫連線都會關閉,因此有效使用持續性連線需要 PHP 作為 Apache 模組或與 FPM 或類似模組一起使用。當 PHP 與 CGI 或透過命令列一起使用時,持續性連線將不會比 oci_connect() 有任何優勢。

函式 oci_new_connect() 始終會建立到 Oracle 伺服器的新連線,而無論可能已存在其他哪些連線。高流量網路應用程式應避免使用 oci_new_connect(),尤其是在應用程式最繁忙的部分。

使用者可以關閉持續性連線,從而更好地控制連線資源的使用。當沒有 PHP 變數參考它們時,例如在 PHP 使用者函式的範圍末尾,持續性連線現在也會自動關閉。這將回滾任何未提交的交易。這些對持續性連線的變更使其行為類似於非持續性連線,簡化了介面,允許更高的應用程式一致性和可預測性。使用設定為Onoci8.old_oci_close_semantics 來保留歷史行為。

在 Apache 或 FPM 程序重新產生後自動重新建立 PHP 持續性連線表示,僅建議將 Oracle 資料庫 LOGON 觸發程式用於設定 Session 屬性,而不建議用於每個應用程式的使用者連線要求。

DRCP 連線池

PHP 支援 Oracle 資料庫常駐連線池 (DRCP)。DRCP 可以更有效地使用資料庫機器記憶體,並提供高擴充性。使用 DRCP 不需要或僅需最少的應用程式變更。

DRCP 適用於使用少數資料庫結構描述連線並將資料庫連線保持開啟一小段時間的應用程式。其他應用程式應使用 Oracle 的預設 Dedicated 資料庫伺服器程序,或使用 Shared 伺服器。

DRCP 使所有三個連線函式受益,但在使用 oci_pconnect() 建立連線時,可提供最高的擴充性。

為了使 OCI8 中可以使用 DRCP,PHP 使用的 Oracle 用戶端程式庫和 Oracle 資料庫的版本都必須為 11g 或更高版本。

DRCP 的文件可以在多個 Oracle 手冊中找到。例如,請參閱 Oracle 文件中的 » 設定資料庫常駐連線池,以取得使用資訊。» DRCP 白皮書包含 DRCP 的背景資訊。

若要使用 DRCP,請安裝 OCI8 擴充和 Oracle 11g (或更新版本) 程式庫,然後依照下列步驟操作

  • 以特權資料庫管理員身分,使用 SQL*Plus 之類的程式來啟動資料庫中的連線池

        SQL> execute dbms_connection_pool.start_pool;
    

  • 選擇性地使用 dbms_connection_pool.alter_param() 來設定 DRCP 設定。可以從 DBA_CPOOL_INFO 檢視查詢目前的集區設定。

  • 更新使用的連線字串。對於目前使用網路連線名稱 (例如 MYDB) 連線的 PHP 應用程式

        $c = oci_pconnect("myuser", "mypassword", "MYDB");
    

    修改 tnsnames.ora 檔案並新增 (SERVER=POOLED) 子句,例如

        MYDB = (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=myhost.dom.com)
               (PORT=1521))(CONNECT_DATA=(SERVICE_NAME=sales)
               (SERVER=POOLED)))
    

    或者,修改 PHP 中的 Easy Connect 語法,並在服務名稱後新增 :POOLED

        $c = oci_pconnect("myuser", "mypassword", "myhost.dom.com:1521/sales:POOLED");
    

  • 編輯 php.ini 並選擇連線類別名稱。此名稱表示連線池的邏輯劃分,可用於隔離單獨應用程式的集區。任何具有相同使用者名稱和連線類別值的 PHP 應用程式都可以在集區中共用連線,從而提高擴充性。

        oci8.connection_class = "MY_APPLICATION_NAME"
    

  • 執行應用程式,連線到 11g (或更新版本) 資料庫。

注意:

使用 Oracle 用戶端程式庫 10g 且需要持續性連線效能的應用程式可以使用 Oracle Shared 伺服器 (以前稱為多執行緒伺服器) 來減少所需的資料庫伺服器記憶體量。請參閱 Oracle 文件以取得資訊。

注意:

透過 DRCP 連線變更密碼將會失敗,並顯示錯誤ORA-56609: Usage not supported with DRCP。這是 Oracle 資料庫 11g 的文件限制。

新增註解

使用者貢獻的註解

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