• 笔记


    # 1、缓存 #

    ## 1.1缓存三大要素 ##

    1.1.1 命中率

            命中率指请求缓存次数和缓存返回正确结果次数的比例。比例越高,证明缓存的使用率越高。
            以Query Cache为例。
            MySQL的Query Cache用来缓存和Query相关的数据。具体来说,Query Cache缓存客户端
            提交给MySQL的SELECT语句以及该语句的结果集。就是将SELECT语句和语句的结果做Hash
            映射关系后保存在一定的内存区域中。
        
    1.1.2 缓存更新策略


            
    1.1.3 缓存最大数据量

    文件缓存幵源产品Secache

    ##1.2  obcode##
        一个PHP程序在运行完后,内存马上释放,基本上所有数据都在此时销毁(仅有极少数据
        会缓存),也就是说此时计算机内存中基本上不存在这个PHP代码中的数据,这和常驻内存的
        Java等语言有显著区别。这种缓存机制具有如下的优缺点:
        优点:有效避免内存泄露,内存回收机制更简单,避免因为一个程序的问题而连累整个服
        务器。
        缺点:无法复用已有数据,每个PHP请求都得重复执求-翻洋-执行的过程,重复过多。
        Opcode (Operation Code,操作码)缓存就是虚拟机把PHP代码编译成一种中间码的结果缓
        存起来(可以缓存到硬盘或内存)。下一次PHP运行此页面时,只要直接解释这些代码就行了。
        这样省去了 Flex语法器进行语法编译和大部分语法检查(这个语法检査在多个阶段均存在)的
        过程,一定程度上提高了 PHP运行速度,减轻了服务器负荷。
    ##1.2.1 eAccelerator使用##

        在服务器第一次请求PHP文件时,会对PHP文件的Opcode进行缓存;再次请求时,直接
        取出缓存的Opcode,由Zend虚拟机直接执行,从而节省了语法解析的消耗

    ##1.2.2 如何査看Opcode##

        首先安装VLD扩展(Vulcan Logic Disassembler), 用来检测PHP脚本的执行情
        ,Opcode就是PHP “汇编代码‛。
        eAccelerator缓存Opcode,同时提供一组API用来操作缓存数据。变相实现了类似Java中的
        “共享变量” 功能。我们知道,PHP本身无法实现共享变量,变最在请求完成后就被销毁,无
        法在另一个进程中得到其数据。借助eAccelerator就能实现类似功能。
        无论eAccelerator还是APC, Opcode缓存软件实现的都只是简单的“共享变量‛,不能和具
        有完整GC功能的Java或.NET中的内存变量相提并论,但是这确实提高了 PHP的执行效率,
        使其接近编译型语言的速度。

    ##1.3 mamcache ##
    ### 1.3.1 Memcached如何支持高并发 ###
        Memcached使用多路复用I /O 模型(如epoll、select等)。传统阻塞I /O 中,系统可能会因
        为某个用户连接还没做好i / o 准备而一直等待,直到这个连接做好I /O 准备。如果这时有其他
        用户连接到服务器,很可能会因为系统阻塞而得不到响应。
        而多路复用I /O 是一种消息通知模式,用户连接做好I /O 准备后,系统会通知我们这个连
        接可以进行I /O 操作,这样就不会阻塞在某个用户连接。因此,Memcached才能支持高并发。
        此外,Memcached使用了多线程模式。在开启Memcached服务器时通过使用“-t‛参数指
        定要开启的线程数。但并不是线程数越多越好,一般设置为CPU核数,这样效率最高。因为线
        程数越多,系统需要的线程调度时间就越多。而把线程数设置成CPU核数,系统需要的线程调
        度时间域少。

    ###1.3.2 使用Slab分配算法保存数据 ###

        Memcached默认只能存储不大于1 MB的数据(修改Memcached源码可以打破这个限制,只
        需把POWER_BLOCK宏设置为更大的数)。为什么Memcached会有这个限制呢?因为Memcached
        在存储数据时使用Slab内存分配算法。使用这种算法可以减少生成内存碎片,提高内存
        使用效率等。但使用这种算法也导致Memcached只能使用不大于1 MB的内存。

    ###1.3.3 Memcached多线程模型 ###

        Memcached是一个多线程的缓存服务器程序。在Memcached内部,线程分为:
        主线程(main thread):接收客户端连接,并把连接分配给工作线程处理。
        工作线程(worker thread): 处理客户端连接的请



    ###1.4 PHP opcode原理 ###

        php代码执行流程
            PHP执行代码会经过如下4个步骤(确切的来说,应该是PHP的语言引擎Zend)
            1.Scanning(Lexing[Lex就是一个词法分析的依据表]) ,将PHP代码转换为语言片段(Tokens)
            2.Parsing, 将Tokens转换成简单而有意义的表达式
            3.Compilation, 将表达式编译成Opocdes
            4.Execution, 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能。

        现在有的Cache比如APC,可以使得PHP缓存住Opcodes,这样,每次有请求来临的时候,就不需要重复执行前面3步,从而能大幅的提高PHP的执行速度


    #2、redis#

    ##2.1 key相关命令##

        Redis本质上是Key-Value数据库,所以先了解key的相关操作。在Redis中,key使用字符
        串存储,但是key中不能出现空格或者换行符“ ” ,原因是空格和换行符都是Redis的特殊字
        符,但只限于key, value可以使用任何字符。
        注意Redis以“ ” 作为命令结束符,所以在key中不能存在“ ” ,否则就会出错。此外,
        Redis以空格作为命令和参數的分隔符,所以在key中也不能存在空格。

        应该尽量使用较短的k e y ,因为较短的key可以节省内存和带宽。

    ##2.2 Redis支持的数据类型##

        Redis支持多种数据类型,如String、List、Set、Sorted Set、Hash等

    # 3、网站优化#

    ## 3.1 优化网站响应时间 ##

    ###3.1.1 减少HTTP清求###

        下载一个CSS文件或者图片需要一个独立的HTTP请求,而解析HTTP协议的过程需要时
        间。处于相对顶层的HTTP协议占用更多传输量,所以减少HTTP请求可以降低网站的响应时
        间和减少传输的数据。要减少HTTP请求,主要的方法有:
        □ 将多个图片合并成为一个文件,利用CSS背景图片的偏移技术呈现在网页中,从而减少
        图片下载的清求。
        □ 合并JavaScript脚本和CSS样式文件。
        □ 利用浏览器的Cache功能,避免重复下载相同文件。
        
    ###3.1.2 动态内容静态化###
        
        如果应用中一些内容不经常改动,动态内容静态化是非常有效的加速方法。例如在新闻发
        布系统中,把发布的新闻生成静态HTML文件,减少服务器脚本的计算时间,从而降低服务器
        的响应时间。不过这种方法不能用于内容经常变化的应用,如SNS (社交网络)。
        
    ###3.1.3 优化数据库###
        
        对于使用数据库的Web站点来说,数据库性能关系整个Web应用的性能,如果数据库性
        能不佳,其他的优化工作也是徒劳无功。所以优化数据库性能,对提高整个Web应用的效率有
        着举足轻重的作用。
        第1 1章高性能网站架构方案♦ > 423
        
    ###3.1.4  使用负载均衡###
        
        单台Web服务器处理能力有限,单台服务器承受的压力达到极限时,需要有更多的服务器
        分担工作,我们需要想办法将流量合理分配到更多的服务器上。
        实现负载均衡有多种方法,如HTTP重定向、基于DNS的轮询解析、反向代理服务器。无
        论哪种方法,最终目的都是把流量分配到更多服务器上,从而降低单台服务器的压力。
        
    ###3.1.5 使用缓存###
        
        缓存把需要花费昂贵开销的计算结果保存起来,在以后需要时直接取出,从而避免重复计
        算。而在Web应用中,数据库的访问耗时相对较多,所以减少数据库的访问次数可以有效提高
        应用性能。
        缓存的方法有很多,可以把查询数据库的结果存储为一个PHP文件,需要时直接include
        到程序中即可。也可以把查询结果存储在Memcached,需要时直接从Memcached中读取。
        
    ## 3.2吞吐率 ##
        
        吞吐率指单位时间内服务器处理的请求数,通常使用“reqs/s‛(服务器每秒处理请求的数
        量)表示。在一些常见Web服务器软件中,通常提供当前服务器运行状态以及吞吐率的査看
        方法    .
        吞吐率只描述服务器在实际运行期间单位时间内处理的请求数, 而我们更加关心服务器
        并发处理能力的上限,即单位时间内服务器能够处理的最大请求数(即最大吞吐率)。但是
        在测试时,很难调动足够的人测试服务器的最大吞吐率。所以,需要使用某些方法模拟足够数
        目的并发用户数,这种方法称为“压力测试‛。

    ## 3.3 压力测试 ##
        
        压力测试工具很多,如LoadRunner、JMeter和ab等。由于LoadRunner和JMeter使用过于复
        杂,本书中大部分使用ab。

        ab的参数比较多,常用的只有以下几个:
        在测试会话中执行的请求个数,默认执行一个请求u
        要创建的并发用户数,默认创建一个用户数。
        等待Web服务器响应的敁大时间(单位:秒),默认没有时间限制。
        使用Keep-Alive特性。
        对请求附加一个Cookie,形式为name = value。

        测试结果中关注以下内容:
        □ Server Software:被测试Web服务器的软件名称。
        □ Server Hostname :请求URL中的主机名称。
        □ Server Port:被测试Web服务器的侦听端口。
        □ Document Path:请求的_______URL的绝对路径。
        □ Document Length: HTTP响应数据的正文长度。
        □ Concurrency Level:并发用户数,设置的“ -C” 参数。
        □ Time taken for tests:所有请求处理完成所花费的总时间。
        □ Complete requests:总请求数,设置的“-n” 参数。
        □ Failed requests :失败的请求数。
        □ Total transferred:所有请求的响应数据长度总和。
        □ HTML transferred:所有请求的响应数据中正文数据的总和。也就是减去Total transferred
        中HTTP响应数据中头信息的长度。
        □ Requests per second : Web 服务器的吞吐率,等于 Complete requests/Time taken for tests。
        □ Time per request:用户平均请求等待时间,等于 Time taken for tests/( Complete requests/
        Concurrency Level) 0
        □ Transfer rate:这些请求在单位时间内从服务器取得的数据长度,等于Total transferred/

    ## 3.4 持久链接##

        持久连接(Keep-Alive)又称长连接,指TCP连接中持续发送多份数据而不断开的连接,
        与之对应的称为短连接,就是连接后发送一次数据便断开的连接。TCP三次捤手需要交换三个分组的数据,
        而交换数据需要耗费一定时间。在允许的情况下,连接次数越少,越有利于性能的提升。
        
        HTTP长连接的实施需要浏览器和Web服务器共同协助完成。一方面,浏览器需要保持一
        个TCP连接不能释放,并且不断地发生多个请求。另一方面,服务器不能过早地主动关闭连
        接。目前的浏览器普遍支持长连接,只需要在发出的HTTP请求数据头中包含相关长连接声明
        即可如下所示:
        Connection:Keep-Alive
        这个声明告诉服务器:如果可以,请让我重用这个连接。告诉服务器不要在处理完当前请
        求后马上关闭连接,同时,Web服务器必须打开长连接的支持。目前所有主流Web服务器软件都支持长连接。
        注意TCP连接是双向的,任何一方都可以主动关闭连接。所以,当浏览器与Web服务器设置
        的超时时间不一致时,将以最短的超时时间为准。在请求大量小文件时,长连接能够有效地减少重新建立连接的开销。
        在启动ab时加上“-k”参数可以使用Keep-Alive模式进行测试。
        
        注意长连接不一定都是正效应,也可能影响服务器的并发性能。
        
    ##3.5 MySQL响应速度提高方案: HandlerSocket##

        日本DeNA公司架构师Yoshinori开发的HandlerSocket,以MySQL Plugin的形式运行,在
        MySQL体系架构中绕开SQL解析这层,使得应用程序直接和InnoDB存储引擎交互,通过合并
        写人、简单协议等手段提高数据访问的性能,在CPU密集型应用中优势尤其明显。
        HandlerSocket解决了缓存问题,InnoDB有成熟的解决方案,通过参数配置用于缓存数据的
        内存大小。只要参数分配合理,应用程序就能在无须干涉的情况下实现热点数据的缓存,降低
        缓存维护成本。

    ## 3.6 Web应用加速方案: Varnish##

        在没有任何优化的情况下,每一个HTTP请求,Web服务器都必须从服务器磁盘中读取请
        求页面的数据,然后发送给客户端。相对内存访问速度来说,磁盘访问的速度极其缓慢(内存
        访问速度是磁盘访问速度的105 ~106倍)。把访问过的页面缓存到内存中,下次访问直接从内
        存中读取,能有效加快Web应用的访问速度。

    ###3.6.1 传统代理与反向代理###

        一般情况下,使用浏览器直接连接其他Internet站点取得网络信息,直接联系到目的站点
        服务器,目的站点服务器把信息传送回来。介于客户端和Web服务器之间的另一台服务器称为代理服务器,
        浏览器不直接到Web服务器取回网页,而向代理服务器发出请求,信号先送到代理服务器,
        由代理服务器取回浏览器所需要信息并传送给浏览器。


    文件査看工具 WinCacheGrind
    用WinCacheGrind打开这些文件,能看到每个文件中每个函数的运行消耗


    #4 yii2设计模式#

        依赖注入(Denpdency Injection, DI)和服务定位器(Service Locator)两种模式
        详情参考:http://www.digpage.com/di.html
        依赖注入(Dependence Injection, DI)
        
        DI是IoC的一种设计模式,是一种套路,按照DI的套路,就可以实现IoC,就能符合DIP原则。 DI的核心是把类所依赖的单元的实例化过程,放到类的外面去实现。
        
        

  • 相关阅读:
    存储过程
    pl/sql锁
    事务处理
    记录类型(学习笔记)
    ExecutorException: A query was run and no Result Maps were found for the Mapped Statement ''. It's likely that neither a Result Type nor a Result Map was specified.
    element中的el-form踩的坑
    关于location.href家族的区别和用法
    ajax的路径跳转
    使用thymeleaf模板引擎时的路径问题
    关于mybatis的传多个参数的问题
  • 原文地址:https://www.cnblogs.com/yifan72/p/5802956.html
Copyright © 2020-2023  润新知