PHP常用设计模式
答:共23种设计模式,可分为三大类
创建型模式:常用的有 单例、工厂、建造者、原型等
结构型模式:适配器、装饰器、代理、外观、组合等
行为型模式:策略、观察者、解释器、命令、备忘录等
答:
string、list、hash、set、zset
decr key
MySQL的优化主要分为四大方面:
分为共享锁与排他锁:
kafka
分布式消息队列:具有高吞吐量、低延迟、持久性、可靠性、容错性、可拓展性等特点
可以用来日志收集、消息系统、用户活动追踪、运营指标等
分两个分支
master 主分支,项目随时可以发布
develop:开发分支,平行于master分支
开发时创建一个自己本地分支,完成功能后合并到develop分支,组长进行代码review与测试,通过后组长合并到master分支
可以用工具实现
laravel框架可以用 add_username_to_users_table 来实现
主要功能模块包括:商品类型、商品检索、首页、频道页、单品页、营销专题、订单支付、购物流程、客户中心、帮助中心
商品管理、类目管理、营销案管理、订单管理、供货商管理、配送商管理、会员管理、仓储管理、对账管理、互动管理、权限管理等
可以划分为:产品子系统、购物子系统、支付子系统、评论子系统、客服子系统、接口子系统(如短信等第三方外部系统)
又可以分为核心系统和非核心系统
每个子系统可以由单独的团队去负责,并且单独部署在服务器上
每个子系统可以分布在不同的服务器上,也可以同一个子系统多个服务器(也就是集群),可以提高业务处理的效率
数据库可使用主从复制,读写分离
缓存使用 Redis集群
再加上负载均衡
输入域名
向DNS服务器查询网站IP地址
DNS服务器返回网站IP地址(域名解析)
浏览器得到地址后,把输入的域名转化为http服务请求
服务器收到请求后,返回网页信息
展示成可以查看的网页形式
域名解析
发起连接,构造请求(三次握手)
数据转发
XSS(跨站脚本攻击)、CSRF(跨站请求伪造)、SQL注入、DDOS攻击、命令行注入、流量劫持
一个事务要么全部提交成功,要么全部提交失败。
要保持原子性就要提到一致性,数据在执行前后是一致的。
要一致就需要说道它的隔离性,
redis是基于内存的操作的,单线程的,避免了不必要的上下文切换
缺点:
Nginx相对Apache的优点:
Apache相对Nginx的优点:
抽象、封装、继承、多态
使用redis的队列来实现,将要促销的商品数量以队列的方式存入redis中,每当用户抢到一件促销商品则从队列中删除一个数据,确保商品不会被多买。
redis消息队列 list数据类型, rpush lpop
心跳机制与重连机制
代理:代理其实是一个中介,A和B本来可以直连,中间插入一个C,C就是中介
代理访问外部资源
用途:
反向代理实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器
作用:
正向代理即是客户端代理,代理客户端,服务端不知道实际发起请求的客户端(买票的黄牛)
反向代理即是服务端代理,代理服务端,客户端不知道实际提供服务的服务端(租房的代理)
swoole是一个协程高性能的网络通信引擎
解决了php缺失的功能,比如异步通信、持久连接等
进程:资源分配的最小单位,一个程序就是一个进程
线程:cpu调度执行的最小单位,多个线程可以并发执行,共享进程的所有资源
协程:比线程更轻量级,是由程序所控制的,具有极高的执行效率,没有线程切换的开销,不需要多线程的锁机制
消息队列包括两种模式,点对点模式,和发布/订阅模式
队列、不可重复消费
点对点模式下包括三个角色:
消息发送者生产消息发送到队列中,然后消息接收者从队列中取出并消费消息。消息被消费后,队列中不在有存储,所以消息接收者不可能消费到已被消费的消息。
点对点模式的特点
:
队列实现了一个可靠的负载均衡
主题、可重复消费
发布/订阅模式下包括三个角色:
发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。
发布/订阅模式特点:
in 和 exists 的选择
order by 语句使用索引最左前列
使用index hint优化(确定非聚集索引能带来更好性能)
请求头一般都是客户端通过这个头,告诉服务器的消息:
响应头一般都是服务器通过这个头,告诉浏览器的消息:
Server->reload
swoole底层提供了柔性终止/重启的机制。
是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去,此时称系统处于死锁状态或系统产生了死锁,这些永远互相等待的进程称为死锁进程。
表级锁不会产生死锁,所以死锁主要还是针对于常用的InnoDB。
形成死锁的四个必要条件:
处理死锁的思路如下:
避免死锁:
在配置中增加 proxy_connect_timeout (代理连接超时)配置
默认时间为60秒,修改为1秒。
server {
listen 80;
server_name www.test.com
location / {
proxy_pass http://www.test.com;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 1;
proxy_read_timeout 1; // 也可不设置
proxy_send_timoute 1; // 也可不设置
}
...
面向对象是把整个需求按照特点、功能划分,将这些存在共性的部分封装成对象,创建了对象不是为了完成某一个步骤,而是描述某个事物在解决问题的步骤和行为。
将繁琐的步骤,通过行为、功能,模块化,这就是面向对象。
优点:易维护、易复用、易扩展。由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活,更加易于维护
缺点:性能比面向对象低
类是一组相关的属性和行为的集合。是一个抽象的概念
对象是该类事务的具体表现形式。具体存在的个体。
nginx本身不能处理php,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返给客户端。
nginx一般是把请求发送 FastCGI管理进程处理,FastCGI管理进程选择CGI子进程处理结果并返回给nginx。
PHP-FPM是一个PHP FastCGI管理器,旨在将FastCGI进程管理整合进PHP包中。
PHP-FPM提供了更好的php进程管理方式,可以有效控制内存和进程,可以平滑重载php配置。
解析速度:echo>print>print_r
索引就是一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。就类似目录。
索引可以是唯一的,创建索引允许指定单个列或多个列。
缺点:它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。
iclude "./libs/Smarty.class.php";
$tpl = new Smarty();
// 模板文件目录
$tpl -> temlate_dir = 'templates/';
// 编译目录
$tpl -> compile_dir = 'templates_c/';
// 配置文件目录
$tpl -> config_dr = 'config/';
// 缓存目录
$tpl -> cache_dir = 'cache/';
// 开启缓存
$tpl -> caching = 1;
// 设置缓存有效期
$tpl -> cache_lifetime = 60 * 60 * 24;
$tpl -> left_delimiter = '<{';
$tpl -> right_delimiter = '}>';
?>