使用php數據緩存技術提高執行效率
目錄
- PHP 緩存介紹
- 什么是緩存
- 緩存作用
- 常用緩存類型
- PHP 常用內存緩存介紹
- php opcode緩存
- php文件緩存
為什么要使用php緩存技術?理由很簡單:提高效率。在程序開發中,獲取信息的方式主要是查詢數據庫,除此以外,也可能是通過Web Services或者別的某種方法,無論哪種方法,在大量的并發訪問面前,它們都可能成為效率的瓶頸,為了解決這些問題,人們提出了很多解決方案,其中一些是利用優化軟件(如:APC,Eaccelerator,Zend Optimizer等等)來提高程序的運行效率,合理的運用這些軟件,往往能使程序的運行效率得到數量級上的提升,但前提是你必須擁主機的控制權,以便能夠安裝這些軟件,如果你使用的是虛擬主機的話,那么只能祈禱你的服務提供商已經預裝了某個優化軟件,否則就必須自己使用PHP來實現相應的緩存功能。
PHP緩存技術是一種解釋型語言,屬于邊編譯邊運行,包括PHP編譯緩存和PHP數據緩存兩種。PHP緩存,這種運行模式的優點是程序修改很方便,但是運行效率卻很低下。PHP編譯緩存針對這種情況做改進處理,使得PHP語言只要運行一次,就可以把程序的編譯結果緩存起來。這樣,接下來的每次運行都不需要再次編譯了,這大大提高PHP運行速度。
PHP 緩存介紹
什么是緩存
數據交換的緩沖區(稱作Cache)
臨時文件交換區
緩存作用
減少網絡延遲,加快頁面打開速度
減少數據查詢次數,降低數據庫壓力
降低系統負荷,極大的提升系統性能
常用緩存類型
文件緩存:使用 PHP 文件操作函數,把數據緩存到服務器磁盤文件中
內存緩存:Redis、Memcached、MongoDB
Opcode緩存:PHP 是一種解釋型腳本語言,在 PHP 執行過程中,虛擬機會把 PHP 代碼翻譯成中間語言,這種中間語言就叫 Opcode,然后虛擬機再把 Opcode 順序執行。把 PHP 代碼對應的 Opcode緩存到內存中,加速 PHP 執行,減少了代碼翻譯成中間語言這一步操作。
PHP 常用內存緩存介紹
PHP是一種腳本語言,腳本執行結束之后,所有的變量全部釋放掉,本身沒有能力將數據常駐內存。
PHP借助于內存服務器將緩存數據儲存在服務器內存。
優點:讀寫速度快、跨服務器存儲(例如在做多服務器集群的時候,可以將 Session 存儲于內存緩存服務器中)、易于解決主從同步問題,并發問題。
不足:占用了內存空間、緩存數據有大小限制、數據不易持久化存儲。(但是內存緩存帶給我們的方便足夠可以忽略他的不足)
常用內存緩存:Memcached、Redis、MongoDB
php opcode緩存
PHP Opcode原理
Opcode是一種PHP腳本編譯后的中間語言,就像Java的ByteCode,或者.NET的MSL,舉個例子,比如你寫下了如下的PHP代碼
<?php echo "Hello World"; $a = 1 + 1; echo $a; ?>
PHP執行這段代碼會經過如下4個步驟(確切的來說,應該是PHP的語言引擎Zend)
1.Scanning(Lexing) ,將PHP代碼轉換為語言片段(Tokens) 2.Parsing, 將Tokens轉換成簡單而有意義的表達式 3.Compilation, 將表達式編譯成Opocdes 4.Execution, 順次執行Opcodes,每次一條,從而實現PHP腳本的功能。
學過編譯原理的同學都應該對編譯原理中的詞法分析步驟有所了解,Lex就是一個詞法分析的依據表。 Zend/zend_language_scanner.c會根據Zend/zend_language_scanner.l(Lex文件),來輸入的 PHP代碼進行詞法分析,從而得到一個一個的“詞”,PHP4.2開始提供了一個函數叫token_get_all,這個函數就可以講一段PHP代碼 Scanning成Tokens;如果用這個函數處理前面的PHP代碼,將會得到如下結果:
Array ( [0] => Array ( [0] => 367 [1] => Array ( [0] => 316 [1] => echo ) [2] => Array ( [0] => 370 [1] => ) [3] => Array ( [0] => 315 [1] => "Hello World" ) [4] => ; [5] => Array ( [0] => 370 [1] => ) [6] => = [7] => Array ( [0] => 370 [1] => ) [8] => Array ( [0] => 305 [1] => 1 ) [9] => Array ( [0] => 370 [1] => ) [10] => + [11] => Array ( [0] => 370 [1] => ) [12] => Array ( [0] => 305 [1] => 1 ) [13] => ; [14] => Array ( [0] => 370 [1] => ) [15] => Array ( [0] => 316 [1] => echo ) [16] => Array ( [0] => 370 [1] => ) [17] => ; )
分析這個返回結果我們可以發現,源碼中的字符串,字符,空格,都會原樣返回。每個源代碼中的字符,都會出現在相應的順序處。而,其他的比如標簽,操作符,語句,都會被轉換成一個包含倆部分的Array: Token ID (也就是在Zend內部的改Token的對應碼,比如,T_ECHO,T_STRING),和源碼中的原來的內容。
接下來,就是Parsing階段了,Parsing首先會丟棄Tokens Array中的多于的空格,然后將剩余的Tokens轉換成一個一個的簡單的表達式
1.echo a constant string 2.add two numbers together 3.store the result of the prior expression to a variable 4.echo a variable
然后就改Compilation階段了,它會把Tokens編譯成一個個op_array, 每個op_arrayd包含如下5個部分:
1.Opcode數字的標識,指明了每個op_array的操作類型,比如add , echo 2.結果 存放Opcode結果 3.操作數1 給Opcode的操作數 4.操作數2 5.擴展值1個整形用來區別被重載的操作符
比如,我們的PHP代碼會被Parsing成:
* ZEND_ECHO "Hello World" * ZEND_ADD ~0 1 1 * ZEND_ASSIGN !0 ~0 * ZEND_ECHO !0
php文件緩存
因為如果程序訪問數據庫時數據量較大,執行起來會比較慢。而且每一次刷新頁面都會訪問依稀數據庫,然后再把數據顯示在頁面上。 設置緩存也有一個缺點,那就是緩存時間要設置好,如果緩存時間較長,那么數據庫數據變化時,不能及時的在頁面上顯示。例如緩存不能用在秒殺商品,或者出售商品上面,因為數量不能及時的更新。
<?php //緩存文件一般都放在caches文件夾里面。 //定義一個該頁面的緩存文件路徑,也就是該緩存的文件放在哪個文件夾里面。 $filename = "../cache/testhuancun.html";//定義了一個緩存的文件,文件名為testhuancun.html,位置在../cache文件夾里面。 //設置一個緩存時間 $time = 10;//代表緩存時間設置為10s. //判斷緩存文件是否存在 if(!file_exists($filename) || filemtime($filename)+$time<time()) //判斷文件是否存在,如果不存在,執行{}里面的代碼。還要判斷緩存時間有沒有過,如果已經過了,要重新讀取數據庫更新緩存。 //filemtime($filename)讀取文件最后被修改的時間,time()取當前時間戳 { //開啟內存緩存 ob_start();//這里開啟內存緩存以后,下面要輸出的內容全部放在內存緩存里面。 include("../init.inc.php"); include("../DBDA.php"); $db = new DBDA(); $sql = "select * from nation"; $attr = $db->Query($sql); $smarty->assign("nation",$attr); $smarty->display("test.html"); //把內存里面的內容讀出來 $nr = ob_get_contents();//ob就是代表的緩存,讀取的內容就是整個靜態頁面。 //將讀到的內容存放到緩存文件 file_put_contents($filename,$nr);//get是取出內容,put是往里放內容,把內存緩存的文件存到¥filename里面。 //清除內存緩存 ob_flush();//把內存緩存的內容清除掉,不讓它們繼續留在緩存內存里面,但是需要緩存的內容已經放在了$filename里面了,已經保存下來了。 echo "#############################";//輸出內容加上一句話,觀察輸出內容是輸出的緩存頁面還是加載數據庫的頁面。這句話放在了ob_flush后面,不會被清除掉。 } else//如果緩存文件存在,直接將緩存文件拿到頁面顯示。 { include($filename);//將緩存的頁面加載到顯示頁面中 }
到此這篇關于使用php數據緩存技術提高執行效率的文章就介紹到這了,更多相關php數據緩存技術內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!