网络协议
计算机网络的五层协议:物理层、数据链路层、网络层、运输层、应用层
计算机网络的七层协议(OSI):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
TCP/IP(是一个协议族,非单个协议):网络接口层、 IP层、传输层、应用层
网线与集线器属于物理层
网卡与交换机属于数据链路层
路由器属于网络层
TCP和UDP
tcp面向连接的字节流服务,对系统资源要求较多,程序结构复杂,保证数据的正确性和顺序性
udp是无连接的,面向数据报,对系统资源要求较少,程序结构简单,不能保证数据的正确性和顺序性
网站安全与防护
sql注入防治方法
:使用例如PDO的预处理,使用或者编写类似mysqli_real_escape_string的方法对sql的特殊字符进行转义xss(cross site script)跨站脚本攻击
:将外部脚本植入到页面中
防治方法
:htmlspecialchars()转义特殊字符为字符实体,strip_tags()过滤html标签, addslashes(可转义单双引号反斜杠NULL) 在特殊字符前面加反斜杠进行转义
csrf(cross-site request forgery)跨站请求伪造
:伪造受信任的用户信息来请求网站
防治方法
:请求附加随机token进行校验,或验证码
基础算法相关
基本排序算法:
-
冒泡排序(时间复杂度:o(n方))
for($i = 0; $i < count($arr); $i++) for($j = 0; $j < count($arr) - 1 - $i; $j++) if($arr[$j] < $arr[$j+1]) 两者交换
-
选择排序(时间复杂度:o(n方))
for($i = 0; $i < count($arr) - 1, $i++) $min = $i; for($j = $i + 1; $j < count($arr); $j++) if($arr[$min] > $arr[$j]) $min = $j; 将最小值与当前的第i位置内容交换
- 快速排序思想:通过一趟排序将序列分成两部分,一部分所有数据比另一部分所有数据小,然后在这两个序列的内部再分别进行快速排序操作,直到最后形成一个有序序列
- 二分插入排序思想(之前的序列为有序):插入第i个元素时,对前面的0~i-1进行折半,当前元素与中间元素比较,如果小,前半部分再次折半,如果大,后半部分进行折半,直到最后left>right,然后把目标位置到i-1的所有元素整体后移,把当前元素放进去
基本查找算法:
- 顺序查找
- 二分法查找(折半查找):将序列分为两部分,找到序列的中间值,如果查找值大于中间值,继续对右半部分进行折半,如果查找值小于中间值,对左半部分进行折半,直到找到或front>end结束,时间复杂度O(log2n)以2为底n的对数
设计模式
-
MVC是一种设计框架,而不是设计模式,框架是比模式更高的概念
model负责数据逻辑
controller负责用户交互
view负责数据显示
流程:用户对控制器的某个方法发出请求,控制器调用相应的模型返回数据,然后将数据渲染到视图中返回给用户
-
1) 单例模式
i. 私有化构造方法和__clone方法
ii. 提供公有的静态的方法返回实例
iii. 提供私有的静态属性保存实例
-
2) 简单工厂模式(重点在创建不同对象,作用就是用来创建对象的) - 例如一个计算器的加减乘除求余取整
i. 定义抽象基类让子类分别继承并实现相应方法
ii. 定义Factory工厂类里面提供静态方法用于根据不同的参数实例化相应的子类对象
-
3) 策略模式(重点在于实例化不同类的解决策略不同,作用是根据不同的情况调用相应的策略或算法) - 例如qq普通用户 vip svip购买皮肤的优惠策略
i. 定义抽象基类让子类分别继承并实现相应的方法
ii. 根据不同的场景实例化相应的类,然后调用其中的方法获取结果
-
4) 观察者模式
i. 需要有一个抽象的主题接口和一个抽象的观察者接口
ii. 实现一个主题,实现多个观察者
iii. 实例化主题,然后调用主题的方法并将不同的观察者对象实例化传入,在主题的方法中保存传入的观察者对象到一个属性,在主题中定义另外的方法通过保存观察者对象调用观察者的方法
名词解释
ORM
模型:将表映射到类,将行记录映射到实例对象,将字段映射到对象的属性OOP
:面向对象编程nosql
:redis、MongoDB、memcached
大流量高并发网站解决思路
防盗链(别人网站上链接着你的服务器上的的资源),验证来源:$_SERVER['HTTP_REFERER'] apache或者nginx进行相关配置
CDN加速
减少http请求,添加异步请求
启用浏览器缓存
代码压缩(去除空白符)
页面静态化:信息变更不是很频繁的页面进行静态化处理,生成html文件
数据缓存(数据库缓存redis,文件缓存)
使用Nginx,负载均衡
-
mysql数据库优化
字段数据类型优化
索引优化
SQL语句优化
存储引擎优化
表结构设计优化
分表分库分区
主从复制,读写分离
COOKIE 和 SESSION
session与cookie都是会话技术,默认情况下session在客户端依赖于cookie
cookie保存在客户端,保存的是字符串,session保存在服务端,保存的是对象
cookie安全性低,可被拦截或从本地分析得到,session安全性高
session保存在服务器上,会占用服务器的资源,理论上大小没有限制,和服务器内存有关
单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多20个cookie
登录信息等重要信息存放为session,其他信息如需保留,可以存在cookie中
include 和 require
引入文件,include在用到时加载,require在一开始就加载
include引入文件出现错误,会给出警告,并继续执行下面代码,require引入文件出现错误,报出致命错误并终止当前程序运行
MyISAM 和 InnoDB
MyISAM不支持事务和外键操作,InnoDB支持事务处理和外键
MyISAM是表级锁,InnoDB是行级锁
执行大量的select MyISAM更好,执行大量的insert update用InnoDB更好
global 和 $GLOBALS
$GLOBALS['var'] 是外部的全局变量$var本身。
global $var 是外部$var的同名引用或者指针
empty 和 isset
-
empty以下条件会被认为空
""
(空字符串)0
(作为整数的0)0.0
(作为浮点数的0)"0"
(作为字符串的0)NULL
FALSE
array()
(一个空数组)$var;
(一个声明了,但是没有值的变量)
-
isset以下条件会被认为存在
变量
存在并且值不是 NULL,
则返回 TRUE
get 和 post
get主要用于获取数据,post主要用于提交数据
get提交参数追加在url后面,post通过http body提交
get的url会有长度上的限制,post传递数据理论上是无限
get提交信息明文显示在url上,不够安全,post相对来说比较安全
get提交可以被浏览器缓存,post不会被浏览器缓存
static 和 self
self 可以用于访问类的静态属性、静态方法和常量,但 self 指向的是当前定义所在的类,这是 self 的限制。
static 也可以用于访问类的静态属性、静态方法和常量,static 指向的是实际调用时的类。
当进行非静态方法调用时,该类名(static指向的类名)为该对象所属的类,即实际调用时的对象所属的类。
一次完整的HTTP请求过程
1.首先域名解析(DNS解析)
:浏览器解析域名(主机名)为相应的IP地址
2.建立TCP连接
:三次握手
客户端:你能听到我说话吗?
服务器:我能听到,你能听到我说话吗?
客户端:我也能,那我开始发送数据喽。。
3.浏览器向服务器发起http请求
4.服务器响应http请求,返回html代码
5.浏览器解析html代码并请求html中的资源
6.浏览器对页面进行渲染然后展示给用户
7.关闭TCP连接
:四次挥手
- 客户端:“兄弟,我这边没数据要传了,咱关闭连接吧。”
- 服务端:“收到,我看看我这边有木有数据了。”
- 服务端:“兄弟,我这边也没数据要传你了,咱可以关闭连接了。”
- 客户端:“好嘞。”
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。