PHP單例模式數(shù)據(jù)庫(kù)連接類(lèi)與頁(yè)面靜態(tài)化實(shí)現(xiàn)方法
本文實(shí)例講述了PHP單例模式數(shù)據(jù)庫(kù)連接類(lèi)與頁(yè)面靜態(tài)化實(shí)現(xiàn)方法。分享給大家供大家參考,具體如下:
數(shù)據(jù)庫(kù)test中數(shù)據(jù)表account內(nèi)容

單例模式的數(shù)據(jù)庫(kù)連接類(lèi)
db.php
<?php
//單例模式的數(shù)據(jù)庫(kù)連接
class DB {
//存儲(chǔ)實(shí)例的靜態(tài)成員變量
static public $_instance;
//數(shù)據(jù)庫(kù)連接靜態(tài)變量
static public $_connectSource;
//連接數(shù)據(jù)庫(kù)配置,由于前幾天學(xué)習(xí)了PDO,這里就使用PDO
private $_dbConfig = array(
'host' => 'localhost',
'user' = > 'root',
'password' => '',
'database' => 'test'
);
//禁止外部實(shí)例化
private function __construct() {
}
//實(shí)例化
public static function getInstance() {
if(self::$_instance instanceof self) {
return self::$_instance;
}
self::$_instance = new self();
return self::$_instance;
}
//數(shù)據(jù)庫(kù)連接
public function connect() {
//如果不存在數(shù)據(jù)庫(kù)連接就創(chuàng)建一個(gè)
if(!self::$_connectSource) {
try {
$dsn = 'mysql:host='.$this->_dbConfig['host'].';dbname='.$this->_dbConfig['database'];
$username = $this->_dbConfig['user'];
$password = $this->_dbConfig['password'];
self::$_connectSource = new PDO($dsn, $username, $password);
}catch(PDOException $e) {
echo $e->getMessage();
}
}
return self::$_connectSource;
}
}
?>
PHP實(shí)現(xiàn)頁(yè)面靜態(tài)化的例子
其實(shí)原理很簡(jiǎn)單,這里用到了幾個(gè)函數(shù),ob_start(),ob_get_contents(),file_put_contents(),ob_start()是開(kāi)啟緩沖區(qū)的意思,ob_get_contents()是得到緩沖區(qū)內(nèi)容的意思,file_put_contents()是把內(nèi)容放到一個(gè)文件里的意思,如果不理解緩沖區(qū)的意思,可以自行百度一下,我理解的緩沖區(qū)就是,當(dāng)我們要在PHP中輸出一些數(shù)據(jù)顯示出來(lái)時(shí),會(huì)先經(jīng)過(guò)緩沖區(qū),而我們可以從緩沖區(qū)中得到這些內(nèi)容。所以實(shí)現(xiàn)純靜態(tài)頁(yè)面的方法就是,獲取緩沖區(qū)中的內(nèi)容放到一個(gè)靜態(tài)文件中,并在入口中根據(jù)需求設(shè)置訪問(wèn)動(dòng)態(tài)文件還是靜態(tài)文件,這種方法一般用于數(shù)據(jù)不經(jīng)常變化的動(dòng)態(tài)頁(yè)面中。下面就來(lái)具體的實(shí)現(xiàn)這個(gè)功能。
static.php
<?php
//1.使用剛才寫(xiě)的數(shù)據(jù)庫(kù)連接類(lèi)連接數(shù)據(jù)庫(kù)
//2.把獲取到的數(shù)據(jù)填充到模板文件中
//3.把頁(yè)面轉(zhuǎn)化為靜態(tài)文件
//如果我們本地有這個(gè)靜態(tài)文件并且這個(gè)文件生成的時(shí)間小于5分鐘那么就去訪問(wèn)這個(gè)靜態(tài)文件,filemtime()用來(lái)獲取文件的最后修改時(shí)間
if(is_file('./static.shtml') && (time() - filemtime('./static.shtml')) < 300) {
//這里很簡(jiǎn)單,直接把靜態(tài)文件拿過(guò)來(lái)
require_once('./static.shtml');
}else {
//如果不存在這個(gè)靜態(tài)文件,或者這個(gè)靜態(tài)文件的最后修改時(shí)間距離現(xiàn)在已經(jīng)超過(guò)了5分鐘,那么就訪問(wèn)動(dòng)態(tài)獲取數(shù)據(jù)的模板,然后更新static.shtml文件的內(nèi)容
//連接數(shù)據(jù)庫(kù)
header('Content-Type:text/html;charset=utf-8');
require_once('./db.php');
$connect = DB::getInstance()->connect();
//執(zhí)行查詢(xún)操作
$sql = 'select * from account';
$res = $connect->query($sql);
//開(kāi)啟緩沖區(qū)
ob_start();
//ob_get_clean()這個(gè)函數(shù)可以獲取緩沖區(qū)的內(nèi)容并清空,一會(huì)我會(huì)測(cè)試一下ob_get_clean()和ob_get_contents()的
require_once('./static_show.php');
//把緩沖區(qū)的內(nèi)容寫(xiě)入到靜態(tài)文件
file_put_contents('./static.shtml', ob_get_contents());
}
?>
動(dòng)態(tài)展示模板文件static_show.php
<?php
foreach($res as $row) {
echo '名字:'.$row['name'].'<br/>';
echo '錢(qián)包:'.$row['money'].'<br/>';
echo '<hr/>';
}
?>
當(dāng)我們?cè)L問(wèn)static.php的時(shí)候,因?yàn)闆](méi)有static.shtml,所以會(huì)先執(zhí)行else的操作,展示在static_show.php并生成static.shtml文件

如果這時(shí)候我把數(shù)據(jù)庫(kù)修改了,zjp的money改為800,然后再訪問(wèn)static.php會(huì)展示什么樣的內(nèi)容呢,沒(méi)錯(cuò),zjp的錢(qián)包還是600,為什么呢,因?yàn)樗鼒?zhí)行了if中的內(nèi)容,直接顯示了static.shtml,我們可以看一下static.shtml是什么樣的:

如果5分鐘過(guò)后再訪問(wèn)staitc.php呢,會(huì)顯示什么呢,沒(méi)錯(cuò)!zjp的錢(qián)包就變成800了,并且static.shtml的內(nèi)容會(huì)更新為zjp的錢(qián)包是800。
測(cè)試ob_get_clean()和ob_get_contents()
測(cè)試方法很簡(jiǎn)單:
<?php $test = 'Hello World!'; //開(kāi)啟緩沖區(qū) ob_start(); //測(cè)試ob_get_contents() echo $test; echo ob_get_contents(); //輸出結(jié)果:Hello World!Hello World! //測(cè)試ob_get_clean() echo $test; echo ob_get_clean(); //輸出結(jié)果:Hello World! echo $test; ob_get_clean(); //輸出結(jié)果: ?>
這樣就可以很清楚的看出來(lái)了,當(dāng)我們使用了ob_get_clean()的時(shí)候,輸出語(yǔ)句并不會(huì)輸出任何值,因?yàn)?code>ob_get_clean()會(huì)獲取緩沖區(qū)中的內(nèi)容并將緩沖區(qū)清空。所以當(dāng)我們echo test的時(shí)候并沒(méi)有得到test的時(shí)候并沒(méi)有得到test的值,echo ob_get_clean()的時(shí)候卻能夠獲取到值。而當(dāng)我們使用ob_get_contents()的時(shí)候緩沖區(qū)中的內(nèi)容并沒(méi)有被清空。
實(shí)際上,ob_get_clean()函數(shù)相當(dāng)于執(zhí)行了,ob_get_contents()和ob_end_clean()。
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語(yǔ)法入門(mén)教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門(mén)教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
前后端分離和跨域問(wèn)題的詳細(xì)解決方案(CORS的原理)
前后端跨域問(wèn)題由瀏覽器同源策略而來(lái),下面這篇文章主要給大家介紹了關(guān)于前后端分離和跨域問(wèn)題的詳細(xì)解決方案,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
php開(kāi)發(fā)中的頁(yè)面跳轉(zhuǎn)方法總結(jié)
PHP頁(yè)面跳轉(zhuǎn)實(shí)現(xiàn)的功能就是將網(wǎng)站中一個(gè)網(wǎng)頁(yè)跳轉(zhuǎn)到另一個(gè)網(wǎng)頁(yè)中。對(duì)于剛剛學(xué)習(xí)PHP語(yǔ)言的朋友來(lái)說(shuō),是必須要掌握的基礎(chǔ)方法。2015-04-04
PHP基于MySQL數(shù)據(jù)庫(kù)實(shí)現(xiàn)對(duì)象持久層的方法
這篇文章主要介紹了PHP基于MySQL數(shù)據(jù)庫(kù)實(shí)現(xiàn)對(duì)象持久層的方法,實(shí)例分析了php實(shí)現(xiàn)持久層的相關(guān)技巧,需要的朋友可以參考下2015-06-06
用mysql觸發(fā)器自動(dòng)更新memcache的實(shí)現(xiàn)代碼
不錯(cuò)的一篇文章,用于項(xiàng)目中可以帶來(lái)更多的便利,按照方法已經(jīng)調(diào)試成功,可以大大提高項(xiàng)目的速度。2009-10-10
php通過(guò)baihui網(wǎng)API實(shí)現(xiàn)讀取word文檔并展示
這篇文章主要介紹了php通過(guò)baihui網(wǎng)API實(shí)現(xiàn)讀取word文檔并展示的相關(guān)資料,需要的朋友可以參考下2015-06-06
通過(guò)緩存數(shù)據(jù)庫(kù)結(jié)果提高PHP性能的原理介紹
眾所周知,緩存數(shù)據(jù)庫(kù)查詢(xún)的結(jié)果可以顯著縮短腳本執(zhí)行時(shí)間,并最大限度地減少數(shù)據(jù)庫(kù)服務(wù)器上的負(fù)載。如果要處理的數(shù)據(jù)基本上是靜態(tài)的,則該技術(shù)將非常有效。這是因?yàn)閷?duì)遠(yuǎn)程數(shù)據(jù)庫(kù)的許多數(shù)據(jù)請(qǐng)求最終可以從本地緩存得到滿(mǎn)足,從而不必連接到數(shù)據(jù)庫(kù)、執(zhí)行查詢(xún)以及獲取結(jié)果2012-09-09
PHP封裝的分頁(yè)類(lèi)與簡(jiǎn)單用法示例
這篇文章主要介紹了PHP封裝的分頁(yè)類(lèi)與簡(jiǎn)單用法,結(jié)合實(shí)例形式分析了php數(shù)據(jù)庫(kù)查詢(xún)、分頁(yè)、輸出顯示等相關(guān)操作技巧,需要的朋友可以參考下2019-02-02
PHP將Excel導(dǎo)入數(shù)據(jù)庫(kù)及數(shù)據(jù)庫(kù)數(shù)據(jù)導(dǎo)出至Excel的方法
這篇文章主要介紹了PHP將Excel導(dǎo)入數(shù)據(jù)庫(kù)及數(shù)據(jù)庫(kù)數(shù)據(jù)導(dǎo)出至Excel的方法,涉及php操作數(shù)據(jù)庫(kù)及Excel的相關(guān)技巧,需要的朋友可以參考下2015-06-06
Zend Framework中的簡(jiǎn)單工廠模式 圖文
某天又然后想到好久沒(méi)復(fù)習(xí)設(shè)計(jì)模式了。綜合一下,復(fù)習(xí)一個(gè)設(shè)計(jì)模式之后在ZF中找一下使用這模式的源碼吧,不讀所有源碼,讀讀比較”高級(jí)”的部分吧,要說(shuō)模式,暫時(shí)不知道是不是所有模式ZF里面都有,但是應(yīng)該有足夠的模式夠我最近看了,在說(shuō)可以找找其他開(kāi)源的軟件來(lái)找模式2012-07-07

