av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術文章
文章詳情頁

使用php數據緩存技術提高執行效率

瀏覽:123日期:2022-06-06 13:44:56
目錄
  • 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 執行,減少了代碼翻譯成中間語言這一步操作。

        文件緩存內存緩存Opcode緩存存儲介質磁盤文件內存內存不足IO操作慢、文件鎖的存在占內存、不持久部署代碼刷新慢應用舉例新聞數據、城市區域會員、商品、SessionOpcodeCache(代碼加速)

        PHP 常用內存緩存介紹

            PHP是一種腳本語言,腳本執行結束之后,所有的變量全部釋放掉,本身沒有能力將數據常駐內存。
            PHP借助于內存服務器將緩存數據儲存在服務器內存。
            優點:讀寫速度快、跨服務器存儲(例如在做多服務器集群的時候,可以將 Session 存儲于內存緩存服務器中)、易于解決主從同步問題,并發問題。
            不足:占用了內存空間、緩存數據有大小限制、數據不易持久化存儲。(但是內存緩存帶給我們的方便足夠可以忽略他的不足)
            常用內存緩存:Memcached、Redis、MongoDB

        MemcachedRedisMongoDB儲存數據類型stringstring, list, hash, setbson 豐富查詢方式數據儲存位置內存內存 + 硬盤內存 + 硬盤持久化最長30天RDB 文件快照,AOF(記錄寫操作)持久化journal持久化使用場景Session 商品緩存(緩存 < 1MB)緩存、隊列日志、區域信息、評論

        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數據緩存技術內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

        標簽: PHP
        主站蜘蛛池模板: 天堂中文资源在线 | 国产精品久久久久久久久免费软件 | 做a视频在线观看 | 少妇特黄a一区二区三区88av | 午夜电影网址 | 久久婷婷国产麻豆91 | 一区二区在线免费观看 | 色婷婷综合久久久中字幕精品久久 | 精品欧美一区二区三区免费观看 | 五月婷婷婷 | 韩国理论电影在线 | 日韩欧美在线视频 | 久免费视频 | 国产午夜精品一区二区三区嫩草 | 亚洲精品9999 | 久久久久无码国产精品一区 | 亚洲一区二区免费 | 成人久久 | 欧美日在线 | av在线一区二区三区 | 日韩久久网 | 免费视频色| 日韩国产高清在线观看 | 午夜男人免费视频 | 波多野结衣二区 | 国产一级一级国产 | 色综网| 久草资源 | 国产精品久久久久久久久免费樱桃 | 欧美一区二区三区在线观看 | 欧美在线视频观看 | 一a一片一级一片啪啪 | 成人精品鲁一区一区二区 | 免费特黄视频 | 国产日韩av一区二区 | 伊伊综合网 | 久久久www成人免费无遮挡大片 | 国产福利二区 | 亚洲精品一区二区在线观看 | 久久国产精品视频观看 | 伦理午夜电影免费观看 |