php和mysql連接方式(短 長 池)


一個php work進程只能處理一個請求,當完成一個請求了,才能處理下一次的請求

2.短連接:

執行到php關閉mysql連接的代碼時,就斷開,否則在處理本次請求結束的時候,釋放mysql連接

實驗:

<?php
    $dbhost = '127.0.0.1';
    $dbdatabase = 'im';
    $username = 'root';
    $userpass = '123456';

    $dsn='mysql:host='.$dbhost.';dbname='.$dbdatabase.';';
    $dbh=new PDO($dsn,$username,$userpass);
    $stmt=$dbh->query('SELECT id FROM im_fri');
    $row=$stmt->fetch();
    sleep(10);
    var_dump($row);

並發請求: /usr/local/ab/usr/bin/ab -c 100 -n 100 http://192.168.149.130/login/index

結果: 查看mysql連接數: show full processlist
這里我截了php work進程,和兩個時刻的mysql連接情況的圖片

 

 

 

一共五個php-fpm進程,mysql有五個連接,連接的id,會遞增,說明每次請求完成,mysql連接消失,新的請求,php會重新連接mysql。

3.長連接:

當我們創建的數據連接為PDO持久化連接時,該連接在使用完畢或者PHP腳本結束后並不會被關閉,而是被PHP緩存起來。當另一個使用相同憑證(主機、端口、數據庫名、用戶名、密碼等信息完全一致)的PHP腳本請求建立連接時,PHP將直接返回之前被緩存起來的連接,從而達到連接重用。持久連接緩存可以避免每次訪問數據庫都要建立一個新連接的開銷。

 實驗:

<?php
    $dbhost = '127.0.0.1';
    $dbdatabase = 'im';
    $username = 'root';
    $userpass = '123456';

    $dsn='mysql:host='.$dbhost.';dbname='.$dbdatabase.';';
    $dbh=new PDO($dsn,$username,$userpass,  [PDO::ATTR_PERSISTENT => true]);
    $stmt=$dbh->query('SELECT id FROM im_fri');
    $row=$stmt->fetch();
    sleep(10);
    var_dump($row);

並發請求: /usr/local/ab/usr/bin/ab -c 100 -n 100 http://192.168.149.130/login/index

結果: 查看mysql連接數: show full processlist
這里我截了php work進程,和兩個時刻的mysql連接情況的圖片

 

 

 

一共五個php-fpm進程,mysql有五個連接,連接的id不會變動,說明每次請求完成,mysql連接不會消失,在每個php-fpm進程中處理新的請求,php會重用以前mysql連接, 請求都結束了,每個php-fpm進程和mysql的連接還是不會斷的,一直保持着。

3. 總結

 

10台php機器,每台機器上面有50個php-fpm進程,長連接的話, mysql要有五百個線程和500個php-fpm進程保持連接,可想mysql的上下文切換

 

轉自:https://www.cnblogs.com/wangweiwen/p/6937318.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM