2010-02-23 22 views
10

Mysql_connect() öğesini çağıran eski bir PHP/MySQL uygulamasına sahibim. Mevcut alt kodun tonları, bu bağlantı kullanılarak doğrudan veya sarmalayıcılar aracılığıyla mysql_query() çağrıları yapar.Bir mysql_connect() 'dan bir PHP PDO bağlantısı mı alıyorsunuz?

Uygulamada geliştirdiğim yeni kod için PDO kullanmaya başlamak istiyorum.

Aynı host/user/pass/dbname kimlik bilgilerini kullanarak bir PDO bağlantısı kurarsam, kaputun altında PHP'nin orijinal bağlantıyı yeniden kullanacağı için çok şanslı olabilir miyim? Ya da PHP, sunucuya iki ayrı bağlantı kuracaktır (tamamen anlaşılabilir olsa da, istenmeyen)?

Teşekkürler! İki farklı API kullanıyorsanız (yani, mysql_* ve PDO), PHP iki farklı bağlantı üretecektir.

+0

@Pascal, @VolkerK:.! Tabii ben ikisini de kabul isterdim haber duymak istediğini olmadığı halde mükemmel cevaplar, ... ;-(için teşekkürler tekrar teşekkürler –

cevap

7


Ve bir "kanıt" olarak, bu kod bölümünü ele alalım:

$db = mysql_connect('localhost', 'USER', 'PASSWORD'); 
$pdo = new PDO('mysql://@localhost/astralblog', 'USER', 'PASSWORD'); 
sleep(5); 


iki ayrı bağlantıları neden olur bu Koşu, MySQL sunucusunda - 5 saniye uyuyacaksınız:

mysql> show processlist; 
+----+------------+-----------------+------------+---------+------+-------+------------------+ 
| Id | User  | Host   | db   | Command | Time | State | Info    | 
+----+------------+-----------------+------------+---------+------+-------+------------------+ 
| 41 | astralblog | localhost:46551 | astralblog | Sleep | 188 |  | NULL    | 
| 42 | astralblog | localhost:46552 | astralblog | Sleep | 188 |  | NULL    | 
| 43 | astralblog | localhost  | astralblog | Query | 0 | NULL | show processlist | 
| 64 | astralblog | localhost  | NULL  | Sleep | 4 |  | NULL    | 
| 65 | astralblog | localhost  | NULL  | Sleep | 4 |  | NULL    | 
+----+------------+-----------------+------------+---------+------+-------+------------------+ 
5 rows in set (0,00 sec) 

(söz konusu bağlantıları PHP komut dosyası başladığında ortaya çıktı iki sonuncusu olan ve 5 saniye sonra kayboldu)

8

Her iki uzantı da, kalıcı bağlantı tutamacını saklamak için dahili olarak EG(persistent_list)'u kullanır. Ancak bu liste için farklı kodlar/anahtarlar oluştururlar, böylece ilgili diğer uzantının girişlerini bulamazlar.

mysql uzantısı "mysql_<host&port>_<user>..." formunu oluşturur ve pdo "PDO:DBH:DSN=<dsn>:<user>:...."'u oluşturur. Karmalar, bir php betiğinde neredeyse dizi-tuşları gibi kullanılır. (Aşırı) simplyfied örnek:

function pconnect($host,$user,$pass) { 
    global $persistent_list; 
    $hashkey = sprintf("extensionname_%s_%s_%s", $host, $user, $pass); 
    if (isset($persistent_list[$hashkey])) { 
    // use stored connection 
    } 
    else { 
    // create new connection 
    } 
} 

Yani cevap edilir: Hayır, bağlantılar arasında paylaşılmaz ve MySQL uzantısı ve PDO tarafından yeniden kullanılır.

+0

ben sormak zorunda , bağlantıları paylaşmak için bir yol var mı? Çünkü PDO ve mysql_connect çağrıları paralel kullanımı ile işlemler için ihtiyacım var ... eski kod sorunu ... – Sangoku

+0

Bu kadarıyla ben pdo kodunu değiştirmeden mümkün değildir/mysql modülleri. – VolkerK

İlgili konular