在之前我們手寫 mysql 的連線操作時,一般都會使用 mysql_close() 來進行關閉資料庫連線的操作。不過在現代化的開發中,一般使用框架都會讓我們忽視了底層的這些封裝,而且大部分框架都已經預設是使用 pdo 來mukunmpr進行資料庫的操作,那麼,大家知道 pdo 是如何關閉資料的連線的嗎?
要想關閉連線,需要銷毀物件以確保所有剩餘到它的引用都被刪除,可以賦乙個 null 值給物件變數。如果不明確地這麼做,php 在指令碼結束時會自動關閉連線。
$pdo = new pdo('mysql:host=127.0.0.1;port=3306;dbname=blog_test', 'root', '');
$pdo = null;
官方文件中說得很明白,那就是給 pdo 物件賦值為程式設計客棧 null 即可。但是事情真的有那麼簡單嗎?
我們來這樣進行一下測試,正常情況下,我們開啟資料庫連線後都不會直接就關閉,而是要進行一些操作。
$pdo = new pdo('mysql:host=127.0.0.1;port=3306;程式設計客棧dbname=blog_test', 'root', '');
$stmt = $pdo->prepare('select * from zyblog_test_user');
$stmt->execute();
$pdo = null;
sleep(60);
執行上述**後,我們在資料庫使用 show full processlist; 檢視連線程序,會發現當前的連線並沒有馬上關閉,而是等到 60 秒之後,也就是頁面執行完成之後才會關閉。似乎 $pdo = null; 這句並沒有執行成功。
其實,在官方文件中已經說明了這個情況,只是大家可能不太會注意。【需要銷毀物件以確保所有剩餘到它的引用都被刪除】,在上面的**中,\$stmt 預編譯 sql 語句的功能呼叫的是 $pdo 物件中的方法,它們之間產生了引用依賴的關係,這樣的情況下,直接給 $pdo = null; 是沒有效果的,我們需要將 $stmt 也賦值為 null 。
$pdo = new pdo('mysql:host=127.0.0.1;port=3306;dbname=blog_test', 'root', '');
$stmt = $pdo->prepare('select * from zyblog_test_user');
$stmt->execute();
$stmt = null;
$pdo = null;
sleep(60);
那麼使用 mysqli 的預設擴充套件元件,也就是使用 mysqli 物件中的 close() 來關閉資料庫連線會有這個問題嗎?還是直接用**來測試測試。( mysql 擴充套件已經過時不推薦使用了,大家如果要自己封裝資料庫操作類或者寫小 demo 的話還是要用 mysqli 更好一些 )
$conn = new mysqli('127.0.0.1', 'root', '', 'blog_test');
$result = $conn->query('select * from zyblog_test_user');
$stmt = $conn->prepare("select * from zyblog_test_user");
$stmt->execute();
$conn->close();
sleep(60);
在執行上述**後,我們在資料庫中檢視連線程序就不會看到還在執行的連線的,也就是說在 mysqli 中呼叫 close() 方法是能夠直接馬上關閉掉資料庫的連線的。
其實今天的內容也是官方文件關於資料庫連線這一頁文件上的乙個 note 中的資訊。很早就有大神發現了這個問題並且分享了出來,但是大部分人根本都不知道這個問題,甚至很多人連 pdo 也是可以關閉資料庫連線的都不知道。框架在帶給我們便利的同時,確實也將很多東西封裝的太好了,以至於很多朋友都不去關心底層的一些內容,但是,當你向更高階層邁進時,往往這些底層的東西會成為你的阻礙。
測試**:
程式設計客棧/php/202008/source/php%e4%b8%adpdo%e5%85%b3%e9%97%ad%e8%bf%9e%e6%8e%a5%e7%9a%84%e9%97%ae%e9%a2%98.php
PHP中用PDO方法開啟連線關閉mysql資料庫
如下 1239 10if server request method post 24catch pdoexception e 25 28 29 try catch exception e php中try catch 是異常處理.將要執行的 放入try塊中,如果這些 執行過程中某一條語句發生異常,則程...
php封裝pdo例項以及pdo長連線的優缺點
四 pdo部分demo的封裝 最近需要寫指令碼來實現崩潰日誌的入庫,不出所料又是脫離於框架的,那麼行吧,咱們只能自己封裝資料庫相關操作了。博主這裡選擇了封裝pdo運算元據庫相關。眾所周知的,php在早期的時候是帶有mysql擴充套件的,但是後來由於過於古老缺失了mysql的新特性,因此主鍵沒落。從p...
PHP中PDO的使用方法總結
本文不涉及pdo的安裝,只是簡單總結一下pdo的使用。開始構造第乙個pdo應用,在web文件目錄下建立乙個pdo.php檔案 exec insert into foo set name lix gender mail time now echo count db null dsn mysql hos...