面试各个知识点

一、      网站优化

1、  前端页面缓存

2、  CDN缓存

3、  减少http网络请求

4、  使用缓存,redis、memcache

5、  静态文件和动态文件分离

6、  Opcache缓存

7、  反向代理实现负载均衡

8、  代码级别的优化

9、  数据库优化

10、  防盗链

扫描二维码关注公众号,回复: 484918 查看本文章

二、      mysql引擎

1、每个MyISAM在磁盘上存储成三个文件。第一个 文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义;数据文件的扩 展名为.MYD (MYData);索引文件的扩展名是.MYI (MYIndex)。

基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的 大小只受限于操作系统文件的大小,一般为 2GB

2、MyISAM类型的表强调的是性能,其执行数 度比InnoDB类型更快,但是不提供事务支持

InnoDB提供事务支持事务,外部键等高级 数据库功能

3、索引不同

MyISAM索引保存的是索引和数据的地址,InnoDB索引和数据放在一起

InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”

三、      mysql优化

1、  选择合适的引擎

2、  表结构加索引

3、  分表分库,水平分割(表结构不动),垂直分割

4、  主从分离,读分库,写主库

5、  增加连接数

6、  内存大小的配置

7、  Sql注意实现,读取一条数据用limit 1;避免用select *;使用char

8、  开启慢查询

四、      高并发怎么处理

1、              服务降级

2、              图片、文件服务器分离

3、              负载均衡,服务集群

4、              数据库集群和库表散列

5、              异步处理一些时间要求不及时的请求

五、      秒杀怎么实现

1、  页面静态化

2、  下单url动态下发(防止直接拿接口刷单)

3、  多个产品分到不同的服务器集群上,使用不同的DB

4、  加入队列中(进行限制,防止加入太多把队列挤满)(缺点有等待的过程)

5、  乐观锁,获取当前版本号,在修改时增加版本号,如果版本号不一致,修改失败(失败几率大)

6、  增加验证码(防止被刷)

7、  服务器扛不住的时候,服务降级

8、  Redis decr redis所有的命令都是原子性操作,把库存量存在redis中

六、      数据库隔离级别

事务出现数据不一致的情况

丢失更新:两个事务都要更新数据库一个字段

脏读(未提交读):事务B修改数据但还没有提交时,事务A读取该数据

不可重复读:事务A多次读取,在其中两处读取之间,事务B修改数据并提交,造成两次读取数据不一致

幻读:事务A读的时候读出了15条记录,事务B在事务A执行的过程中 增加 了1条,事务A再读的时候就变成16条,这种情况就叫做幻影读。

排他锁 被加锁的对象只能被持有锁的事务读取和修改,其他事务无法在该对象上加其他锁,也不能读取和修改该对象 排他锁直到事务结束才释放
共享锁 被加锁的对象可以被持锁事务读取,但是不能被修改,其他事务也可以在上面再加共享锁。

一级封锁协议:加读写共享锁,不能避免四周问题

二级封锁协议:写加排他锁,读加共享锁,避免脏读

三级封锁协议:在二级封锁协议基础上,事务整体加共享锁。指定了在当前事务提交之前,其他任何事务均不可以修改或删除当前事务已读取的数据(锁的拥有对象是事务,不是每条语句,以上两种协议中锁的拥有对象时每条语句

四级封锁协议:直接对 事务中 所 读取 或者 更改的数据所在的表加表锁,也就是说,其他事务不能读写该表中的任何数据

七、      设计模式

单例模式的作用就是保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个,同时这个类还必须提供一个访问该类的全局访问点

public static function getInstance() {

        if (null === static::$instance) {

            static::$instance = new static;

        }

        return static::$instance;

}

简单工厂的作用是实例化对象,而不需要客户了解这个对象属于哪个具体的子类。简单工厂实例化的类具有相同的接口或者基类,在子类比较固定并不需要扩展时,可以使用简单工厂

门面模式Facade)又称外观模式,用于为子系统中的一组接口提供一个一致的界面。门面模式定义了一个高层接口,这个接口使得子系统更加容易使用:引入门面角色之后,用户只需要直接与门面角色交互,用户与子系统之间的复杂关系由门面角色来实现,从而降低了系统的耦合度。实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的,松耦合关系使得子系统的组件变化不会影响到它的客户。

Facade模式可以消除复杂的循环依赖关系

class Ali { 

    function buy()  { 

        echo "Ali"; 

    }

class Wanda { 

    function buy() { 

        echo "wanda"; 

    } 

/**门面模式核心角色

 * Class FacadeCompany

 */ 

class FacadeCompany { 

    private $ali; 

    private $wanda; 

    function __construct() { 

        $this->ali=new Ali(); 

        $this->wanda=new Wanda(); 

    } 

    function buy() { 

        $this->wanda->buy(); 

        $this->ali->buy(); 

    }

依赖注入模式

当调用者需要被调用者的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例,但在这里,创建被调用者的工作不再由调用者来完成,而是将被调用者的创建移到调用者的外部,从而反转被调用者的创建,消除了调用者对被调用者创建的控制,因此称为控制反转。

要实现控制反转,通常的解决方案是将创建被调用者实例的工作交由 IoC 容器来完成,然后在调用者中注入被调用者(通过构造器/方法注入实现),这样我们就实现了调用者与被调用者的解耦,该过程被称为依赖注入。

八、larvael框架

大量使用了第三方开源库,composer管理包依赖

慢,执行一个简单的echo语句100多ms

耦合性小,组件式,高扩展性

Laravel最大的强项是充分运用了PHP面向对象的特性和软件工程的思想

路由配置方便,中间件方便

文档和dome少

容器、依赖注入 控制反转、服务提供者、契约(接口)、门面模式、反射

依赖注入(Dependency Injection)是控制反转(Inversion of Control)的一种实现方式。

反转,主要指由 主动依赖 到 被动依赖 

//主动依赖
    function __construct() {
            $this->user = new UserModel();
    }
    //被动依赖
    function __construct(UserModel $user) {
            $this->user = $user;
    }

 

九、分布式系统(CAP

水平扩展垂直拆分是分布式架构的两种思路

现在有两个数据请求,数据1 90万,数据2 80万,上面那台机器也hold不住,我们加一台机器来负载均衡一下,每台机器处理45万数据1和40万数据2,但是平分太麻烦,不如一台处理数据1,一台处理数据2,同样能解决问题,这种方式我们称之为垂直拆分

分布式通信方式:网络请求和共享文件资源

难点:1网络因素:网络延迟(性能、超时)网络故障(丢包、乱序、抖动)

      2 CAP定律

Consistency:[强]一致性,事务保障,ACID模型。

      Availiablity:[高]可用性,冗余以避免单点,至少做到柔性可用(服务降级)。

      Partition tolerance:[高]可扩展性(分区容忍性):一般要求系统能够自动按需扩展,比如HBase

CAP原理告诉我们,这三个因素最多只能满足两个,不可能三者兼顾。对于分布式系统来说,分区容错是基本要求,所以必然要放弃一致性。对于大型网站来说,分区容错和可用性的要求更高,所以一般都会选择适当放弃一致性。对应CAP理论,NoSQL追求的是AP,而传统数据库追求的是CA,这也可以解释为什么传统数据库的扩展能力有限的原因

十、mysql主从

十一、php完整的请求过程

十二、CGIFASTCGICLI

CGI :“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。在服务器环境中,为“程序 ”提供标准的接口,通过这个接口,“程序 ”可以对服务器与客户端交换的信息做一些事情 。以CGI方式运行时,web server将用户请求以消息的方式转交给PHP独立进程,PHP与web服务之间无从属关系。纯粹调用--返回结果的形式通讯。而模块方式,则是将PHP做为web-server的子进程控制,两者之间有从属关系。最明显的例子就是在CGI模式下,如果修改了PHP.INI的配置文件,不用重启web服务便可生效,而模块模式下则需要重启web服务。

CLI :“ 命令行界面”(Command Line Interface),可在用户提示符下键入可执行指令的界面。CLI则是命令行接口,用于在操作系统命令行模式下执行PHP,比如可以直接在win的cmd或linux的shell模式下直接输入 php a.php 来得到结果。它与CGI模式最大的不同的地方在于既不会输出HTTP头信息(CGI模式除了输出用户能看到的结果外,还会输出用户不能直接看到的HTTP 头信息),抛出的信息也直接以文本方式而不以HTML方式给出,比如新建一个 test.php,写入内容 <?php phpinfo();?> ,在浏览器中可以看到以HTML表格描述的信息,而在命令行输入 php test.php 则会直接看到纯文本的输出。

php-fpm的管理对象是php-cgi。但不能说php-fpm是fastcgi进程的管理器,因为前面说了fastcgi是个协议(fastcgi是一个想法,fpm实现了这个想法)

十三、缓存、队列

1、  memcache不能持久化,redis能持久化

2、  存储数据结构,memcache只能存储kv形式,redis可以链表、kv、map、hash等

3、  Redis只使用单核,而Memcached可以使用多核

4、   Redis支持数据的备份,即master-slave模式的数据备份

5、  分布式–设定memcache集群,利用magent做一主多从;redis可以做一主多从。都可以一主一从 

可靠消费

Redis:没有相应的机制保证消息的消费,当消费者消费失败的时候,消息体丢失,需要手动处理
RabbitMQ:具有消息消费确认,即使消费者消费失败,也会自动使消息体返回原队列,同时可全程持久化,保证消息体被正确消费

可靠发布

Reids:不提供,需自行实现
RabbitMQ:具有发布确认功能,保证消息被发布到服务器

高可用

Redis:采用主从模式,读写分离,但是故障转移还没有非常完善的官方解决方案
RabbitMQ:集群采用磁盘、内存节点,任意单点故障都不会影响整个队列的操作

持久化

Redis:将整个Redis实例持久化到磁盘
RabbitMQ:队列,消息,都可以选择是否持久化

消费者负载均衡

Redis:不提供,需自行实现
RabbitMQ:根据消费者情况,进行消息的均衡分发

队列监控

Redis:不提供,需自行实现
RabbitMQ:后台可以监控某个队列的所有信息,(内存,磁盘,消费者,生产者,速率等)

流量控制

Redis:不提供,需自行实现
RabbitMQ:服务器过载的情况,对生产者速率会进行限制,保证服务可靠性

应用场景

Redis:轻量级,高并发,延迟敏感
即时数据分析、秒杀计数器、缓存等

RabbitMQ:重量级,高并发,异步
批量数据异步处理、并行任务串行化,高负载任务的负载均衡等

十四、正则表达式

 

十五、php基础 排序

      Gawk –F: ‘{print $1}’ /etc/password 读取password文件下每一行用:分割的第一个元素

重定向:header(“Location:”)

Ip2long($_SERVER[‘remote_addr’])

排序:sort()、asort()和 ksort()都是正向排序,当然也有相对应的反向排序. 
实现反向:rsort()、arsort()和 krsort()。

array_unshift()函数将新元素添加到数组头,array_push()函数将每个新元素添加到数组 的末尾。
array_shift()删除数组头第一个元素,与其相反的函数是 array_pop(),删除并返回数组末 尾的一个元素。
array_rand()返回数组中的一个或多个键。

函数shuffle()将数组个元素进 行随机排序。
函数 array_reverse()给出一个原来数组的反向排序

current():每个数组都有一个内部指针指向他的当前单元,初始指向插入到数组中的第一个元素

array_unique删除数组中的重复值

array_splice()删除数组成员,数字键时重新组合键值

array_flip()交换数组的键值和值

array_search()搜索数值array_search("red",$array)

array_diff 比较多个数组的值,并返回差集,多个数组完全不同的值(即只出现一次)

冒泡:比较相邻的两个数据,大的交换到后面,直到最后一个

选择:循环选择一个最小的数的下标,把选择的数据和i做交换(内存循环开始位置j=i+1)

插入:从第二个开始,依次比较前面的数,如果前面的数小于当前数则插入

二分法:取第二个数get,left=0,right=i-1,取middle=(left+right)/2,如果A[middle] >get,right=middle-1,否则left=middle+1;直到left<=right
快速:用递归的方式,第一个数作为基数a,i和j分别从左右找,j找到小于a的,i找到大于a的,进行交换,直到i=j,则和a进行交换,然后递归a左右两边的
 
session.auto_start  session_start
request_order=”GPC” $_REQUEST包含$_GET、$_POST/$_COOKIE

session.save_handler = redis

session.save_path = "tcp://127.0.0.1:6379"

php.ini的post_max_size  nginx:client_max_body_size

upload_max_filesize =2M

 
exit(status) 是die的别称,status是字符串时,则输出,是整数时作为退出的状态不输出
 
find . -name "*.log"
find . -type f -name "*.log" 按类型查找文件
find . -type d | sort按类型查找文件夹
find . -size +1000c –print
 
free –h 一个快速查看内存使用情况的方法
cat /proc/meminfo
top

十六、php内核

Php优缺点

1、        跨平台,2、语法简单、3、成熟的框架、4、面向对象,适合大型项目、5、成熟的论坛

对线程支持不好,弱类型语言,语法不严谨,PHP的解释运行机制。这种运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收。也就是说,PHP在语言级别上没有办法让某个对象常驻内存。所有的变量都是页面级的,无论是全局变量,还是类的静态成员,都会在页面执行完毕后被清空

十七、子进程

pcntl_fork 

十八、https http TCP UDP 三次握手

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

第二次握手服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯。

UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。

UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象,实际应用中要求程序员编程验证

SSL握手过程:

1. 客户端将它所支持的算法列表和一个用作产生密钥的随机数发送给服务器;

2. 服务器从算法列表中选择一种加密算法,并将它和一份包含服务器公用密钥的证书发送给客户端;该证书还包含了用于认证目的的服务器标识,服务器同时还提供了一个用作产生密钥的随机数

3. 客户端对服务器的证书进行验证,并抽取服务器的公用密钥;然后,再产生一个称作pre_master_secret的随机密码串,并使用服务器的公用密钥对其进行加密,并将加密后的信息发送给服务器;

4. 客户端与服务器端根据pre_master_secret以及客户端与服务器的随机数值(第一步和第二步的随机数)独立计算出加密和MAC密钥。

5. 客户端将所有握手消息的MAC值发送给服务器;

6. 服务器将所有握手消息的MAC值发送给客户端。

十九、nginx

负载均衡     

upstream name{

        server 192.168.80.121:80 weight=3;
        server 192.168.80.122:80 weight=2;
        server 192.168.80.123:80 weight=3;

}

四种方式:1轮询(默认),2:ip_hash,3:url_hash,4:后端服务器响应时间,响应时间越短优先分配

upstream apachephp  {

    server ip:8080; #Apache

}

server {

    listen 80;

    server_name  www.quancha.cn;

    root   html;

    index  index.html index.htm index.php;

    location / {

        proxy_pass  http://apachephp; // upstream

      }

}

          location ~ \.php$ {
             root           html;
             fastcgi_pass   127.0.0.1:9000;
             fastcgi_index  index.php;
             fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
             include        fastcgi_params;
         }

优化

      worker_processes 进程数,保持和内核相同

worker_connections 每个进程允许的最多连接数, 理论上每台nginx 服务器的最大连接数为worker_processes*worker_connections。

client_header_buffer_size 客户端请求头部的缓冲区大小,根据你的系统分页大小来设置

open_file_cache 为打开文件指定缓存

open_file 打开文件数

二十、安全

  XSS,跨站脚本攻击,其原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当其它用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。如,盗取用户Cookie、破坏页面结构、重定向到其它网站等。

方法:对提交的数据进行过滤

CSRF跨站请求伪造 伪造url

方法:请求加上 token 检查

Sql注入

方法:所有 SQL 语句都使用参数化查询(推荐)或对参数进行 escape

二十一、工具

      Flumehadoop

agent里面包含3个核心的组件:source—->channel—–>sink,类似生产者、仓库、消费者的架构。 
source:source组件是专门用来收集数据的,可以处理各种类型、各种格式的日志数据,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy、自定义。 
channel:source组件把数据收集来以后,临时存放在channel中,即channel组件在agent中是专门用来存放临时数据的——对采集到的数据进行简单的缓存,可以存放在memory、jdbc、file等等。 
sink:sink组件是用于把数据发送到目的地的组件,目的地包括hdfs、logger、avro、thrift、ipc、file、null、Hbase、solr、自定义。

二十二、RPC

远程过程调用协议,在OSI网络通信模型中,RPC跨越了传输层应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易

运行时,一次客户机对服务器的RPC调用,其内部操作大致有如下十步:

1.调用客户端句柄;执行传送参数

2.调用本地系统内核发送网络消息

3.消息传送到远程主机

4.服务器句柄得到消息并取得参数

5.执行远程过程

6.执行的过程将结果返回服务器句柄

7.服务器句柄返回结果,调用远程系统内核

8.消息传回本地主机

9.客户句柄由内核接收消息

10.客户接收句柄返回的数据

 

猜你喜欢

转载自my.oschina.net/u/3646190/blog/1577394