您的位置:首页 > 编程语言 > PHP开发

PHP理论知多少

2019-01-12 01:04 162 查看
版权声明:俗世凡人行(释) QQ:748507607 https://blog.csdn.net/weixin_41887155/article/details/86328229

目录

1、面对对象思想

2、MVC设计模式

3、Mysql优化

4、三范式

5、存储引擎

6、索引

7、缓存

8、memcache和redis的区别

9、支付宝流程怎么实现的

10、App接口

11、单点登录

12、第三方登录

13、真静态

 14、OB系列函数 OB缓冲 

15、伪静态

16、主从复制

17、读写分离

18、负载均衡

19、网络七层协议

20、Ajax工作原理

21、首页的延迟加载

22、sphinx中文搜索

23、RBAC权限管理

23、浅谈Nginx

1、面对对象思想

=>定义: 简称OOP,是一种计算机编程架构,OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成;

=>特点: 封装、继承、多态;

=>优点:易维护、质量高、效率高、易扩展;

2、MVC设计模式

=>核心思想:将界面和业务逻辑分离;

=>Model(模型层):是程序的主体部分,主要包含业务数据和业务逻辑;在模型层,还会涉及到用户发布的服务,在服务中根据不同的业务需求,更新业务模型中的数据;

=>View(视图层):是程序呈现给用户的部分,使用户和程序交互的接口,用户会根据具体的业务需求,在View视图层输入自己特定的业务数据,并通过界面的事件交互,将对应输入的参数提交给后台控制器进行处理;

=>Contorller(控制器层):是用来处理用户输入数据,已经更新业务模型的部分;控制器接收了用户与界面交互时传递过来的数据,并根据数据业务逻辑来执行服务的调用和更新业务模型的数据和状态;

3、Mysql优化

=>设计角度:存储引擎的选择,字段类型的选择,范式;

=>功能角度:可以利用mysql自身特性,如索引、查询缓存、碎片整理、分区、分表;

=>sql语句方面:尽量简化查询语句,能查询字段少就尽量少查询字段,优化分页语句、分组语句、多表联查语句等;

=>部署大负载架构体系:数据库服务器单独分离出来,负载大时可以采用主从热备读写分离机制进行设计;

=>从硬件上升级数据库服务器;

4、三范式

我们在数据库表设计时,要遵循三范式:

=>第一范式:就是数据表的列不可再分;

=>第二范式:首先满足第一范式,并且表中非主键列完全依赖主键;

=>第三范式:满足第二范式,并且表中的列不存在对非主键列的传递依赖;

5、存储引擎

常用的主要分为两种,一种是innodb,一种是myisam,两者的主要区别是:

=> myisam不支持事务处理,而innoDB支持事务处理;

=> myisam 不支持外键,innoDB支持外键;

=> myisam支持全文检索,而innoDB在MySQL5.6版本之后才支持全文检索;

=> 数据的存储形式不一样,mysiam表存放在三个文件:结构、索引、数据,innoDB存储把结构存储为一个文件,索引和数据存储为一个文件;

=> myisam在查询和增加数据性能更优于innoDB,innoDB在批量删除方面性能较高。

=> myisam支持表锁,而innoDB支持行锁;

6、索引

索引主要有4种:

=>主键索引:数据记录里面不能有null,数据内容不能重复,在一张表里面不能有多个主键索引;

=>普通索引:使用字段关键字建立的索引,主要是提高查询速度;

=>唯一索引:字段数据是唯一的,索引列的值允许有空值,在一张表里面,是可以添加多个唯一索引;

=>全文索引:在比较老的版本中,只有myisam引擎支持全文索引,在innodb5.6后引擎也支持全文索引,在mysql中全文索引不支持中文。我们一般使用sphinx集合coreseek来实现中文的全文索引;

7、缓存

主要运用到以下6种缓存:

数据缓存;页面缓存;时间触发缓存;内容触发缓存;静态缓存;内存缓存;

8、memcache和redis的区别

两者都是用于数据的缓存的非关系型数据库

=>从数据存储位置上来分:memcache的数据存在内存中,而redis既可以存储在内存中,也可以存储的到磁盘中,达到持久化存储的功能,memcache一旦断电,数据全部丢失,redis可以利用快照和AOF把数据存到磁盘中,当恢复时又从磁盘中读取到内存中,当物理内存使用完毕后,可以把数据写入到磁盘中。

=>从存储数据的类型上来分:memcache和redis存储的方式都是键值对,只不过redis值的类型比较丰富,有string(字符串),hash(哈希),list(列表),set(集合)zset(有序集合),而memcache主要存储的是字符串。

=>从架构层次来分:Redis支持master-slave(主—从)模式应用,memcache支持分布式。

=>从存储数据的大小上来分: Redis单个value的最大限制是1GB,memcache只能保存1MB的数据。但是Memcache在存储100K以上的数据,性能稍微好一点。

=>另外redis只支持单核,memcache可以支持多核,当然关于redis取代memcache的说法,在一般情况下,两者性能都很高,在大多的业务场景选择上,redis的选择可能更加具有优势,但也不能说可以完全取代,最终还是取决于你的应用场景。

MongoDB:主要用在查询和储存大数据方面,是最接近数据库的文档型的非关系数据库

9、支付宝流程怎么实现的

=>首先要有一个支付宝账号,接下来向支付宝申请在线支付业务,签署协议;

=>协议生效后有支付宝一方会给网站方一个合作伙伴ID,和安全校验码,有了这两样东西就可以按照支付宝接口文档开发支付宝接口了,中间主要涉及到一个安全问题;

=>整个流程是这样的:我们的网站通过post传递相应的参数(如订单总金额,订单号)到支付页面,支付页面把一系列的参数经过处理,以post的方式提交给支付宝服务器,支付宝服务器进行验证,并对接收的数据进行处理,把处理后的结果返回给我们网站设置的异步和同步回调地址,通过相应的返回参数,来处理相应的业务逻辑,比如返回的参数代表支付成功,更改订单状态;

10、App接口

=>接口安全方面怎么处理

   使用HTTP的POST方式,对固定参数+附加参数进行数字签名,使用的是md5加密,比如:我想通过标题获取一个信息,在客户端使用 信息标题+日期+双方约定好的一个key通过md5加密生成一个签名(sign),然后作为参数传递到服务器端,服务器端使用同样的方法进行校验,如何接受过来的sign和我们通过算法算的值相同,证明是一个正常的接口请求,我们才会返回相应的接口数据。

=>接口分类:数据线接口和应用型接口

->数据型接口:是比抽象类更抽象的某种“结构”——它其实不是类,但是跟类一样的某种语法结构,是一种结构规范,规范我们类要以什么格式进行定义,一般用于团队比较大,分支比较多的情况下使用;

->应用型接口:API(application interface) 数据对外访问的一个入口。

APP开发中接口的编写,客户端需要什么样的数据,我们就给他们提供相应的数据,数据以json/xml的格式返回,并且配以相应的接口文档;

11、单点登录

=>定义:

单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任。

=>实现原理:

当用户第一次访问应用系统的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行身份校验,如果通过校验,应该返回给用户一个认证的凭据--ticket;用户再访问别的应用的时候,就会将这个ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把 ticket送到认证系统进行校验,检查ticket的合法性。如果通过校验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。

=>实现主要技术点:

   A、两个站点共用一个数据验证系统;

   B、主要通过跨域请求的方式来实现验证及session处理。

=>Session跨域问题的解决:

=>更改配置文件,让session存储在memcache中;

=>存储在文件中;

=>存储在数据库中;

12、第三方登录

第三方登陆主要是基于author协议来实现,下面简单说下实现流程:

=>首先我们需要以开发者的身份向第三方登陆平台申请接入应用,申请成功后,我们会获得一个appID和一个secrectID;

=>当我们的网站需接入第三方登陆时,会引导用户跳转到第三方的登陆授权页面,此时把之前申请的appID和secrectID带给登陆授权页面;

=>用户登陆成功后即得到授权,第三方会返回一个临时的code给我们的网站。

=>我们的网站接收到code后,再次向我们的第三方发起请求,并携带接收的code,从第三方获取access_token;

=>第三方处理请求后,会返回一个access_token给我们的网站,我们的网站获取到access_token后就可以调用第三方提供的接口了,比如获取用户信息等。最后把该用户信息存入到我们站点的数据库,并把信息保存到session中,实现用户的第三方登陆。

QQ的第三方登录结合了openid,用户用access_token可以获得openid,由于openid与QQ用户是一一对应的,通过access+openid就可以获得用户的基本信息了;

第三方与本地用户系统结合的三种情况:

=>本地未登录,第一次登录第三方:此时相当于注册,直接把第三方信息拉取并注册成为本地用户即可;

=>本地未登录,再次登录第三方:此时用户已经注册过了,获取到openid后直接找出对应的本地用户即可;

=>本地已经登录,并绑定过第三方,这个只要获取到openid绑定到本地用户即可。

13、真静态

这里要说的真静态指的是页面静态化,也即生成实实在在的静态文件,即不需要查询数据库就可以直接输出静态文件;

它的实现方式主要有两种:

=>添加信息入库时生成的静态页面,即模板替换技术;主要用在后台,用于一些基本上很少变化的信息上,在添加信息的时候使用添加的信息来替换制定好的模板中的内容,达到生成静态文件的目的,这样在前台访问该信息时,可以直接从生成好的静态文件中获取信息,如一些CMS系统。

=>用户在访问我们的页面时先判断是否有对应的缓存文件存在,如果存在就读缓存,不存在就读数据库,同时生成缓存文件。

这种实现的主要原理是基于PHP中的OB缓冲技术来实现的,当没有静态文件时,从数据库中读取,读取的数据使用OB缓存,使用相关的函数从OB缓冲中读取数据,写入到文件中,形成静态文件。当然这个过程中要考虑静态文件的缓存周期问题,我们可以根据文件的最后修改时间和当前时间及设定的缓存时间来定时更新缓存文件。

 14、OB系列函数 OB缓冲 

=> ob_start()  //打开缓冲区,所有输出的信息不直接发送到浏览器,而是保存在缓冲区里面;

=> ob_clean()  //删除内部缓冲区的内容,不关闭缓冲区(不输出);

=> ob_end_clean() //删除内部缓冲区的内容,关闭缓冲区(不输出);

=> ob_get_clean() //返回内部缓冲区的内容,关闭缓冲区。【相当于执行 ob_get_contents() and ob_end_clean()】(不输出);

=> ob_flush() //发送内部缓冲区的内容到浏览器,删除缓冲区的内容,不关闭缓冲区(输出 );  

=> ob_end_flush() //发送内部缓冲区的内容到浏览器,删除缓冲区的内容,关闭缓冲区(输出);

=> ob_get_flush() //返回内部缓冲区的内容,并关闭缓冲区的内容;

=> ob_get_contents()//返回缓冲区的内容,不输出;

=> ob_get_length() //返回内部缓冲区的长度,如果缓冲区未被激活,该函数返回 false;

15、伪静态

=> 目的:

伪静态不是真正意义上的静态化,之所以使用伪静态,主要是为了SEO推广,搜索引擎对动态的文件获取难度大,不利于网站的推广。

=> 伪静态的实现原理:

主要是基于apache/nginx等web服务器的rewrite机制。利用Apache/nginx里面相关的服务器变量和指令来完成重写。

=> 伪静态主要有两种方式:

1)、直接在配置虚拟机的位置配置伪静态,这个每次修改完成后需要重启web服务器;

2)、采用分布式的,可以在网站的根目录上创建.htaccess的文件,在里面配置相应的重写规则来实现伪静态,这种每次重写时不需要重启web服务器,且结构上比较清晰;

16、主从复制

=>目的:为了保证多台数据库数据的一致性,需要主从复制。

=>主从复制的实现原理是:

mysql中有一种日志,叫做bin日志(二进制日志),会记录下所有修改过数据库的sql语句。主从复制的原理实际是多台服务器都开启bin日志,然后主服务器会把执行过的sql语句记录到bin日志中,之后从服务器读取这个bin日志,把该日志的内容保存到自己中继日志里面,从服务器再把中继日志中记录的sql语句同样的执行一遍。这样从服务器上的数据就和主服务器相同了。

17、读写分离

当我们的数据量很大时,数据库服务器的压力变大,这时候我们需要从架构方面来解决这一问题,在一个网站中读的操作很多,写的操作很少,这时候我们需要配置读写分离,把读操作和写操作分离出来,最大程度的利用好数据库服务器。读写分离的实现原理就是在执行SQL语句的时候,判断到底是读操作还是写操作,把读的操作转向到读服务器上(从服务器,一般是多台),写的操作转到写的服务器上(主服务器,一般是一台,视数据量来看);

18、负载均衡

负载均衡 (Load Balancing) 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力,同时能够提高网络的灵活性和可用性。目前使用最为广泛的负载均衡软件是Nginx、LVS、HAProxy。

负载均衡产品中的关键指标:调度(目前常用的调度算法)算法:

A.轮询(Round Robin):新的连接被依次轮询分发到各个服务器上,比如第一个连接分发到第一台服务器上,第二个连接分发到第二台服务器上,依次轮询。轮询算法适合于服务器组中的所有服务器都有相同的软硬件配置并且平均服务请求相对均衡的情况。

B.加权轮询(Weighted Round Robin):根据服务器的不同处理能力,给每个服务分配不同的权值,使其能够接受相应权值数的服务请求。假设三台服务器加权分别为2:5:3,这样6条流过来,第一台服务器分担1条流,第二台服务器分担3条流,第三台服务器分担2条流。加权轮询算法能够确保高性能的服务器得到更多的使用率,避免低性能的服务器负载过重。

C.最少连接(Least Connections):最少连接均衡算法对内部中需负载的每一台服务器都有一个数据记录,记录当前该服务器正在处理的连接数量,当有新的服务连接请求时,将把当前请求分配给连接数最少的服务器,使均衡更加符合实际情况,负载更加均衡,最少连接算法适合长时处理的请求服务,如FTP。

D.加权最少连接(Weighted Least Connections):将加权与最少连接算法配合,根据连接数与加权比例后计算出当前新连接应该发往那个服务器。

E.随机(Random):将新连接随机分发给具体的实服务器。

F.加权随机(Weighted Random):将加权与随机算法配合,根据随机数与加权比例后计算出当前新连接应该发往哪个服务器。

G.原地址散列(Source Hashing):根据新连接的源IP地址进行散列(Hash)的结果来决定将该新连接发往哪个实服务器。一般来说,来自相同客户端的新连接会被散列到相同的实服务器。

19、网络七层协议

OSI是一个开放性的通信系统互连参考模型,他是一个定义得非常好的协议规范。OSI模型有7层结构,每层都可以有几个子层。 OSI的7层从上到下分别是 7应用层 

6表示层 5会话层 4传输层 3网络层 2数据链路层 1物理层 ;其中高层(即7、6、5、4层)定义了应用程序的功能,下面3层(即3、2、1层)主要面向通过网络的端到端的数据流

=>应用层

与其它计算机进行通讯的一个应用,它是对应应用程序的通信服务的。例如,一个没有通信功能的字处理程序就不能执行通信的代码,从事字处理工作的程序员也不关心OSI的第7层。但是,如果添加了一个传输文件的选项,那么字处理器的程序员就需要实现OSI的第7层。示例:TELNET,HTTP,FTP,NFS,SMTP等。

=>表示层

这一层的主要功能是定义数据格式及加密。例如,FTP允许你选择以二进制或ASCII格式传输。如果选择二进制,那么发送方和接收方不改变文件的内容。如果选择ASCII格式,发送方将把文本从发送方的字符集转换成标准的ASCII后发送数据。在接收方将标准的ASCII转换成接收方计算机的字符集。示例:加密,ASCII等。

=>会话层

它定义了如何开始、控制和结束一个会话,包括对多个双向消息的控制和管理,以便在只完成连续消息的一部分时可以通知应用,从而使表示层看到的数据是连续的,在某些情况下,如果表示层收到了所有的数据,则用数据代表表示层。示例:RPC,SQL等。

=>传输层

这层的功能包括是否选择差错恢复协议还是无差错恢复协议,及在同一主机上对不同应用的数据流的输入进行复用,还包括对收到的顺序不对的数据包的重新排序功能。示例:TCP,UDP,SPX。

=>网络层

这层对端到端的包传输进行定义,它定义了能够标识所有结点的逻辑地址,还定义了路由实现的方式和学习的方式。为了适应最大传输单元长度小于包长度的传输介质,网络层还定义了如何将一个包分解成更小的包的分段方法。示例:IP,IPX等。

=>数据链路层

它定义了在单个链路上如何传输数据。这些协议与被讨论的各种介质有关。示例:ATM,FDDI等。

=>物理层

OSI的物理层规范是有关传输介质的特这些规范通常也参考了其他组织制定的标准。连接头、帧、帧的使用、电流、编码及光调制等都属于各种物理层规范中的内容。物理层常用多个规范完成对所有细节的定义。示例:Rj45,802.3等。

20、Ajax工作原理

Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面。这其中最关键的一步就是从服务器获得请求数据。要清楚这个过程和原理,我们必须对 XMLHttpRequest有所了解。 XMLHttpRequest是ajax的核心机制,它是在IE5中首先引入的,是一种支持异步请求的技术。简单的说,也就是javascript可以及时向服务器提出请求和处理响应,而不阻塞用户,达到无刷新的效果。

21、首页的延迟加载

延迟加载也称为惰性加载,即在长网页中延迟加载图像。用户滚动到它们之前,视口外的图像不会加载。这与图像预加载相反,在长网页上使用延迟加载将使网页加载更快。

可以通过js代码来实现。

参考资源:https://www.geek-share.com/detail/2651604903.html

22、sphinx中文搜索

当对大文本数据进行单词匹配查询时,如:有一个歌曲网站,数据库中收集着上百万首歌曲的信息,如果要查询出歌词中带“爱情”的所有歌曲,典型的做法是执行如下SQL语句:

SELECT * FROM songs WHERE content LIKE "%爱情%"。

但是在MYSQL中以%开头的查询无法使用索引,所以这条SQL语句将执行全表扫描,性能极差。MyISAM引擎中的全文索引是专门对文本创建索引的,但对中文的支持不好。

Coreseek 是一款中文全文检索/搜索软件,基于Sphinx研发并独立发布,专攻中文搜索和信息处理领域,适用于行业/垂直搜索、论坛/站内搜索数据库搜索、文档/文献检索、信息检索、数据挖掘等应用场景;

sphinxcoreseek的原理

第一步:对应数据源建立索引

中文分词技术

今天             1

下雨             1

明天             1,2,3

学习             2

第二步:执行查询,返回查询到单词所在,mysql里面记录的id;

php要把查询的单词给sphinx软件,软件拿到要查询的单词后,从索引里面进行匹配。返回该单词在mysql表里面记录的id

php拿到单词所在的id后,根据该id去mysql里面查找数据。

23、RBAC权限管理

RBAC三个著名的安全原则:最小权限原则责任分离原则和数据抽象原则

=>最小权限原则之所以被RBAC所支持,是因为RBAC可以将其角色配置成其完成任务所需要的最小的权限集;

=>责任分离原则可以通过调用相互独立互斥的角色来共同完成敏感的任务而体现;

=>数据抽象可以通过权限的抽象来体现;

实现:

=>三表实现,分别是用户表,功能表,用户功能关联表,让用户通过关联表直接分配功能;这种方案简单,但是用户一多就会比较乱;

=>五表实现,分别是用户表,角色表,功能表,用户角色关联表,角色功能关联表,每个用户都扮演一个角色,,每个角色都对应若干功能,通过给角色分配功能,给用户分配角色来实现权限管理。

 

 

 

 

23、浅谈Nginx

Nginx的优点是:(应用层)

1. 工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构,它的正则规则比HAProxy更为强大和灵活,这也是它目前广泛流行的主要原因之一,Nginx单凭这点可利用的场合就远多于LVS了。 

2. Nginx对网络稳定性的依赖非常小,理论上能ping通就就能进行负载功能,这个也是它的优势之一;相反LVS对网络稳定性依赖比较大,这点本人深有体会; 

3. Nginx安装和配置比较简单,测试起来比较方便,它基本能把错误用日志打印出来。LVS的配置、测试就要花比较长的时间了,LVS对网络依赖比较大。 

4. 可以承担高负载压力且稳定,在硬件不差的情况下一般能支撑几万次的并发量,负载度比LVS相对小些。 

5. Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点,不过其中缺点就是不支持url来检测。比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中出现故障,Nginx会把上传切到另一台服务器重新处理,而LVS就直接断掉了,如果是上传一个很大的文件或者很重要的文件的话,用户可能会因此而不满。 

6. Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的Web应用服务器。LNMP也是近几年非常流行的web架构,在高流量的环境中稳定性也很好。 

7. Nginx现在作为Web反向加速缓存越来越成熟了,速度比传统的Squid服务器更快,可以考虑用其作为反向代理加速器。 

8. Nginx可作为中层反向代理使用,这一层面Nginx基本上无对手,唯一可以对比Nginx的就只有 lighttpd了,不过 lighttpd目前还没有做到Nginx完全的功能,配置也不那么清晰易读,社区资料也远远没Nginx活跃。 

9. Nginx也可作为静态网页和图片服务器,这方面的性能也无对手。还有Nginx社区非常活跃,第三方模块也很多。

Nginx的缺点是:

1. Nginx仅能支持http、https和Email协议,这样就在适用范围上面小些,这个是它的缺点。
2. 对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测。不支持Session的直接保持,但能通过ip_hash来解决。

LVS:使用Linux内核集群实现一个高性能、高可用的负载均衡服务器,它具有很好的可伸缩性(Scalability)、可靠性(Reliability)和可管理性(Manageability)。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: