[英]Why doesn't PHP's oci_connect return false?
我遇到的情況是,我們有兩個彼此同步的生產數據庫。 服務器一被認為是主要的。 有時由於維護或災難,服務器二將成為主要服務器。
在我們的某些代碼中,這意味着我們必須手動進入並編輯數據庫連接的服務器名稱。 我覺得這很煩人,所以我寫的最后一件事是將兩者的服務器信息放在一起並建立一個循環。 如果oci_connect在服務器1上失敗3次,則將繼續進行到服務器2。 如果服務器2失敗3次,它將通知用戶無法建立連接。
在大多數情況下,當我們遇到切換服務器的情況時,這種方法都可以正常工作。 例如,昨天效果很好。 今天沒有。 它只是坐着不停地旋轉。 PHP錯誤日志中沒有錯誤。 繼續前進沒有失敗。 沒有錯誤輸出到屏幕。 5分鍾沒事。
因此,我不得不手動編輯愚蠢的配置文件。
我問可能有什么不同,然后我被告知“昨天數據庫已關閉,但服務器未關閉。今天服務器已關閉。” 好的...? 但是我看不出任何區別。 如果無法與服務器建立任何形式的通信,我希望oci_connect返回false。 我希望它超時和錯誤。 當它從服務器接收到錯誤代碼時,不僅要傳遞它。 例如,如果出現網絡問題怎么辦?
這是oci_connect中的錯誤,還是我們的PHP配置中的某些內容使oci_connect瘋狂地超時?
如果這是一種“錯誤”,是否可以通過某種方式檢查服務器是否先啟動? 像平嗎? (當然,當我通過命令提示符執行ping操作時,我從服務器One收到了響應,然后被告知“現在又回來了”,盡管我對此表示懷疑。)
無論如何,如果有人能闡明oci_connect為什么可以不失敗地無限運行,以及如何阻止它繼續運行,我將不勝感激。
-編輯:我的代碼僅在某些循環中才看起來像PHP.net上的示例。
$count = count($servers);
for($i = 0; $i < $count; $i++){
if((!isset($connection)) || ($connection == false)){
// Attempt to connect to the oracle database
$connection = @oci_connect($servers[$i]["user"], $servers[$i]["pass"], $servers[$i]["conid"]) or ($conn_error = oracle_error());
// Try again if there was a failure
if(($connection == false) || (isset($con_error))){
// Three (two more) tries per alternative
for($j = $st; $j < $fn; $j++){
// Try again to connect
$connection = @oci_connect($servers[$i]["user"], $servers[$i]["pass"], $servers[$i]["conid"]) or ($conn_error = oracle_error());
} // for($j = 2; $j < 4; $j++)
} // if($connection == false)
} // if(!isset($connection) || ($connection == false))
} // for($i = 0; $i < $count; $i++)
您可以驗證它沒有返回false嗎? 等待連接時可能只是阻塞了嗎? (如果執行var_dump(oci_connect(...))
什么?
直接來自php.net的文檔 :
如果要在出現網絡問題時指定連接超時,則可以編輯客戶端(例如PHP端)的sqlnet.ora文件並設置SQLNET.OUTBOUND_CONNECT_TIMEOUT。 這設置了建立到數據庫的連接的上限時間,包括嘗試連接到其他服務的時間。 從Oracle 10.2.0.3起可以使用它。
在Oracle 11.1中,引入了一個重量更輕的解決方案TCP.CONNECT_TIMEOUT。 它也是sqlnet.ora參數。 它僅限制TCP連接的建立時間,這主要是在出現連接問題的地方。
客戶端sqlnet.ora文件應與tnsnames.ora文件放在同一目錄中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.