电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:146日期: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
        主站蜘蛛池模板: 展厅设计公司,展厅公司,展厅设计,展厅施工,展厅装修,企业展厅,展馆设计公司-深圳广州展厅设计公司 | 水篦子|雨篦子|镀锌格栅雨水篦子|不锈钢排水篦子|地下车库水箅子—安平县云航丝网制品厂 | 知企服务-企业综合服务(ZiKeys.com)-品优低价、种类齐全、过程管理透明、速度快捷高效、放心服务,知企专家! | 屏蔽泵厂家,化工屏蔽泵_维修-淄博泵业 | IHDW_TOSOKU_NEMICON_EHDW系列电子手轮,HC1系列电子手轮-上海莆林电子设备有限公司 | 气动机械手-搬运机械手-气动助力机械手-山东精瑞自动化设备有限公司 | 宝鸡市人民医院| 购买舔盐、舔砖、矿物质盐压块机,鱼饵、鱼饲料压块机--请到杜甫机械 | 金属管浮子流量计_金属转子流量计厂家-淮安润中仪表科技有限公司 | 优考试_免费在线考试系统_培训考试系统_题库系统_组卷答题系统_匡优考试 | 双工位钻铣攻牙机-转换工作台钻攻中心-钻铣攻牙机一体机-浙江利硕自动化设备有限公司 | 搅拌磨|搅拌球磨机|循环磨|循环球磨机-无锡市少宏粉体科技有限公司 | 翻斗式矿车|固定式矿车|曲轨侧卸式矿车|梭式矿车|矿车配件-山东卓力矿车生产厂家 | 山东石英砂过滤器,除氟过滤器「价格低」-淄博胜达水处理 | 北京律师事务所_房屋拆迁律师_24小时免费法律咨询_云合专业律师网 | 自清洗过滤器_全自动过滤器_全自动反冲洗过滤器_量子过滤器-滑漮滴 | 防爆暖风机_防爆电暖器_防爆电暖风机_防爆电热油汀_南阳市中通智能科技集团有限公司 | 低温等离子清洗机(双气路进口)-嘉润万丰 | 质检报告_CE认证_FCC认证_SRRC认证_PSE认证_第三方检测机构-深圳市环测威检测技术有限公司 | 淬火设备-钎焊机-熔炼炉-中频炉-锻造炉-感应加热电源-退火机-热处理设备-优造节能 | 新中天检测有限公司青岛分公司-山东|菏泽|济南|潍坊|泰安防雷检测验收 | 飞利浦LED体育场灯具-吸顶式油站灯-飞利浦LED罩棚灯-佛山嘉耀照明有限公司 | 航空连接器,航空插头,航空插座,航空接插件,航插_深圳鸿万科 | 电动葫芦-河北悍象起重机械有限公司| 蒸汽吸附分析仪-进口水分活度仪|康宝百科 | 铝单板_铝窗花_铝单板厂家_氟碳包柱铝单板批发价格-佛山科阳金属 | 厂厂乐-汇聚海量采购信息的B2B微营销平台-厂厂乐官网 | 冻干机(冷冻干燥机)_小型|实验型|食品真空冷冻干燥机-松源 | 博客-悦享汽车品质生活| 不锈钢列管式冷凝器,换热器厂家-无锡飞尔诺环境工程有限公司 | 广东高华家具-公寓床|学生宿舍双层铁床厂家【质保十年】 | 合肥花魁情感婚姻咨询中心_挽回爱情_修复婚姻_恋爱指南 | 拉力机-拉力试验机-万能试验机-电子拉力机-拉伸试验机-剥离强度试验机-苏州皖仪实验仪器有限公司 | 钢绞线万能材料试验机-全自动恒应力两用机-混凝土恒应力压力试验机-北京科达京威科技发展有限公司 | 卓能JOINTLEAN端子连接器厂家-专业提供PCB接线端子|轨道式端子|重载连接器|欧式连接器等电气连接产品和服务 | 不锈钢闸阀_球阀_蝶阀_止回阀_调节阀_截止阀-可拉伐阀门(上海)有限公司 | 北京工业设计公司-产品外观设计-产品设计公司-千策良品工业设计 北京翻译公司-专业合同翻译-医学标书翻译收费标准-慕迪灵 | 衬氟止回阀_衬氟闸阀_衬氟三通球阀_衬四氟阀门_衬氟阀门厂-浙江利尔多阀门有限公司 | 不锈钢闸阀_球阀_蝶阀_止回阀_调节阀_截止阀-可拉伐阀门(上海)有限公司 | 盘煤仪,盘料仪,盘点仪,堆料测量仪,便携式激光盘煤仪-中科航宇(北京)自动化工程技术有限公司 | 阴离子聚丙烯酰胺价格_PAM_高分子聚丙烯酰胺厂家-河南泰航净水材料有限公司 |