1,PHP魔术方法
    1.__construct(),类的构造函数
    2.__destruct(),类的析构函数
    3.__call(),在对象中调用一个不可访问方法时调用
    4.__callStatic(),用静态方式中调用一个不可访问方法时调用
    5.__get(),获得一个类的成员变量时调用
    6.__set(),设置一个类的成员变量时调用
    7.__isset(),当对不可访问属性调用isset()或empty()时调用
    8.__unset(),当对不可访问属性调用unset()时被调用。
    9.__sleep(),执行serialize()时,先会调用这个函数
    10.__wakeup(),执行unserialize()时,先会调用这个函数
    11.__toString(),类被当成字符串时的回应方法
    12.__invoke(),调用函数的方式调用一个对象时的回应方法
    13.__set_state(),调用var_export()导出类时,此静态方法会被调用。
    14.__clone(),当对象复制完成时调用
    15.__autoload(),尝试加载未定义的类
    16.__debugInfo(),打印所需调试信息
2 .PHP设计模式如何实现?
    1,单例模式:解决的是如何在整个项目中创建唯一对象实例的问题,
    2,工厂模式:工厂方法或者类生成对象,而不是在代码中直接new。
    3, 注册模式:解决全局共享和交换对象
    4, 适配器模式: 将各种截然不同的函数接口封装成统一的API。
    5, 策略模式:将一组特定的行为和算法封装成类,以适应某些特定的上下文环境。
    6, 观察者模式(Observer),当一个对象状态发生变化时,依赖它的对象全部会收到通知,并自动更新。
    7, 原型模式:(对象克隆以避免创建对象时的消耗)
    8, 装饰器模式:可以动态的添加修改类的功能
3 .PHP框架,框架优缺点
    ThinkPHP(FCS)是一个轻量级的中型框架
        优点:易于上手,有丰富的中文文档,兼容性较强,适合用于中小项目的开发
        缺点:.对Ajax的支持不是很好,目录结构混乱,需要花时间整理,上手容易,但是深入学习较难。
    Yii 是一个基于组件的高性能php框架,用于开发大型Web应用。
        优点:纯OOP,用于大规模Web应用,模型使用方便,开发速度快,运行速度也快。性能优异且功能丰富
        缺点:对Model层的指导和考虑较少,文档实例较少,要求PHP技术精通,OOP编程要熟练!,View不理想涉及PHP代码。
    Laravel 的设计思想是很先进的,非常适合应用各种开发模式TDD(测试驱动编程), DDD 和BDD,
        优点:集合了php 比新的特性,以及各种各样的设计模式,Ioc 容器,依赖注入等。
        缺点:基于组件式的框架,所以比较臃肿
4 .mysql索引
    索引类型
        1.普通索引 NORMAL 大多数情况下都可以使用
        2.唯一索引 unique 不允许重复的索引
        3.全文索引 fulltext 在检索长文本的时候
        4.空间索引 SPATIAL  空间索引是对空间数据类型的字段建立的索引
    索引方法
        1、BTREE(B树(可以是多叉树)) {主流使用}
        2、HASH(key,value) 这种方式对范围查询支持得不是很好
5.innodb
    InnoDB的聚簇索引:
    InnoDB对主键建立聚簇索引。
    如果你不指定主键,InnoDB会用一个具有唯一且非空值的索引来代替。
    如果不存在这样的索引,InnoDB会定义一个隐藏的主键,然后对其建立聚簇索引。

    MySQL的存储引擎到目前为止都不支持
6 .mysql分库分表,锁,主从,binlog
    分库分表:分库分表实际上是分布式存储中一种数据分片的解决方案
        垂直拆分:业务维度分成不同的表
        水平拆分:单一表的数据拆分成多个表存储 (表结构不变)
        分库分表引入了分库分表键,是对数据库做分库分表所依据的字段,加入映射表。

    主从分离:
        1)主从复制使用的是binlog 异步的方式
        2)开启了dump log 线程 从库写入relay log减少主从延时
    锁
        共享锁(读锁):其他事务可以读,但不能写。
        排他锁(写锁) :其他事务不能读取,也不能写。

        表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
        行级锁只在存储引擎层实现,而Mysql服务器层没有实现。
7 .redis存储类型,多线程,持久性存储?
    redis基于内存的单线程 数据库
    存储类型:String hash, list,set 

    多线程是多个Redis客户端使用主线程I/O多路复用读取分发给子线程,子线程解析完请求还给主线程,数据库写入操作加入队列分发给子线程处理
    五种I/O模型介绍
    1.阻塞I/O模型
    2.非阻塞I/O模型
    3.I/O复用模型
        1.select/poll
        2.epoll
    4.信号驱动I/O模型
    5.异步I/O模型


    Redis持久化的两种方式
    redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)。
    RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上;
    AOF,则是换了一个角度来实现持久化,那就是将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。


8 .redis集群,雪崩,缓存穿透,队列
    集群
    Redis集群是一个分布式(distributed)、容错(fault-tolerant)的 Redis 实现, 集群可以使用的功能是普通单机 Redis 所能使用的功能的一个子集(subset)。
    不存在中心(central)节点或者代理(proxy)节点, 集群的其中一个主要设计目标是达到线性可扩展性(linear scalability)。
    Redis 集群提供了一种运行 Redis 的方式,其中数据在多个 Redis 节点间自动分区。
    Redis 集群还在分区期间提供一定程度的可用性,即在实际情况下能够在某些节点发生故障或无法通信时继续运行。

    雪崩是因为缓存层承载了大量的请求,有效的保护了存储层,但是如果缓存由于某些原因,整体不能够提供服务,于是所有的请求,
    就会到达存储层,存储层的调用量就会暴增,造成存储层也会挂掉的情况。
    // 解决方案
    (1)设置redis集群和DB集群的高可用,如果redis出现宕机情况,可以立即由别的机器顶替上来。
    (2)使用互斥锁
    (3)不同的key,可以设置不同的过期时间,让缓存失效的时间点不一致,尽量达到平均分布。
    (4)永远不过期

    缓存穿透: 缓存value为空;去访问DB。
    队列:   1、是队列结构的中间件
            2、消息放入后不需要立即处理
            3、由订阅者/消费者按顺序处理
    

9 .tcp协议三次握手
    OSI参考模型中的网络层,在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
    第一次握手:建立连接时,客户端发送位码syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
    第二次握手:服务器收到syn包,必须确认客户的syn(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
    第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
    完成三次握手,客户端与服务器开始传送数据
10 .冒泡排序算法, 快速排序算法 
    冒泡:比较相邻的两个元素,如果满足条件,就交换,否则不动。然后是再比较接下来的两个相邻的元素,然后满足条件就交换,否则依然不动。
    $len = count($arr);
    for($i = 0; $i< $len - 1; $i ++) {
        for($j  = 0; $j< $len - $i - 1; $j ++) {
            if($arr[$j] > $arr[$j + 1]) {
                $tmp  = $arr[$j];
                $arr[$j] = $arr[$j + 1];
                $arr[$j + 1] = $tmp;
            }
        }
    }
    快速:通过设置一个初始中间值,来将需要排序的数组分成3部,小于中间值放左边,大于中间值放右边,递归处理后合并数组
    function quick_sort($array){
        if(count($array) <= 1){
            return $array;
        }
        $middle = $array[0];
        $left = [];
        $right = [];
        for($i=1; $i < count($array); $i ++){
            if($array[$i] > $z) {
                $right[] = $array[$i];
            } else {
                $left[] = $array[$i];
            }
        }
        $left = quick_sort($left);
        $right = quick_sort($right);
        return array_merge($left, [$middle], $right);
    }

ll tcp,udp协议区别
 	TCP协议:传输控制协议。三次握手建立连接,提供了可靠的面向连接的字节流传输协议
    UDP协议:即用户数据报协议。传输之前不建立连接,提供了不可靠的无连接传输服务。
12 .socket
	socket来实现两个程序之间的通信
        1.php制作的socket服务端
            主要功能是设置socket通信的IP地址及端口号,监听端口,有客户端连接的话,接收连接请求接收数据,处理并且返回数据。
        2.调取socket服务的客户端文件
            客户端依然是要设置好要访问服务器的IP地址及端口号(即上一步骤中的IP及端口),完了创建一个socket连接,发送数据到服务器,接收返回数据。
        3.运行服务端代码后,再运行我们的客户端,来向服务器交互数据
13 .cookie session token
    cookie 是网站区分不同访问者的身份而存储在客户端上的数据,是一个文本文件。
        Cookie是具有时效性的,所以,Cookie的管理又分为持久化Cookie和非持久化Cookie。
        如果 cookie 不包含到期日期,则可视为会话 cookie(非持久化Cookie)。 会话 cookie 存储在内存中,决不会写入磁盘。 当浏览器关闭时,cookie 将从此永久丢失。
        如果 cookie 包含到期日期,则可视为持久性 cookie。 会话 cookie 存储在磁盘中,在指定的到期日期,cookie 将从磁盘中删除。
        cookie 不安全,解决方法:存储时可使用服务端appkey 来加密cookie信息,使用时再解密

    session 是一种会话,它记录会话信息z\在服务端,使得客户端与服务端的会话得以保持
        session 易丢失的解决方法
            1、session_start();应该尽量放置到页面的顶部;
            2、如果php.ini里面没有配置 session Autostart的话,每次会话之前,都得手动开启session:session_start();反正默认开启

    token 是用户身份的验证方式,我们通常叫它:令牌。
        最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法
        压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。还可以把不变的参数也放进token,避免多次查库。

14, nginx负载均衡
    1、轮询法
      将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。
    2、随机法
        通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。由概率统计理论可以得知,随着客户端调用服务端的次数增多,
    其实际效果越来越接近于平均分配调用量到后端的每一台服务器,也就是轮询的结果。
    3、源地址哈希法
        源地址哈希的思想是根据获取客户端的IP地址,通过哈希函数计算得到的一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。
    4、加权轮询法
      不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。
    5、加权随机法
        与加权轮询法一样,加权随机法也根据后端机器的配置,系统的负载分配不同的权重。不同的是,它是按照权重随机请求后端服务器,而非顺序。
    6、最小连接数法
        最小连接数算法比较灵活和智能,由于后端服务器的配置不尽相同,对于请求的处理有快有慢,它是根据后端服务器当前的连接情况,动态地选取其中当前
        积压连接数最少的一台服务器来处理当前的请求,尽可能地提高后端服务的利用效率,将负责合理地分流到每一台服务器。
15, linux性能优化
    1, 资源倾斜
    如果是固定配置的服务器方面进行优化,可以选择将服务器不安装其他后端服务软件,仅仅安装 PHP 以及其必要扩展。
    使单机的性能全部向 PHP 倾斜。同时也对 PHP 的相关参数进行优化,将 PHP 单机服务器性能最大化。
    在大数据、高并发的场景下,可以尝试将 PHP 服务器集群化,通过负载均衡,将网络请求分配至不同的 PHP 单机服务器处理。

    2,优化PHP性能
    PHP 语言级性能优化
        尽可能地使用内置函数来完成任务
        尽可能地使用高性能的内置函数来完成任务
        尽可能避免使用魔法方法来完成任务
        尽可能避免使用错误抑制符来完成任务
        尽可能避免使用正则表达式来完成任务
        尽可能避免在遍历或循环内做各种运算
        尽可能避免在计算密集型的业务中使用

16 分布式
分布式是一种解决方案,跟语言没有关系
分布式网络存储技术是将数据分散地存储于多台独立的机器设备上。分布式网络存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,不但解决了传统集中式存储系统中单存储服务器的瓶颈问题,还提高了系统的可靠性、可用性和扩展性。
php分布式是指多台服务器处理不同的工作,指的是业务上的一般,比如多台服务器有的处理日志分布到一些服务器,有的处理下单,分布到一些服务器。

17,高并发
    1、应用和静态资源分离
    将静态资源(js,css,图片等)放到专门的服务器中。
    2、页面缓存
    将应用生成的页面缓存起来可以节省大量cpu资源。对于部分页面经常变换数据的,可以使用ajax来处理。
    3、集群和分布式
    集群,多台服务器具有相同的功能,主要起分流的作用。分布式,将不同的业务放到不同的服务器中,处理一个请求可能需要多台服务器,进而提高一个请求的处理速度。
    又分为静态资源集群和应用程序集群。后者较复杂,经常要考虑session同步等问题。

    4、反向代理
        客户端直接访问的服务器并不是直接提供服务的服务器,它从别的服务器获取资源,然后将结果返回给用户。
        代理服务器和反向代理服务器:
        代理服务器是代我们访获取资源,然后将结果返回。例如,访问外网的代理服务器。反向代理服务器是我们正常访问一台服务器的时候,服务器自己调用了别的服务器。
        代理服务器我们主动使用,是为我们服务的,不需要有自己的域名;反向代理是服务器自己使用的,我们并不知道,有自己的域名。
    5、CDN
    CDN是一种特殊的集群页面缓冲服务器,和普通的集群的多台页面缓冲服务器相比主要区别是:其存放位置和分配请求方式不同。
    CDN的服务器分布在全国各地,接收到请求后会将请求分配到最合适的CDN服务器节点来获取数据。其每一个CDN节点就是一个页面缓存服务器。

    分配方式:
    并不是普通的负载均衡,而是专门的CDN域名解析服务器在解析域名的时候就分配好的。
    一般的做法是:ISP那里使用CNAME将域名解析到一个特定的域名,然后再将解析到的那个域名用专门的CDN服务器解析(返回给浏览器,再访问)到相应的CDN节点。每个节点可能也集群了多台服务器。

  

posted on 2022-03-02 11:43  皓月key  阅读(53)  评论(0编辑  收藏  举报