摘要:所以我們在編程過程中,應(yīng)該避免多次實(shí)例化,而產(chǎn)生不必要的數(shù)據(jù)庫性能消耗。解決方案封裝一個(gè)單例模式的類,該類實(shí)例化的過程就是創(chuàng)建連接的過程。當(dāng)腳本中再次執(zhí)行不帶參數(shù)的連接時(shí),還會(huì)再次產(chǎn)生一個(gè)新的數(shù)據(jù)庫連接。
情景分析
腳本代碼:
CLI執(zhí)行:
root@78ad0df34cef:/home/www/test# php index.php 連接成功1 連接成功2 連接成功3 保持連接中... 執(zhí)行結(jié)束在腳本sleep過程中,我們查看mysql的連接信息:
mysql> show processlist; +----+------+-----------+------+---------+------+----------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+-----------+------+---------+------+----------+------------------+ | 3 | root | localhost | NULL | Query | 0 | starting | show processlist | | 24 | root | localhost | test | Sleep | 6 | | NULL | | 25 | root | localhost | test | Sleep | 6 | | NULL | | 26 | root | localhost | test | Sleep | 6 | | NULL | +----+------+-----------+------+---------+------+----------+------------------+ 4 rows in set (0.00 sec)可以看到一個(gè)腳本的執(zhí)行產(chǎn)生了三個(gè)數(shù)據(jù)庫連接,但是如果將后面的實(shí)例化的pdo實(shí)例賦值給之前實(shí)例化的pdo實(shí)例,則新的連接會(huì)替換掉前一個(gè)連接,而不會(huì)產(chǎn)生新的連接。所以我們在編程過程中,應(yīng)該避免多次實(shí)例化pdo,而產(chǎn)生不必要的數(shù)據(jù)庫性能消耗。
解決方案封裝一個(gè)單例模式的類,該類實(shí)例化的過程就是創(chuàng)建pdo連接的過程。我們要建立數(shù)據(jù)庫連接時(shí),不是手動(dòng)實(shí)例化pdo,而是去獲取這個(gè)類的實(shí)例。
實(shí)例化pdo類時(shí),設(shè)定 持久連接 參數(shù):
true )); ?>PHP官方文檔的引用:
很多 web 應(yīng)用程序通過使用到數(shù)據(jù)庫服務(wù)的持久連接獲得好處。持久連接在腳本結(jié)束后不會(huì)被關(guān)閉,且被緩存,當(dāng)另一個(gè)使用相同憑證的腳本連接請求時(shí)被重用。持久連接緩存可以避免每次腳本需要與數(shù)據(jù)庫回話時(shí)建立一個(gè)新連接的開銷,從而讓web 應(yīng)用程序更快。官方所說的腳本結(jié)束,在fpm模式下就是指一次客戶端請求的結(jié)束。另一個(gè)使用相同憑證的腳本也就可以對應(yīng)成另一個(gè)使用相同數(shù)據(jù)庫連接憑證的客戶端請求。首先我們要知道,這兩次客戶端的請求是根據(jù)fpm-workers的空閑情況,被分配給某個(gè)worker去執(zhí)行的,所以兩次請求被分配到同一個(gè)worker的可能性很低。接著,我們闡明下面的情景。
開啟持久連接之后,數(shù)據(jù)庫連接是被緩存于fpm進(jìn)程之中的。如果某個(gè)fpm-worker進(jìn)程中已經(jīng)緩存了持久連接,此時(shí)可能出現(xiàn)如下兩種情況:
當(dāng)腳本中再次執(zhí)行帶 ATTR_PERSISTENT 參數(shù)的pdo連接時(shí),會(huì)復(fù)用之前的連接,而不會(huì)產(chǎn)生新的連接。
當(dāng)腳本中再次執(zhí)行不帶 ATTR_PERSISTENT 參數(shù)的pdo連接時(shí),還會(huì)再次產(chǎn)生一個(gè)新的數(shù)據(jù)庫連接。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/28395.html
摘要:是什么首先思考為什么選擇是一個(gè)數(shù)據(jù)訪問抽象層抽象是雙重的一個(gè)是眾所周知但不太重要的另一個(gè)是模糊的但是是最重要的眾所周知為不同的數(shù)據(jù)庫提供了統(tǒng)一的接口雖然這個(gè)功能本身很龐大但是對于固定程序來說不是過于重要的事情基本所有的程序都是使用統(tǒng)一的后端 PDO是什么 首先思考, 為什么選擇PDO PDO 是一個(gè)數(shù)據(jù)訪問抽象層(Database Access Abstraction Layer). ...
摘要:而在項(xiàng)目開發(fā)中,我們想要的是一個(gè)更好用的可維護(hù)的工具,此時(shí),對代碼的封裝模塊化就顯得尤為重要,于是出現(xiàn)了兩種方案查詢構(gòu)造器,對象關(guān)系映射。典型環(huán)境下按照一般的查詢構(gòu)造器處理就行。 文章目錄 寫一個(gè)特殊的查詢構(gòu)造器 - (前言) 寫一個(gè)特殊的查詢構(gòu)造器 - (一、程序結(jié)構(gòu),基礎(chǔ)封裝) 寫一個(gè)特殊的查詢構(gòu)造器 - (二、第一條語句) 寫一個(gè)特殊的查詢構(gòu)造器 - (三、條件查詢) 寫一個(gè)特殊...
摘要:正確做法是給加索引,還有聯(lián)合索引,并不能避免全表掃描。 前言:有收獲的話請加顆小星星,沒有收獲的話可以 反對 沒有幫助 舉報(bào)三連 有心的同學(xué)應(yīng)該會(huì)看到我這個(gè)noteBook下面的其它知識(shí),希望對你們有些許幫助。 本文地址 時(shí)間點(diǎn):2017-11 一個(gè)16年畢業(yè)生所經(jīng)歷的php面試 一、什么是面試 二、面試準(zhǔn)備 1. 問:什么時(shí)候開始準(zhǔn)備? 2. 問:怎么準(zhǔn)備? 三、面試...
閱讀 3406·2021-11-24 09:39
閱讀 1797·2021-11-17 09:33
閱讀 3503·2021-10-12 10:12
閱讀 5019·2021-09-22 15:51
閱讀 1112·2019-08-30 13:11
閱讀 3572·2019-08-30 10:59
閱讀 564·2019-08-30 10:48
閱讀 1311·2019-08-26 13:48