Neden PHP sahte dönmek oci_connect değil mi?

1 Cevap php

Ben diğer biriyle senkronize iki üretim veritabanlarına sahip olduğu bir durum var. Sunucu Bir birincil olarak kabul edilir. Bazen nedeniyle bakım veya bir felaket Server iki birincil olacak.

Demektir bizim kod bazı elle gitmek ve veritabanı bağlantıları için sunucu adını düzenlemek zorunda. Ben bu can sıkıcı buluyorum, bu yüzden yazdım son şey ben hem sunucu bilgileri koymak ve bir döngü kurmak. Oci_connect Server One 3 kez başarısız olursa o Sunucu İki geçmek istiyorum. Sunucu iki 3 kez başarısız olursa, bir bağlantı yapılmış olamazdı kullanıcıya bildirmek istiyorum.

Bu iyi biz sunucuları anahtarlama durumu yaşadım çoğu kez çalıştı. Bugün, örneğin, iyi çalıştı. Bugün öyle değil mi. Bu sadece oturdu ve durmadan döndü. PHP hata günlüğüne hata yok. Dan hareket arıza yok. Ekrana hiçbir hata çıktı. 5 dakika boyunca hiçbir şey.

Öyleyse ben elle aptal yapılandırma dosyasını düzenlemek zorunda kaldı.

Ben muhtemelen farklı olabileceğini sordu ve ben söylendi "veritabanı aşağı dün, ama sunucu. Bugün sunucu aşağı." Tamam ...? Ama ben bir fark görmüyorum. Bu sunucu ile herhangi bir iletişim kurmak tür yapamıyorsam oci_connect return false beklenebilir. Ben o zaman aşımı ve hata beklersiniz. Bu sunucudan bir hata kodunu aldığında sadece geçmek değil. Ne bir ağ sorunu, örneğin, varsa?

Bu oci_connect bir hata veya PHP yapılandırmasında şey bir delice uzun bir zaman aşımı oci_connect verdiği bir olasılık var mı?

Bu "hata" bir tür olup olmadığını sunucunun ilk kadar olup olmadığını görmek için kontrol edebilirsiniz bazı yolu var mı? Bir ping gibi? (Ben komut istemi ile ping yaptım Tabii ki ben bu konuda zamanlama konusunda şüpheci olmama rağmen "şimdi geri geldi", Sunucu Tek bir yanıt var ve sonra söylendi.)

Herkes oci_connect başarısız ve nasıl yapıyor onu tutmak için olmadan durmadan koşmak olabilir neden bazı ışık tutacak eğer neyse, bu yüzden minnettar olurum.

-- Edit: My code looks like the examples on PHP.net only in some loops.

 $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++)

1 Cevap

Eğer yanlış cevap vermiyor doğrulamak miyim? Bir bağlantı için beklerken belki sadece engelliyor? Eğer bunu yaparsanız (ne var_dump(oci_connect(...)) olur?

Sağ php.net 'in dan documentation:

If you want to specify a connection timeout in case there is network problem, you can edit the client side (e.g. PHP side) sqlnet.ora file and set SQLNET.OUTBOUND_CONNECT_TIMEOUT. This sets the upper time limit for establishing a connection right through to the DB, including the time for attempts to connect to other services. It is available from Oracle 10.2.0.3 onwards.

In Oracle 11.1, a slightly lighter-weight solution TCP.CONNECT_TIMEOUT was introduced. It also is a sqlnet.ora parameter. It bounds just the TCP connection establishment time, which is mostly where connection problem are seen.

The client sqlnet.ora file should be put in the same directory as the tnsnames.ora file.

Ayrıca, FAN on this page ... ne istediğinizi tam olarak yapabilir gibi görünüyor kontrol etmek isteyebilirsiniz (ama onunla hiçbir deneyime sahip, bu yüzden sizin için gerçekten emin değilim) .