php知识点(持续更新)

511 阅读1分钟

以下内容仅为最近面试的一些知识点总结,答案也是我后来通过查各种资料后的总结。若有不准确甚至错误的地方,还请路过大神指正,在此感谢。

php

关于array的数组

extendsimplements的区别

  1. 一个php对象只能继承一个父类,单继承;但可以实现多个接口类
  2. extends会继承父类的所有属性和方法,也可以对父类的方法进程重写。接口类方法中不能写逻辑,implements需要实现的类完全实现抽象类中的方法。

php7的新改变

  1. 类型的声明:可使用字符串,整数,浮点数来声明函数的参数类型与返回值类型
  2. 新增操作符<=>,$a<=>$b,当a>b时,为1,相等为0,a<b为-1
  3. 新增操作符??,$a ?? 1;$a存在并不为null,返回$a本身,反之返回1
  4. 定义常量数组define('A', [1,2]);
  5. 命名空间引用优化use AppBundle\Entity\{A,B};

设计模式

php设计模式和应用场景

  1. 单例模式:

    解决如何在整个项目中创建唯一对象实例问题

    应用场景:当某个类只能被实例化一次的时候需要使用这个模式。例如:数据库连接

  2. 工厂模式

    • 简单工厂模式:

      解决当某个类改名后,所有调用这个类的地方都要改名。也就是通过一个工厂类定义方法,创建某个类,当改名时,只需修改工厂类里面的名称即可。

      应用场景:需要多处进行实例化的类

    • 抽象工厂模式

      对简单工厂中的工厂类进一步抽象成接口。如有新增对象时,只要在实现对应的工厂类,不用修改之前的工厂类。

      应用场景:适用于增加新工厂,不适用于增加产品线

  3. 策略模式

  4. 注册模式

  5. 适配器模式

  6. 观察者模式

  7. 装饰器模式

  8. 原型模式

手写单例模式(例子而已)

<?php

class Singleton
{
    private static $instance;
    
    private function __construct() {}
    
    private function __clone() {}
    
    static public function get()
    {
        if (!self::$instance) {
            self::$instance = new Singleton();
        }
        
        return self::$instance;
    }
}
Singleton::get();

git

git新建分支有几种方式

git checkout -b 分支

它是下面两条命令的简写

git branch 分支

git checkout 分支

因此两种方式可创建新分支

composer

使用composer好处

  1. 项目开发成员使用同版本的bundle,减少分歧
  2. 保证生产环境和开发环境使用bundle统一
  3. 不需要关心包的依赖性问题,也不会出现多个bundle依赖同一个bundle时,重复下载
  4. 当bundle有新的更新时,只需要composer update,不需要手动修改任何文件

mysql

覆盖索引:包含所有满足查询需要的数据的索引(explain中extra为using index)

聚集索引:物理索引,也就是表中数据的物理顺序和索引顺序相同。一个表只能有一个聚集索引,一般为主键id,当没有主键id时,会以第一个唯一非空索引为聚集索引。若没有合适的唯一索引,innodb会自动生成隐藏的主键作为聚集索引

强制索引:当有多索引时,mysql会自动选择一个索引进行使用,而我们并不想使用此索引时,就会用到强制索引。使用方法:from 表名 index(要使用的索引名)

聚集索引和非聚集索引区别

  1. 聚集索引一张表只能有一个,非聚集所以可存在多个
  2. 聚集索引存储记录是物理上连续,非聚集索引是逻辑上连续
  3. 聚集索引: 物理存储按照索引排序;聚集索引是一种索引组织形式,索引的键值逻辑顺序决定了表数据行的物理存储顺序

  非聚集索引: 物理存储不按照索引排序;非聚集索引则就是普通索引了,仅仅只是对数据列创建相应的索引,不影响整个表的物理存储顺序.

  1. 索引是通过二叉树的数据结构来描述的,我们可以这么理解聚簇索引:索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。

优势与缺点 :

聚集索引插入数据时速度要慢(时间花费在“物理存储的排序”上,也就是首先要找到位置然后插入),查询数据比非聚集数据的速度快

摘自

查一行数据的最大值:greatest(字段)

mysql存储引擎

nosql

memcache和redis区别

  1. 数据结构:memcache只有key/value(value限制大小1M),redis数据类型较为丰富,string、list、hash、set、zset(512M)
  2. 存储:memcache存储在内存中,redis可以定期存储在磁盘中。因此redis数据具有持久化的特点
  3. 性能:Redis单核,memcache多核。在100k以上数据,memcache性能高于redis

memcache和redis的应用场景

memcache应用场景:

  • 减少数据库负载,提升性能,需要缓存只是简单的key-value结构数据,并且value小于1M,适合多读少写
  • 秒杀功能

redis应用场景:

  • 数据需要持久化
  • 处理业务复杂的数据
  • 对安全性要求高的

参考

redis持久化的方式

有两种持久化方式:RDB持久化和AOF持久化

RDB持久化是将redis内存中的数据定时dump到磁盘上

AOF持久化是将redis的操作日志以追加的形式写入文件

二者区别

RDB持久化是指定时间间隔内将内存中数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,成功后,在替换之前的文件,用二进制压缩存储。

RDB

AOF持久化是以日志的形式记录服务器每个写、删除操作

AOF
摘自

redis中set和list区别

list是链表结构,双向链表,可以在左右两边对数据进行操作;有序

set是一个集合,集合中的数据不能重复;无序

前端

如何理解css盒模型

盒模型,从里到外,content,padding,border,margin

分为w3c标准模型和ie模型

两者的区别在于,w3c模型的height是content的height,width是content的width。而ie的height和width是content+padding+border的height和width;

服务器

从浏览器输入地址到页面展现的过程

  1. 根据域名寻找ip
  2. 通过ip找到服务器
  3. 向服务器发送三次握手,建立连接
  4. 向服务器发送请求
  5. Nginx通过配置文件,执行相应的操作。当请求为静态请求时,直接找到静态文件。当请求为动态请求时,将调用fastcgi接口,也就是socket
  6. socket将请求传给php-fpm,php-fpm通过master找到空闲的进程wrapper,将请求传给他进行php的解析处理。
  7. 解析完成后,wrapper将结果通过fastcgi接口,沿着固定的socket传递给Nginx,Nginx将数据传回客户端
  8. 浏览器就行dom渲染

如何通过域名寻找到ip

  1. 浏览器缓存中查找
  2. 本地host查找
  3. DNS解析中查找
  4. 到Root Server域名服务器解析
  5. 根据根域名返回的主域名服务器地址发送请求找到二级域名地址
  6. 在获取三级域名,直到最后获取了域名的ip返回

Nginx和php是如何通信的

Nginx和php之间是通过fastcgi接口,而具体实现fastcgi接口的方式有两种:

一种是unix socket。优点:快,消耗资源少

另一种是tcp socket。优点:Nginx和php-fpm不再相同机器上时,可通信。像负载均衡。保证数据正确性、完整性

php-fpm的配置参数

pm:dynamic (动态);static(静态)
当pm为static时:
pm.max_children:n (进程数量)
当pm为dynamic时:
pm.min_spare_servers (空闲进程最小值)
pm.max_spare_servers (空闲进程最大值)
pm.start_server (启动时的进程数)

GET和POST区别

  1. 语义不同,get用于获取数据,post用于提交数据

  2. get的url长度是和浏览器有关的,http协议中并没有做限制。ie为2803字符;Chrome 8182;firefox 65536;Safari 80000。Apache:8192;Nginx:配置:client_header_buffer_sizelarge_client_header_buffer配置。

    post也是没有限制的,php中POST参数大小是有做限制的,post_max_size默认为20m

  3. get是幂等的,post是不幂等的。【幂等:一次请求和多次请求具有同样的副作用=】

  4. POST相对get请求来说会安全一些

session和cookie区别

  1. session存在服务器端,cookie存在客户端
  2. session一般依赖于cookie:session是用session ID来确认当前会话的,而session id 是存在cookie中,通过cookie来进行传递的。

【那浏览器禁用cookie之后是不是session就没有作用了呢】 在php中,通过配置session.use_trans_sid=1,可以使得当浏览器禁用cookie的时候,通过url传参将session id传过去。(url重写)

  1. cookie不是很安全,访问页面时可以进行cookie伪装。

推荐一篇好文

可以在哪些地方做缓存

  • 数据库端缓存

    单独使用一张表存储统计结果,定时进行更新。提高查询速度和数据库性能。

  • 应用层缓存

    缓存数据库查询结果,memcache、redis

    缓存磁盘文件数据。常用数据可存至内存

  • 前端缓存 一般css,js,图片静态文件这样缓存比较多

  • 客户端缓存 浏览器访问一次后,缓存在浏览器端,在请求不向服务器发起请求,减轻服务器分担加快访问速度

HTTP状态码

301 永久重定向

302 临时重定向

414 url长度过长,超过限制

419 客户端访问过于频繁,超出限制

503 服务器超负荷,暂时不能处理请求

http和https的区别

  • http传输内容为明文未加密的,较为不安全;https是基于http+ssl协议进行加密传输
  • https需要申请证书,需要费用
  • http端口是80;https端口是443

https需要几次握手

https

负载均衡原理

  1. 重定向实现负载均衡
  2. DNS负载均衡
  3. 反向代理负载均衡
  4. ip负载均衡

负载均衡策略

  • 轮询:依次分发到每台应用服务器上,所以每台处理请求数相同
  • 加权轮询:按照配置的权重将请求分发,高性能的服务器分配更多请求。
  • 随机:随机分配
  • 加权随机:
  • 最少连接:记录每个应用服务器正在处理的连接数,将新的请求分发到最少连接的服务器上。
  • 加权最少连接
  • 源地址散列:根据来源的IP地址进行Hash计算得到应用服务器,这样来自同一个IP地址的请求总在同一个服务器上处理。该请求的上下文信息可以存储在这台服务器上

文章

linux常用操作命令

日志分析

查看访问量前十的ip

cat log | awk '{print $n}' | sort | uniq -c | sort -k 1 -n -r | head -10

查看日志中出现一百次以上的ip

cat log | awk '{print $n}' |sort | uniq -c |awk '{if ($1>100) print $0}' |sort -nr

查看页面中访问超过100次的页面

cat log | awk '{print $7}' | sort | uniq -c | awk '{if ($1>100) print $0}'

统计某url一天的访问次数

cat log | grep '04/Jun/2018' | grep 'url/url...' | wc | awk '{print $1}'

进程

查看进程:ps -ax (-a all;-x 显示没有控制终端的进程)

查看所有php进程:ps -ax | grep php

杀某个进程:kill -9 进程号

杀掉所有php进程:pkill -9 php