面试

计算机网络
1.为什么3次握手,4次挥手
2次握手不能确定双方的收发机制都是正常的
3次以上并不能够提高系统的可靠性
4次挥手是因为TCP是全双工通信,必须要双方确认断开信息

2.DNS的层次系统,什么是递归查询,什么是迭代查询
      DNS层次系统
      根域名服务器
      顶级域名服务器
      权限域名服务器
      本地域名
    递归查询
        一般用于主机向本地域名服务器查询
    迭代查询
    本地域名服务器向根域名服务器查询

3.服务器大量出现TIME_WAIT的原因和解决办法
出现TIME_WAIT是因为服务器主动断开,等待2MSL时间,优化系统内核参数,降低
    2MSL时间即可,循环使用虚拟IP地址
    CLOSED_WAIT 服务器程序本身问题,受到客户端断开连接请求后,不主动发送断开请求。使TCP状态一直处于CLOSED_WAIT
4.SYN攻击原理
     SYN攻击就是
    Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待
    Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将产时
    间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击
    时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机
    的,则可以断定遭到SYN攻击了,使用如下命令可以让之现行:
              #netstat -nap | grep SYN_RECV
5.拥塞控制和流量控制的原理
拥塞控制:
    慢启动
    最初的TCP在建立连接成功后,并不能一开始就大量发送数据包,只能根据网络情况逐步增加数据量(HTTP的持久连接就是为了避免TCP慢启动的措施),一般经过
    RTT*log2W时间就可以沾满带宽(带宽为w)
    拥塞避免
    在cwnd增长到一定达到慢启动门限的时候,慢启动过程结束,进入到拥塞避免阶段,cwnd不在指数增加,而是开始加法增加,可以避免增长过快导致网络拥塞,慢慢的调整到网络最佳值。

6.网络层的协议
     网络层是IP协议层
     包括 IP协议 ICMP ARP RARP DHCP 
     分类:内部网关协议(IGP)  RIP OSFP
               外部网关协议(EGP)BGP
      
7.OSI 7层模型 5层模型 4层模型
     7层模型:物理层 数据链路层 网络层 传输层 会话层 表示层  应用层
     5层模型   物理层 数据链路层 网络层 传输层 应用层
     4层模型   网络接口层   网际层   运输层  应用层
     8.TCP的建立和释放
      TCP的可靠传输是通过顺序编号和确认(ACK)来实现的。TCP在传送一个段时。为准备重传而将该段插入到发送队列
    当中。同时启动时钟,其后如果受到了(ACK)确认信息,就将该段从队列中删去,如果在规定的时间内,未受到ACK
    信息,则重新发送该段。TCP在协议中就对数据传输做了保障,握手和断开都需要通讯双方的确认,数据传输也需要
    双方确认成功。协议还规定了 分包 重组 重传等规则
    TCP面向流,UDP面向包。
    1.URG表示TCP紧急指针域有效,用来保证tcp的连接不中断。且督促中间层尽快处理这些数据。
    2.ACK表示应答域有效,1为有效,0反之。
    3.PSH表示push操作即数据到达接收端以后不进入缓冲区排队。立即进入应用程序。
    4.RST表示连接复位请求,用来复位那些产生错误的连接,也被用来拒绝错误和非法的数据包
    5.SYN表示同步序号,用来建立连接。SYN标志位和ACk标志位搭配使用。
    6.FIN表示发送端已经到达数据末尾。
    三次握手
    1.第一次握手:客户端将SYN标志位置为1,随机产生一个序列号的值seq=i;并将数据包发送给服务。端客户端进入 SYN_SENT状态
    2.第二次握手:服务端收到数据包后由SYN=1;得知客户端请求建立连接。客户端将标志位SYN和ACK都置为1.
    ack=i+1;随机产生一个序列号seq=y;并将数据包发送给客户端以确认连接请求,此时服务端进入SYN_RCVD状态
    3.第三次握手:客户端收到确认后,检查ack是否等于i+1;ACK是否为1.如果正确就将ACK置为1,ack=y+1;并将数
    据包发送给服务端。服务端检查正确后就连接建立成功。客户端和服务端同时建立ESTABLISHED状态,完成三次握手。开始传输数据。
          TCP连接时是全双工的。因此每个方向都必须单独进行关闭。这一原则是当一方完成数据发送任务后发送一个FIN来终止这一方向的连接。受到1个FIN  
         只意味着这一方向上没有数据流动了。即不会再受到数据。但是在这个TCp连接上仍能够发送数据。直到这一方向上也发送了FIN,首先关闭的一方将执
         行主动关闭。而另一方执行被动关闭。
    1.第一次挥手:客户端发送一个FIN,用来关闭客户端到服务端的数据传输。客户端进入到FIN_WAIT_1状态。
    2.第二次挥手:服务端受到FIN后发送一个ACK,确认序号为受到序号+1;服务端进入CLOSE_WAIT状态。
    3.第三次挥手:服务端发送一个FIN,用来关闭服务端到客户端的数据传输,服务端进入到LAST_ACK状态。
    4.第四次挥手:客户端受到FIN后进入到TIME_WAIT状态并发送ACK给服务端,服务端进入CLOSED状态
9.拥塞控制
     拥塞控制:
    慢启动
    最初的TCP在建立连接成功后,并不能一开始就大量发送数据包,只能根据网络情况逐步增加数据量(HTTP的持久连接就是为了避免TCP慢启动的措施),一般经过
    RTT*log2W时间就可以沾满带宽(带宽为w)
    拥塞避免
    在cwnd增长到一定达到慢启动门限的时候,慢启动过程结束,进入到拥塞避免阶段,cwnd不在指数增加
     
10.IP地址的划分
    A类地址:1.0.0.0 ——126.0.0.0
    B类地址:128.0.0.0——191.255.255.255
    C类地址:192.0.0.0——223.255.255.255;
    ip地址的划分规则
    ip地址=网络地址+主机地址  或
    IP地址=网络地址+子网地址+主机地址

    A类地址由1个字节的网络地址和3个字节的主机地址组成,网络地址以0开头。
    B类地址由2个字节的网络地址和2个字节的主机地址组成,网络地址以10开头,
    C类地址由3个字节的网络地址和1个字节的主机地址组成,网络地址以110开头。-
    D类地址为多播地址。由1110开头。
    E类地址为保留地址,由1111开头。
一次网络请求的流程
首先建立一个socket连接,socket连接是通过IP和端口建立的,再次之间有一个DNS解析过程
建立成功后开始发送HTTP请求交流然后关闭。
在应用层,将要发送的数据放到缓冲区内,形成应用层的报文
这些数据通过传输层发送,如TCP,tcp是端到端的链接,负责差错控制流量控制数据排序
编译原理

有限状态机的概念,以及应用场景
     状态机是表示有限个状态及其这些状态之间的转移和动作行为的数学模型
     应用在计算机处理,游戏设计当中,以及编译器工作
编译器如何匹配a+b*c

数据库
1.Having和where区别
    1.having字句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中常包含聚组函数,适用having条件过滤出特定的组,也可使用多个分组标准进行分组。
    2.where子句的作用是对查询结果进行分组前,将不符合where条件的行去掉,即在分组前过滤数据,where条件中不能包含聚组函数,使用where条件过滤出特定的行。
2.什么是聚集索引
聚集索引确认表中的物理顺序,聚集索引规定了数据在物理上的排列顺序和逻辑上的排列顺序相一致,在搜索范围上效率高(局部性原则)。CLUSTERED INDEX聚集索引  UNIQUE CLUSTERED INDEX 唯一聚集索引
3.什么是索引
     索引是对数据库表中一列或多列的值进行排序的一种结构,没有索引查询将会进行全表扫描,有索引,则在索引字段扫描后再定位到表中的记录。INDEX
4.索引的实现原理
在Mysql中的INnodb和MyIsam中索引是有B+树实现的。B+树是一种多路平衡查找树,
1.有n棵字数的节点包含了n个关键字,每一个关键字不保存数据,只是用来做索引,且数据都保存在叶子节点上
2.所有的叶子节点包含了全部的关键字信息,及其指针叶子节点依照关键字大小顺序连接的
3.所有的非终端节点可以看成索引,b+树一般包含两个头结点 一个指向根节点,一个指向最小节点

5.数据库范式
    第一范式 所有属性不可分。
    第二范式没有包含主键的列必须完全依赖主键。
    第三范式 不传递函数依赖
    1NF:原子性 字段不可再分,否则就不是关系数据库;
    2NF:唯一性 一个表只说明一个事物;
    3NF:每列都与主键有直接关系,不存在传递依赖;
6数据一致性
ache服务器和MYsql数据一致性
7.数据库的连接池
php不支持数据库的连接池,有pconnect函数
8.事务的特性
ACID

9.脏读幻读和不可重复度
     脏读:事务可以读取其他事务没有提交的数据
    不可重复读:事务读取以前读取的事务,发现了其他事务修改或删除了要读的数据 (修改)
    幻读:事务再次查询,发现了已经提交的事务插入了新的满足条件的数据(数量改变)
    这个由事务的隔离性的级别来保证 一共5中级别 read_commited可以防止脏读是默认的级别,级别太高会影响效率。
    1.脏读:修改时增加排它锁,事务提交后释放,读取时加共享锁
    2.不可重复读:读取加共享,写时加排他
    3.幻读,标的范围设定为只读权限,
10.为什么说B+树比B 树更适合实际应用中操作系统的文件索引和数据库索引?
  1. B+树的磁盘读写代价更低
  2. B+树的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B 树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了。
  3. 举个例子,假设磁盘中的一个盘块容纳16bytes,而一个关键字2bytes,一个关键字具体信息指针2bytes。一棵9阶B-tree(一个结点最多8个关键字)的内部结点需要2个盘快。而B+树内部结点只需要1个盘快。当需要把内部结点读入内存中的时候,B 树就比B+树多一次盘块查找时间(在磁盘中就是盘片旋转的时间)。
  4. B+树的查询效率更加稳定
  5. 由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。
11.mysql引擎
  1. MysSQL是单进程多线程程序
  2. myisam 是Mysql的默认存储引擎
    加锁:对整张表进行加锁,而不是行。
    并发:在读数据的时候所有的表都可以获得共享锁,每个连接互相不干扰
    在写数据的时候,会获得排它锁,将整个表加锁,其他请求连接处于等待状态
    索引:索引文件和数据文件分开存储,索引经过压缩处理。
Innodb:支持外键 行锁,非锁定读 有共享表空间和独占表空间两种选择
    共享表空间不适合用于统计分析,日志系统
    单表空间
    优点:
    1.  每个表都有自已独立的表空间。
    2.  每个表的数据和索引都会存在自已的表空间中。
    3.  可以实现单表在不同的数据库中移动。
    4.  空间可以回收(除drop table操作处,表空不能自已回收)
    a)         Drop table操作自动回收表空间,如果对于统计分析或是日值表,删除大量数据后可以通过:alter table TableName engine=innodb;回缩不用的空间。
    b)         对于使innodb-plugin的Innodb使用truncate table也会使空间收缩。
    c)         对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理。
    缺点:
    单表增加过大,如超过100个G。
     二者索引实现不一样



    Innodb是行级锁,那个只是where对它主键是有效,非主键的都会锁全表的。
.索引的优化策略
适合建立索引的场景
    1.表的主键外键必须建立索引。
    2.经常与与其他表建立连接的表,在连接字段上建立索引
    3.索引建立在选择性高的字段上
    4.索引建立在短小字段上
    5.频繁进行数据操作的表不要建立索引
索引的优化
    1)不要有超过5个以上的表连接(JOIN)
    2)考虑使用临时表或表变量存放中间结果。
    3)少用子查询
    4)视图嵌套不要过深,一般视图嵌套不要超过2个为宜。
    5)不适用NOT IN操作,这种操作将不会使用索引,可用NOT EXISTS代替
    6)对于like的使用要慎重,避免选择不使用索引的like操作
    7)查询只是用一个索引,
    8)使用短索引
    9)不在含有NULL值中使用索引、

13.视图的创建及其作用
14.Group by和Having区别
select-from-where -group by having order by
where:过滤表中的数据条件
group by:将过滤的数据进行分组
having:对分组的数据进行过滤
order by: 按照什么顺序排列
15.MySQL慢查询优化

操作系统
1.并行并发区别
    并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。
    在操作系统中,并发是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只  
           有一个程序在处理机上运行。
    ①程序与计算不再一一对应,一个程序副本可以有多个计算
    ②并发程序之间有相互制约关系,直接制约体现为一个程序需要另一个程序的计算结果,间接制约体现为多个程序竞争某一资源,如处理机、缓冲区
   等。
    ③并发程序在执行中是走走停停,断续推进的。
2.线程进程区别
    (1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;
    (2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
    (3)线程是处理器调度的基本单位,但进程不是.
    (4)二者均可并发执行.
进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。
3.死锁的产生和解决
    死锁原因:1.竞争资源,当系统中多个进程使用共享资源。并且资源不足以满足需要,会引起进程对资源的竞争而
    产生死锁
               2.进程的推进顺序非法:请求和释放资源的顺序不当,也有可能产生死锁。
    死锁必要条件:1.互斥条件。
                    2.请求和保持条件
                    3.不剥夺条件
                    4.环路等待条件


5锁的优化策略
6页面置换LRU算法
LRU最近最久未使用算法
7.多线程中的锁如何处理
就是各种锁的应用场景
按需减小锁的粒度
8.多线程的请求处理
线程池原理
11.进程间通信

    1.管道
    2.有名管道
    3.信号量
    4.消息队列
    5.信号
    6.共享内存
    7.套接字
    8.高级管道
    其中共享内存速度最快
12.IO多路
13.线程间如何实现独立访问
    1.条件变量 (容易发生死锁,通常和互斥锁结合使用)
    2.互斥锁
    3.信号量(共有信号量和私有信号量)
13.线程的分类
 1.内核支持线程
 2.用户级别线程
14.互斥锁和自旋锁
自旋锁:运行效率高,但是占用cpu资源,降低cpu理由率,有可能造成死锁,一般用于多核服务器,锁定时间比较短的情况。
互斥锁:加锁解锁过程中有上下文切换,cpu抢占,信号发送等开销
应用:临界区有IO操作
     临界区代码复杂,有循环
     临界区竞争激烈
     单核处理
自旋互斥混合锁:用于锁定时间跨度大


软件工程
1.软件的开发流程
2瀑布模型和迭代模型
数据结构和算法
1.二叉树节点问题
2.二叉树重建问题
3.排序的稳定性
4.八大排序
5.动态规划
6.二叉树的遍历方式
7.二分查找
8。排序归并
9.二叉树的深度优先搜索
10.m个数找出最大的n个
11.快排的思想 复杂度 优化
12.二叉树中序遍历的非递归实现





其他
1.new和malloc的区别
2.全局变量和局部变量的区别
3.linux基本命令 查看进程 查看磁盘
df ps
4.session共享问题
5.如何将单机服务器扩展成分布式服务器
6.git的基本命令
git reset # 从暂存区恢复到工作文件
git reset -- . # 从暂存区恢复到工作文件
git reset --hard # 恢复最近一次提交过的状态,即放弃上次提交后的所有本次修改
git push # push所有分支
git push origin master # 将本地主分支推到远程主分支
git push -u origin master # 将本地主分支推到远程(如无远程主分支则创建,用于初始化远程仓库)
git push origin # 创建远程分支, origin是远程仓库名
7.分布式集群如何通信
8.sleep和wait区别
9.const和static的区别
10.栈区和堆区
11.memcache基本命令
存储命令
set命令
add命令
replace命令
append命令
prepend命令
cas命令
读取命令
get命令
gets命令
删除命令
incr/decr命令
查看memcached使用状态
stats命令
stats items命令
stats slabs命令
stats sizes命令
flush_all命令
     2.redis基本命令
hset(key, field, value):向名称为key的hash中添加元素field
hget(key, field):返回名称为key的hash中field对应的value
hmget(key, (fields)):返回名称为key的hash中field i对应的value
sadd(key, member):向名称为key的set中添加元素member
srem(key, member) :删除名称为key的set中的元素member
spop(key) :随机返回并删除名称为key的set中一个元素
smove(srckey, dstkey, member) :移到集合元素
scard(key) :返回名称为key的set的基数
sismember(key, member) :member是否是名称为key的set的元素
sinter(key1, key2,…key N) :求交集
sinterstore(dstkey, (keys)) :求交集并将交集保存到dstkey的集合
set(key, value):给数据库中名称为key的string赋予值value
get(key):返回数据库中名称为key的string的value
getset(key, value):给名称为key的string赋予上一次的value
mget(key1, key2,…, key N):返回库中多个string的value
save:将数据同步保存到磁盘
bgsave:将数据异步保存到磁盘
lastsave:返回上次成功将数据保存到磁盘的Unix时戳
shundown:将数据同步保存到磁盘,然后关闭服务
12 .jS闭包的理解











































熟练使用PHP开发
1.PHP的垃圾回收机制
答:php在5.3之后才有的垃圾回收机制,在5.3之前php使用引用计数的方式来进行垃圾回收;也就是每个内存对象都会分配一个计数
器,当对象的引用撤销后,引用-1;当引用为0时,销毁对象,垃圾回收完毕。
缺陷问题:当出现互相引用或者环状引用时,计数器不会消减到0,会造成内存泄露问题
在5.3之后引用了新的算法解决环状引用问题
2.PHP的底层实现

Zend引擎:Zend整体用纯C实现,是PHP的内核部分,它将PHP代码翻译(词法、语法解析等一系列编译过程)为可执行opcode的处理并实现相应的处理方法、实现了基本的数据结构(如hashtable、oo)、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕Zend实现。

Extensions:围绕着Zend引擎,extensions通过组件式的方式提供各种基础服务,我们常见的各种内置函数(如array系列)、标准库等都是通过extension来实现,用户也可以根据需要实现自己的extension以达到功能扩展、性能优化等目的(如贴吧正在使用的PHP中间层、富文本解析就是extension的典型应用)。

Sapi:Sapi全称是Server Application Programming Interface,也就是服务端应用编程接口,Sapi通过一系列钩子函数,使得PHP可以和外围交互数据,这是PHP非常优雅和成功的一个设计,通过sapi成功的将PHP本身和上层应用解耦隔离,PHP可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。

上层应用:这就是我们平时编写的PHP程序,通过不同的sapi方式得到各种各样的应用模式,如通过webserver实现web应用、在命令行下以脚本方式运行等等。

如果PHP是一辆车,那么车的框架就是PHP本身,Zend是车的引擎(发动机),Ext下面的各种组件就是车的轮子,Sapi可以看做是公路,车可以跑在不同类型的公路上,而一次PHP程序的执行就是汽车跑在公路上。因此,我们需要:性能优异的引擎+合适的车轮+正确的跑道。
3.PHP的PDO
PDO的三种查询操作 exec/query/preparedstatement
PDO::exec()用于执行一次的sql,返回受影响的条数
PDO::query()用于执行一次SELECT用POOstatement::fetch()取出
PDOStatement表示一个prepared statement语句,而在执行之后,又将返回一组关联数组的结果。如果一类查询(查询结构相似而具体的参数不一)需要一次解析而执行使用很多次,可以先用prepared statement,这样可以为具体的查询的执行做好准备,避免了分析、编译、优化的循环,将减少资源占用率,从而提高运行效率。通过对数据库进行prepare操作,便会返回PDOStatement数据类型,从而在其基础上展开execute、fetch等进一步的操作。
使用prepared statement还有一个好处就是,语句里不再使用引号,PDO driver已自动完成这一操作,可以防止SQL注入攻击的危险。查询语句里可以使用包含名字的(:name)和问号(?)的参数占位符,分别将用associated array 和indexed array传入数值。
PDO的事务操作
$pdo->beginTransaction()开始事务操作
$conn->exec();执行
$conn->commit();提交
$conn->rollBack();事务回滚
(参数化查询)
4.PHP中的锁机制
flock($handle)
5.PHP如何实现弱类型
了解MySQL数据库的使用
1.数据库的索引原理
查询是数据库最主要的功能实现,而数据库的性能瓶颈在I/O操作中。而索引文件往往是以索引文件的
形式存放在磁盘中的。所以索引的查找是会产生I/O消耗的。而B+树的数据结构因为其深度h低,h一般不大于3,出度d很大,可以很有效的减少I/O消耗,并且能很好利用到空间的局部性原理
2.数据库的优化策略

3.索引的优化策略
适合建立索引的场景
    1.表的主键外键必须建立索引。
    2.经常与与其他表建立连接的表,在连接字段上建立索引
    3.索引建立在选择性高的字段上
    4.索引建立在短小字段上
    5.频繁进行数据操作的表不要建立索引
索引的优化
    1)不要有超过5个以上的表连接(JOIN)
    2)考虑使用临时表或表变量存放中间结果。
    3)少用子查询
    4)视图嵌套不要过深,一般视图嵌套不要超过2个为宜。
    5)不适用NOT IN操作,这种操作将不会使用索引,可用NOT EXISTS代替
    6)对于like的使用要慎重,避免选择不使用索引的like操作
    7)查询只是用一个索引,
    8)使用短索引
    9)不在含有NULL值中使用索引
4.为何最左原则性能最高
因为B+树是从左到右建立索引树的
5.MySQL的慢查询
6.什么时候设置了索引但无效
1.以%开头的模糊匹配
2.or语句前后没有同时使用索引
3.数据类型出现隐式转换
7.sql语句的优化
了解常见设计模式
      常见有23种设计模式,遵守6中设计原则 分为创建 结构 和 行为3种类型

1.说说你了解的设计模式及其应用场景
熟悉的有:1.单利模式,主要运用在数据库操作上,使用单例模式可以避免大量的new操作消耗资源。还可以减少数据库连接数。实现方法;1构造函数私有化。2对象属性必须为static。3提供对外对象获取方法
2.适配器模式 drive驱动使用的就是适配器模式。里面一个对外接口可以适配所有drive。
3.简单工厂模式:解决对象创建实际问题。在ThinkPHP的db.class.php中就使用了工厂模式加单例模式来实现数据库选择
        实现方法 1.构建抽象基类。2.构建继承子类。3.构建工厂类,用来实现对应子类

24。使用过的设计模式及其场景
    1.单例模式。主要运用在数据库操作上,使用单例模式可以避免大量的new操作消耗资源。还可以减少数据库连接数。
        实现方法;1.构造函数私有化。2.对象属性必须为static。3.提供对外对象获取方法
    2.简单工厂模式:解决对象创建实际问题。在ThinkPHP的db.class.php中就使用了工厂模式加单例模式来实现数据库选择
        实现方法 1.构建抽象基类。2.构建继承子类。3.构建工厂类,用来实现对应子类
    3.责任链模式
    4.策略模式 为了解决策略的切换和扩展
    5.观察者模式 hook类里面使用了观察者模式(没看懂)
    6.适配器模式 drive驱动使用的就是适配器模式。里面一个对外接口可以适配所有drive。
    7.策略模式和工厂模式的区别
    策略模式属于白盒子
    工厂模式属于黑盒子
2.工厂模式和策略模式的异同

3.职责链模式

4.线程安全的单例模式

数据结构
了解常见数据结构和算法
1.常见的数据结构有哪些
2.写出八大排序及其优化方法
了解 Ajax ,Comet 常见 web 技能
1.描述下Ajax的工作原理

2.解释下comet及其实现方式和实际应用
了解常见web攻防策略
1.谈谈了解的web攻击和漏洞及其防御措施
2.DooS攻击的原理和应对策略
3.xss和csrf的区别和应对
4.sql注入的原理和防范
了解HTTP协议
1.什么是HTTP长连接和短连接
短连接进行一次通信后就断开
长连接 通信后不断开TCP连接(keep-alive)
2.HTTP的断点续传
3.HTTP缓存机制
Express策略 HTTP1.0消息头,返回服务器过期时间
Cache-control 优先级别高于Express,值可以为
Public:
Private
No-Cache
no-store
max-age     
min-fresh
max-state


Last-Modified/if-Modified-since:配合Cache-control使用
Etag、if-None-Match配合Cache-control使用

4.HTTP安全
5.Session和cookie的区别及其应用场景
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
   考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
   考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、所以个人建议:
   将登陆信息等重要信息存放为SESSION
   其他信息如果需要保留,可以放在COOKIE中
6.get和post的区别



7.HTTP和HTTPS的区别

8.如何设计一个高并发的系统
9.HTTP请求流程
7步
    1.建立TCP连接
    2.向服务器发送请求命令   GET /...../.... HTTP/1.1
    3.发送请求头    /请求主体         User_Agent:.....
    4.服务器应答                 HTTP/1.1   200OK
    5.服务器发送应答头   
    6.服务器发送应答主体
    7.服务器关闭TCP连接   如果请求头有coonction:Keep-alive 则保持打开状态



10.常见HTTP状态码
      1xx(临时响应)
          100(继续)101(协议切换)
     2xx(成功)
          206(部分内容)
      3xx(重定向)
          301(永久移动)302(临时移动)303(查看其他位置)307(临时重定向)

4xx客户端错误
5xx服务器错误
504(网关超时)505(HTTP版本不受支持)
303和307的区别
11.HTTP/2特性
1。头压缩
2.二进制
3.重置
4.服务器推送
5.流量控制
只在TLS上实现了HTTP/2即HTTPS

了解 Redis Memcache Nosql 数据库;
1.Redis memcache区别和应用场景
2.应用中如何使用Redis
3.memcache 和 Redis常用命令
4.Memcache的内存机制
    memcached的内存分配策略就是:按slab需求分配page,各slab按需使用chunk存储。
     这里有几个特点要注意,
    1.Memcached分配出去的page不会被回收或者重新分配
    2.Memcached申请的内存不会被释放
    3.slab空闲的chunk不会借给任何其他slab使用
    综合上面的介绍,memcached的内存分配策略就是:按slab需求分配page,各slab按需使用chunk存储。
     这里有几个特点要注意,
    1.Memcached分配出去的page不会被回收或者重新分配
    2.Memcached申请的内存不会被释放
     3.slab空闲的chunk不会借给任何其他slab使用
5.缓存雪崩,缓存无底洞 永久数据被踢现象原因和解决方案
PHP爬虫
1.如何使用多线程和多进程爬取数据
1

2.多线程如何进行管理
3如何防止僵尸进程和孤儿进程的产生
4.这个项目最难的技术点在哪
5.项目中redis的作用在哪里
6.项目的数据库如何设计
7.如何统计用户的信息
8.项目的不足和完善
9.如何应对反爬网站 
php框架
1.如何对项目进行重构
将原来的php嵌入HTML页面改为MVC架构的页面

2.项目的架构如何设计
使用单入口设计,每一次的请求都从index页面发出调用相应的操作
利用PHP自动加载特性,将控制层的类和Model层的类区分在不同的文件夹
使用模板引擎来使PHP和HTML代码分离,并将常用的方法封装成类,以供调用。
3.这个框架如何保证web安全
4.重构以后项目的扩展如何实现,如何解耦
5.框架中用到了那些设计模式
6,如何做到单入口,如何实现动态路由加载
爪爪
1.如何设计这个项目的架构方案
2.项目中的热数据和冷数据如何处理
3.app如何实现自动登录
4.当数据量逐步增大时如何优化架构,如何优化数据库
5.数据库的设计方案及原则

你可能感兴趣的:(面试)