php知识点
模拟面试
Php
-
php数组
in_array is_array array_merge array_push 从尾部插入 array_pop 从尾部移除 array_shift 从头部移除 array_unshift 从头部插入 array_map array_keys array_key_exists array_key_first array_key_last array_values array_column array_diff 获取两个数组的差集 array_intersect 获取两个数组的交集 array_chunk 将数组分块 array_reduce count foreach explode join sort -
oop面向对象
1.封装:将对象信息通过访问权限修饰符隐藏,不允许外部直接访问. 2.继承:子类继承父类的方法与属性. 3.多态:方法重写和重载 -
php 超全局变量
$GLOBAL $_GET $_POST $_FILES $_COOKIE $_SESSION $_SERVER $_REQUEST $_ENV -
魔术方法
__construct __destruct __call __callStatic __get __set __isset __unset __sleep __toString __clone __wakeup -
魔术常量
__FILE__ __LINE__ __DIR__ __CLASS__ __METHOD__ __FUNCTION__ -
数据结构,基础算法,设计模式
- 数据结构
-
数组
-
链表
-
栈
array_unshift()从头部入队
array_shift()从头部移除
array_pop()出队
-
队列
array_push()从尾部入队
array_pop()出队
-
树
- 二叉树
- b+树
-
- 基础算法
-
二分查找
function search(&$arr,$number,$left,$right) { /** * 先计算中位数 * 随后将数组中的值与中位数进行比较 * 若在中位数的右侧,则舍去左边部分 $left + 1 * 若在中位数的左侧,则舍去右边部分 $right -1 * 若都不在则返回中位数 */ $mid = intval($left + $right)/2 if($left > $right) { return -1; } if($number > $arr[$mid]) { search($arr,$number,$mid+1,$right); } else if($number < $arr[$mid]) { search($arr,$number,$left,$right -1); } else { return $mid; } } -
插值查找
function insertSort($arr) { $len = count($arr); for($i = 1 ;$i < $len; $i++) { $key = $arr[$i]; $pos = $i while($pos > 0 && $arr[$pos -1] > $key) { $arr[$pos] = $arr[$pos - 1]; $pos = $pos-1 } $arr[$pos] = $key; } return $arr; } -
冒泡排序
function bubbleSort($arr) { $len = count($arr); if($len == 1) return $arr; for($i = 0;$i < $len;$i++){ $isOver = false for($j = 0; $j < $len - $i -1;$j++){ if($arr[$j] > $arr[$j+1]){ $temp = $arr[$j]; $arr[$j] = $arr[$j+1]; $arr[$j+1] = $temp $isOver = true; } } if(!$isOver){ break; } } return $arr; } -
快速排序
-
选择排序
-
- 设计模式
-
单例模式
class single { private static $instance; private function __construct() { } public static function getInstance(){ if(!(self::$instance instanceof self)){ self::$instance = new self; } return $self::$instance; } private function __clone() { } } -
工厂模式
class Factory { private static $nameList = [ 'a' => APP\Lib\A, 'b' => APP\Lib\B, ]; public static function GetObject($className){ $obj = new $nameList[self::className](); return $obj; } } -
策略模式
interface Base { public function run(); } class A ipmlements Base { public function run(){ reuturn 'aaaa'; } } class B ipmlements Base { public function run(){ reuturn 'bbbb'; } } class C ipmlements Base { public function run(){ reuturn 'cccc'; } } class Ci { public $sub; public function __construct(Base $base) { $this->sub = $base; } public function test() { $this->sub->run(); } } $test = new Ci(new A) $test->test(); -
门脸模式
class SubSysOne { function methodone() { return 'rethod one'; } } class SubSysTwo { function methodtwo() { return 'rethod two'; } } class SubSysTree { function methodthree() { return 'rethod three'; } } class Facade { private $subSystemOne = null; private $subSystemTwo = null; private $subSystemThree = null; public function __contruct() { $this->subSystemOne = new SubSysOne; $this->subSystemTwo = new SubSysTwo; $this->subSystemThree = new SubSysThree; } public function methodA() { $this->subSystemOne->methodone(); } public function methodB() { $this->subSystemOne->methodtwo(); } public function methodC() { $this->subSystemOne->methodthree(); } }
-
- 数据结构
-
网络协议(TCP/IP, HTTP)
-- 三次握手,四次回收 --网络七层 -物理层 -数据链路层 -网络层 -传输层 -会话层 -表示层 -应用层 -IP协议属于网络层 -TCP协议属于传输层 -RPC属于会话层 一、什么是TCP连接的三次握手 第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。 理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。 断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”(过程就不细写了,就是服务器和客户端交互,最终确定断开) -
swoft
-
Restful API
-
Nginx
nginx 是一个高性能的HTTP和反向代理服务器 使用epoll 的IO模型 工作进程一般是cpu核心数的两倍 开启高效传输模式 sendfile on 连接超时时间 fastcgi 调优 -应答时间调整 -接收超时时间调整 proxy_cache / fastcgi_cache 若其他网站引用我们网站的静态资源,我们可以在nginx 上添加防盗链/*- -
cgi与fastcgi与fpm等
cgi 是通用网关接口,用于接收客户端的所有请求,转化为服务器能运行的代码再返回给客户端,在处理完进程后会kill进程 fast-cgi是cgi 的升级版,常驻进程, php-cgi是fast-cgi 的实现,提供了进程管理功能,一个master进程,多个work进程,每个work进程都配备了一个php解释器. --运行流程 www.example.com | | Nginx | | 路由到www.example.com/index.php | | 加载nginx的fast-cgi模块 | | fast-cgi监听127.0.0.1:9000地址 | | www.example.com/index.php请求到达127.0.0.1:9000 | | php-fpm 监听127.0.0.1:9000 | | php-fpm 接收到请求,启用worker进程处理请求 | | php-fpm 处理完请求,返回给nginx | | nginx将结果通过http返回给浏览器 -
rpc
基于会话层的传输协议 -
php 的反射机制
-
递归
-
php四种运行模式
-CGI 通用网关接口,有多少个连接就有多少个cgi子进程,效率低 -fast-cgi -cli -DLL模块 -
上传文件
<?php $uploaddir = '/var/www/uploads/'; $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); echo '<pre>'; if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { echo "File is valid, and was successfully uploaded.\n"; } else { echo "Possible file upload attack!\n"; } echo 'Here is some more debugging info:'; print_r($_FILES); print "</pre>"; ?> -
DDD领域设计
接入层 -内部rpc服务 -对外api服务 业务层 -业务层insterface调用,模块独立化 服务层 -controller代码处理逻辑 基础设施层 -系统局部与全局基础设施搭建
Mysql
- 索引优化
- sql注入
- 查询优化
- explain
- 存储优化
- 事务等待
- 分库分表
- 读写分离
Redis
- 业务场景
- 消息队列
- 缓存
- 解决秒杀
- 数据结构
- 字符串
- 列表
- 哈希
- 有序集合
- 无序集合
Docker
-
基本指令
-
什么是docker
-
docker 与虚拟机有什么不同
-
什么是docker镜像
-
什么是docker容器
-
docker有哪几种状态
Laravel
- 中间件的实现原理
- 优缺点以及与其他框架比对
- 容器 循环依赖
- 服务优化
- sso单点登陆(jwt)
- 服务提供者
- 门脸
- 领域设计
- Elastic search
http与nginx
- http与https
- IP/TCP协议
- nginx基本配置及优化
kafka与RabbitMQ
- 消息队列搭建
Linux 与 Shell
- 常用指令
- 查看进程 ps -ef | grep deadloop.php
- 查看网关 route -n
- 终止进程 pkill -9 pid
- 关机重启 reboot(重启) halt(立即关机)
- 查找文件 find [范围] [-条件] [文件名]
- 创建目录 mkmir [文件夹名称]
- 创建文件 touch [文件名]
- 删除文件夹及文件 rm -rf [dir1]
- 压缩文件 tar -zcvf [文件名] [压缩路径]
- 解压文件 tar -zxvf [文件名]
- 移动文件 mv [文件名]
- 复制文件 cp [原文件名] [新文件名加路径]
- 创建用户 useradd [用户名] passwd [用户名]
- 切换登陆用户 su 用户名
- 查看目录 ls
- 进入目录 cd [文件名]
- 删除文件 rm -f [文件名]
- 删除目录 rm -r [文件夹]
- 定时任务 crontab
- 添加文件权限
- ping
- ifconfig
- wget
- yum
Vue
Golang
- 基本语法
PHP 相关
- 平常都使用的什么框架?Laravel 和 ThinkPHP 框架的区别?
共同点:都支持composer
不同点:1.laravel拥有中间件,tp拥有初始化函数_interlize
2.laravel提交表单有csrf验证, tp需要手动完成防跨站请求的代码
3.渲染方式不同,laravel中是return view(),tp中是$this->display();
4.laravel内置了hash加密,tp则是md5()加密
5.laravel可以使用php artisan migrate命令建表.laravel有专用的tinker直接与应用进行交互,建立模型建表都可以用artisan
6.laravel拥有blade模板
7.laravel必须定义路由,tp的请求路径则是请求类与请求方法拼接
tp是国人开发,MVC风格也比较适合国人思想,
- laravel效率怎么样?有没有优化过laravel框架?
laravel 由于每次请求都要加载一系列的服务及配置,所以性能方面会低很多,但是通过一些优化,性能会提升一下.
1.缓存路由 php artisan route:cache
2.优化composer 自动加载
3.缓存配置文件 php artisan config:cache
4.关闭debug
5.删除缓存文件php artisan optimize
- Laravel 常用到的功能有哪些?Laravel 依赖注入实现的原理是怎么样的?
dd()
artisan
migrate 建表
定时任务
集合
缓存
路由
模型orm
一个类需要依赖另外一个类来实现功能, 利用了php的反射机制来构造
- Swoole 你用到了哪些功能?对协程这一块了解吗?
能说说 PHP 的生命周期吗?传统的 php-fpm 模式和 swoole 有什么区别?
在项目中都是怎么用 hyperf 的?了解 hyperf 中的依赖注入实现原理吗?使用 hyperf 中的类是怎么实现的,是通过注解引入吗?
说说你在项目中使用到的 PHP 函数,任意说几个以及它的功能?
--string
--array
--sort
--file
- PHP 的垃圾回收机制是怎么样的?
php中的变量存储在变量容器zval中,zval中除了存储变量类型和值外,还有is_ref和refcount字段。refcount表示指向变量的元素个数,is_ref表示变量是否有别名。如果refcount为0时,就回收该变量容器。如果一个zval的refcount减1之后大于0,它就会进入垃圾缓冲区。当缓冲区达到最大值后,回收算法会循环遍历zval,判断其是否为垃圾,并进行释放处理。/*
- PHP5 的版本和 PHP7 之间有哪些区别?对 PHP8 了解吗,任意说说其中的新特性?
1.性能提升, php7比php5性能提升了两倍
2.php7新增了函数返回类型声明及标量类型申明
3.php7新增了匿名类
4.php7中if条件中的数据key若不存在会直接报错,而php5则直接返回false
5.php7中新增了比较运算符
说说 php-fpm 与 NGINX 工作原理是怎么样的?
cgi 与 fast_cgi 关系是怎么样的?
isset、empty 和 is_null 区别是怎么样的?如果传递一个 null,该三个函数分别返回什么?
false,false,true
isset 表示变量是否设置, 当传递 false null 0 空串 empty会返回true反之为false ,is_null 用于判断该参数是否为null 类型
require_once 与 include_once,require 与 include 的区别?为什么一个是警告一个是致命错误?
require 在执行过程中若出现异常则会抛出一个致命错误,中断后续的程序 , 而include在执行时出现异常则会报一个wating警告,继续执行后面的代码.
require_once 与 include_once 表示只执行一次, 不重复引入
php-fpm 的工作模式?进程数量配置依据是什么?
说说 PHP 数组中的数据结构是怎么样的?
Redis 相关
-
平常使用 Redis 都是在哪些场景?
- 5大数据类型
- 字符串
- 列表
- 哈希
- 有序集合
- 无序集合
- 用于缓存
- 加载权限列表
- 为的是服务无状态
- 因为http 是无状态协议
- 5大数据类型
-
Redis 是单线程还是多线程?
- 无论什么版本,工作线程就是一个
- 6.x版本出现了IO多线程
-
遇到过Redis缓存穿透吗?
- 穿透:redis 没有数据,直接穿透到mysql
- 避免无效请求
- 布隆过滤器:过滤掉缓存中与数据库中都不存在的数据
-
遇到过Redis缓存击穿吗?
- 击穿:添加互斥锁, 当串行在redis中为获取到key,那么会直接请求到数据库,这个时候,如果在数据库返回null时,那么后续在redis中没有的key将会进行取锁操作,没有取到所的将sleep,取到锁的将访问数据库。为的就是减少数据库操作。抢上的DB O(1)
-
遇到过Redis 雪崩吗?请简述一下
- 雪崩: 将缓存数据过期时间设置为随机, 设置热点数据永不过期.
-
缓存是如何回收的(删除过期key)?
- redis 无用的key,在请求时判断是否i已经过期
-
如何进行缓存预热
- 如何先提前部署缓存数据
- 规避差集(没有缓存的数据),
-
数据库与缓存不一致?
- 我们可以使用分布式事务来解决(不推荐)
-
简述一下主从不一致的问题?
- redis 是缓存, 更倾向于稍微的有时差
- 减少DB操作
-
简述下主从不一致的问题?
- redis 是默认弱一致性的
- 锁不能用主从
-
Redis 的持久化有哪几种?有什么区别?实现的原理是怎样的?
1. AOF 2. RDB
Redis 的事务了解吗?事务都有哪些注意的地方?
Redis 都有哪些数据类型?你是怎么选择数据类型的?底层的数据结构是怎么样的?
Redis 能够实现命令批处理吗?
Redis 的哨兵机制了解吗?实现原理是怎么样的?
Redis 的主从复制实现原理是怎么样的?如何保证数据一致性?数据延迟又该如何处理?
利用 Redis 如何实现队列功能?
消息发布与订阅有使用过吗?怎么使用的?中间又遇到过什么问题吗?
如何解决缓存穿透、击穿和雪崩问题?
Redis 作为一个内存型数据库,如何更好的解决内存的占用?
Redis 与 memcached 的区别?什么时候会选择 memcached?
redis相比与memcached 更适合做存储
memcached因为数据结构是key-value的形式适合做缓存
MySQL
列举几个 MySQL 索引失效的情况?该如何优化这些情况?
MySQL 索引都有哪些?InnoDB 索引是用的什么数据结构,为什么使用这种数据结构?
全文索引
-- 用于文章
唯一索引
-- 主键索引
-- 唯一索引
联合索引
-- 当where 条件中为联合查询时,使用联合索引
普通索引
-- 用于提高查询效率
MySQL设计规范? 常见的设计小问题?
MySQL 主从复制是如何实现的?如果从节点挂了,重新启动从节点,如何保持数据一致性?如何解决数据同步延迟问题?
说说你优化 SQL 语句的几种思路有哪些?
说说 MySQL 中的锁有哪些?之间的区别?
MySQL 中的事务了解吗?说说其 4 大特性?
事务中隔离性,有几种情况?这几种情况分别会产生什么问题?
MySQL 中 MVVC 实现的原理是怎么样的?
mongodb 与 mysql 的关系,为什么日志系统会选择 mongodb?
RabbitMQ
主要使用的场景在哪些地方?
工作模式都有哪些?之间的区别是怎么样的?
如何保证消息的可靠性?
日志存储在 RabbitMQ,如果同步到 MongoDB 里面,如何解决新旧数据问题?(这里提到了一个公司实际业务问题,公司日志会存储到 MongoDB,如何保证每次存的都是最新的消息)
你知道哪些消息队列?这些消息队列有什么区别?
Redis(简单的消息队列)
Kafka()
RocketMQ
软件设计
有一个电商营销活动系统,你该如何去设计这个系统,保证系统不会出现问题?
项目中哪些地方用到了消息队列?是如何设计的?
- 电商系统中,如何保证商品库存不会超卖问题?
- 如果一页面请求慢,该从哪些方面排查?
- 前端
- 网络
- 服务端代码
- mysql查询速率
1、事务四大特性
原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。
一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。
隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。
持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
2、事务的并发问题
脏读:事务 A 读取了事务 B 更新的数据,然后 B 回滚操作,那么 A 读取到的数据是脏数据
不可重复读:(事务 A 多次读取同一数据,事务 B 在事务 A 多次读取的过程中,对数据作了更新并提交,导致事务 A 多次读取同一数据时,结果 不一致。)(重点:数据修改)
幻读:系统管理员 A 将数据库中所有学生的成绩从具体分数改为 ABCDE 等级,但是系统管理员 B 就在这个时候插入了一条具体分数的记录,当系统管理员 A 改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。(重点:数据新增或删除)
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
3、MySQL 事务隔离级别
未提交读(READ UNCOMMITED)(没提交的数据可读,脏读,这些数据称为脏数据)
已提交读(READ COMMITED)(已提交的数据可读,不可重复读)
可重复读(RePEATABLE READ)一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。
可串行化(SERIALIZABLE)(读操作会隐式获取共享锁,可以保证不同事务间的互斥,锁表,别想搞什么鬼,缺点也很明显,看到锁表你就懂的哈,效率问题)
面试官问的面试题:
1.php一些基础的数组使用,
2.linux操作命令统计pv,uv这些,
3.git命令的使用,
4.redis如何实现延迟队列,分布式锁这些,
5.php的结构,fpm配置这些。
6.主要问对技术层面的把控度,比如如何设计高并发系统,需要考虑什么问题?可能会现在的问题,如何去预防,有什么方案处理?
7.职业规划
nginx:
epoll模型
nginx和fpm的交互流程
有哪些优化项
负载均衡策略和对比
限流
mysql:
锁机制,索引,事务,隔离级别和对应解决的问题。
sql查询优化,以及explain计划。
mysql比较常见的细节问题,比如:innodb的特点,Hash索引和B+树区别,非聚簇索引和回表查询,以及写sql能力的考察。
算法:
全排列,各种排序,二分查找。
操作系统:
进程状态,IPC,调度算法,线程和协程,死锁。
计算机网络:
五层分别哪些。tcp、udp区别。同源测略和跨域。
一个网页从输入地址回车,到完整展示网页内容这段时间里,做了哪些工作。
keepalived是什么,有什么作用(tcp)。
cdn如何防篡改,https如何安全。
Redis:
使用场景,淘汰策略,持久化,主从哨兵和底层实现。
php:
zval结构,垃圾回收,7新特性,get|post,session,cookie,字符串,数组函数的用法,命名空间,composer
fpm的优化,三种配置方式,静态方式如何确定最大worker数
业务相关的问题:
接口设计,鉴权部分设计,单点,单用户,高并发,防超卖,Saas项目架构设计。
开放式的问题:
请简单介绍一下你做的这个项目
近期遇到比较棘手的问题、有挑战性的问题,你是如何去解决这个问题的。
- 你在职期间做的最成功的一个项目是什么?
面试考点
- Javascript, jQuery以及Ajax
- Linux基础知识
- Mysql 数据库基础
- 程序设计
- php框架基础知识
- Mysql 基础知识考点
- Mysql创建高性能的索引考察点
- Mysql的SQL语句编写及优化
- Mysql 的高可扩展和高可用及安全性
- 常见数据结构特征
- 算法的工作原理
- 时间复杂度
- 空间复杂度
- 其他逻辑算法
- php内置函数实现
- 如何理解高并发
- PV
- UV
- QPS
- 优化时机
- QPS阶段性优化
- 优化案例
- 防盗链
- 减少http请求
- 浏览器缓存
- cdn加速
- 数据库缓存
- Mysql 的读写分离
- 分区及分库分表
- LVS负载均衡
真题
-
什么是引用变量?在php中,用什么符号来定义引用变量?
概念: & 查看zval变量容器 xdebug_debug_zval($a) is_ref 变量内存空间是否重新赋值 refcount 运用该空间的变量个数 -
说一下session与cookie的区别?
因为http 是无状态的,前后没有联系,所以我们使用session进行会话控制. Cookie: 设置setcookie($name,$value,$expire,$domain); 读取:$_COOKIE 存贮不敏感重要信息 不会占用服务器资源 Session: Session是基于cookie,session 是存储在服务器端. session_start(); $_SESSION = [] session_destroy();销毁 Cookie中存储了session_id,如果禁用掉的话,session_id无法正常传递.那么就要到url中去拼接或echo 常量SID 若会话多台服务器,那么我们将会把session存储到redis,memcache中 session_set_save_handler() -
你是否使用过版本控制器?
集中式 都放在一台服务器中 分布式 -
Nginx + php-fpm
cgi: 通用网关接口,是一种通信协议 fastcgi: 是cgi的升级版,保留进程,处理多个进程 php-fpm: fastcgi 的进程管理器,一般一个master进程,多个worker进程.master端口主要进行监听端口负责接收来自web的请求,worker进程解析请求. -
php常见配置项
register_globals 接收来自客户端的变量,默认关闭 allow_url_fopen 打开远程文件 allow_url_include 引用外部资源 date.timezone 设置时区 display_errors bug展示 error_reporting 错误级别 safe_mode 安全模式 upload_max_filesize 最大上传文件大小 max_upload_file 最大上传文件数量 -
正则表达式考点
至少写出一种验证139开头的正则表达式 preg_match(); preg_match_all(); 正则表达式的作用: 分割,查找,匹配,替换字符串 分隔符:正斜线(/),hash符号(#)以及取反符号(~) 通用原子: \d, 数字0-9 \D, 除了0-9 \w, _ \W, 除了_ \s, 空白符 \S 除了空白符 元字符: . 除了换行符外的任意符号 * 匹配前面的内容出现一次或多次 ? 零次或者一次 ^ 必须以它开头 $ 必须以他结尾 + 出现一次及以上 {n} 出现n次 {n,} 大于n次 {n,m}, 大于n次,小于m次 [] 集合,匹配括号内的字符集 () [^] 取反,除了集合内的字符 | 或者 [-] 范围 模式修正符: i 不区分大小写 m e s U x A D u 匹配中文: '/[x{4e00}-\x{9fa5}]+/u' 请写出以139开头的11位手机号码的正则表达式: .*? 忽略中间元素 -
文件读取/写入操作
fopen()函数 打开模式: r 只读方式打开(文件指针指向开头) r+ 读写方式打开 w 只写方式打开(会先清空文件) w+ 读写方式打开(若文件不存在会创建文件) a 追加的写入方式 a+ 读写的追加方式(将文件指针指向文件末尾) x 以写入的方式打开(将文件指针指向文件开头) x+ fread() 读取文件 fwrite() 写入文件 fclose() 关闭文件 写入函数 file_put_contents() 读取函数 file_get_contents() 访问远程文件 开启allow_url_fopen, 名称相关:basename(),dirname() 目录读取:opendir(),readdir(),closedir() 删除目录:rmdir() 目录创建:mkdir() 文件大小:filesize() 删除文件:unlink() 重命名文件或目录:rename() 文件属性:file_exists() -
面向对象
- 权限控制修饰符
- public
- protected
- private
- 封装继承多态
- 权限控制修饰符
-
网络协议
-
HTTP状态码
- 20x 响应成功
- 30x 重定向
- 40x 客户端错误
- 50x 服务端错误
-
osi七层模型
- 物理层
- 数据链路层
- 网络层
- 传输层
- 会话层
- 表示层
- 应用层
-
http的工作特点及工作原理
-
http 是无状态协议
-
基于B/S模式
-
通信开销小,简单快速
-
客户端发送给服务器,创建一个tcp连接,指定端口号为80,当服务器监听操到浏览器发送的请求将会进行分析解析然后返回.
-
http协议常见的请求头
- Content-Type
- Accept
- Origin
- Cookie
- Cache-Control
-
http的请求方法
- GET 查找幂等资源
- POST 创建资源
- HEAD
- OPTIONS
- PUT 修改资源
- DELETE 删除资源
- TRACE
-
GET与POST 的区别
- get可以收藏为书签
- get可以在浏览器后退
- get可以被缓存,post
- get会存入历史
- get会有长度限制,post则没有
- post可以发送文件
- post安全性更好
-
常见网络协议及端口
- FTP 21
- Telnet 23
- SMTP 24
- HTTP 80
- HTTPS 443
-
-
-
php数据类型
- 标量
- 浮点 二进制运算中
- 布尔
- 0
- 0.0
- ' '
- '0'
- false
- array()
- null
- 整形
- 字符串
- 复合
- 数组
- $GLOBALS
- $_GET
- $_POST
- $_REQUEST
- $_SERVER
- $_SERVER['SERVER_ADDR'] 请求IP地址
- $_SERVER['SERVER_NAME'] 请求服务器名称
- $_SERVER['SERVER_TIME'] 请求时间
- $_SERVER['SERVER_QUERY'] 请求参数
- $_SERVER['REMOTE_ADDR'] 客户端IP
- $_FILES
- $_COOKIE
- $_SESSION
- $_ENV
- 对象
- 数组
- 特殊
- null
- 标量
-
JavaScript 基本语法
- 数据类型(JavaScript变量均为对象,当您声明一个变量时,就创建了一个新的对象)
- 字符串
- 数字
- 布尔
- 对象
- 数组
- Null
- Undefined
- 创建对象
- new Object()
- 使用对象构造器
- var obj = {}
- 运算符
- 使用+拼接
- Window对象
- DOM对象
- Document
- Element
- Attr
- Event
- 数据类型(JavaScript变量均为对象,当您声明一个变量时,就创建了一个新的对象)
-
jQuery 基本语法
- jQuery选择器
- 基本选择器
- 层次选择器
- 过滤选择器
- 可见性过滤选择器
- 属性过滤选择器
- 子元素过滤选择器
- 表单对象属性过滤选择器
- jQuery事件
- $('button').click(function(){...some code...})
- ...
- jQuery效果
- $('div').show
- ...
- jQuery DOM操作
- 属性
- 值
- 节点
- css
- 尺寸
- jQuery常用Ajax操作
- $.ajax()
- $.get()
- $.post()
- $.getJSON()
- $.getScript()
- jQuery选择器
-
代码实例
-
- document.getElementById('test').className = 'good' -
- $('#test').className = 'good'; -
- $(function(){ $('#test').click(function(){ }) })
-
-
Mysql
-
数据类型
- 整数类型
- TINYINT
- SMALLINT
- MEDIUMINT
- INT
- BIGINT
- 实数类型
- FLOAT
- DOUBLE
- DECIMAL(decimal可存储比bigint还大的整数)
- 字符串类型
- VARCHAR
- CHAR
- TEXT
- BLOB
- 枚举(避免使用数字作为ENUM的常量)
- 时间函数
- TIMESTAMP(尽量使用这个)
- DATETIME
- 整数类型
-
常用操作
mysql -u -p -h -P -
Mysql数据表引擎
-
InnoDB
-
- 默认事务型,最重要最广泛的存储引擎,性能优秀的数据存储在共享表空间. - 读取数据时会在内存中构建hash索引 - 插入数据时会自动构建插入缓冲区 -
支持热备份
-
支持崩溃后安全修复
-
支持行级锁
-
支持外键
-
事务处理
-
数据存储在共享表空间
-
-
MyISAM
- 拥有全文索引,压缩,空间函数
- 不支持事务和行级锁,不支持安全恢复
- 表锁
- 支持全文索引
- 数据存储在MYD文件与MYI文件
-
其他表引擎
- CSV
- Memory
-
-
MySQL锁机制
-
读锁
- -
写锁
-
锁粒度
表锁,系统性能开销最小,直接锁定整张表 行锁,
-
-
MySQL索引
-
类型
- 主键索引 - 普通索引 - 唯一索引 - 联合索引 - 全文索引 -
影响
减少服务器开销 将随机I/O变顺序I/O 提高查询速度,降低写入速度 -
场景
- 对于非常小的表,直接全表扫描 -
注意
- 复核索引遵循前缀原则
- like查询,%不能在前,可以使用全文索引
- column is null 可以使用索引
- 如果MySQL估计使用索引比全表扫描更慢,会放弃使用索引
- 如果or 前的条件中的列有索引,后面的没有,索引都不会被用到
- 列类型是字符串,查询时一定要给值加引号,否则索引失效
-
-
查询语句
-
联合查询
union 会合并重复的列 union all 会查询出所有的列 select * from a union select * from b -
连表查询
- left join
- inner join
- right join
-
嵌套查询
select * from where id in (select id from b where ...)
-
-
查询优化
-
explain
-
show profiles
set profiling =1;开启,服务器上执行的所有语句会检测消耗的时间,存到临时表 show profiles 查询执行sql日志 show profile for query 临时表ID -
show status
-
show processlist
查询是否有大量线程处于不正常的状态或特征 -
查询不需要的记录,使用limit解决
-
多表关联取出全部列, 少用select *
-
查询相同的数据,可以只用缓存
-
分解关联查询, 将关联语句差分为多条SQL来执行
-
优化limit 分页, 记录上次查询的id添加到where条件中
-
union all 的效率高于union
-
-
分库分表
- 当表数据达到百万或千万时需要进行分表
-
算法的概念
-
时间复杂度
问题规模n的函数f(n),算法的时间复杂度记为T(n) = O(f(n)) 随着n越大,算法执行的时间的增长率与f(n)的增长率正相关,称作为渐进时间复杂度 时间复杂度为循环递归次数 O(n^2) O(1) O(n) -
空间复杂度
算法需要消耗的内存空间,基座S(n) = O(f(n))
-
-
-
常见数据结构
- Array
- LinkedList(链表)
- Stack(栈,先进后出)
- Heap(堆,二叉堆)
- list(线性表)
- queue(队列,先进先出)
- doubly-linked-list(双向链表)
- set(集合)
- map(字典)
- graph(图)
-
真题
//1,1,2,3,5,8,13,21,34,.... $arr = [1,1] for($i=2;$i<30;$i++){ $arr[$i] = $arr[$i-1] + $arr[$i-2]; } var_dump($arr[30]);-
请写一个函数,实现open_door转换为OpenDoor
<?php function strHandle($str){ $res = ''; $arr = explode('_',$str); foreach($arr as $val){ $res = ucfirst($val) } return $res; } ?> -
字符串反转
<?php function str_rev($str) { $i = 0; while(true){ if(isset($str[$i])){ break; } $i++ } $res = ''; for($j=$i-1;$j>=0;$j--){ $res = .= $str[$j]; } return $res; }
-
-
高并发和大流量解决方案
-
php如何解决网站大流量与高并发
- 高并发架构相关概念
- 高并发解决方案案例
- QPS(每秒钟请求或者查询的数量,每秒响应请求数)
- 吞吐量:单位时间内处理的请求数量(通常由QPS与并发数决定)
- 响应时间:从请求发出到收到响应花费的时间.
- PV(综合浏览量),及页面浏览量
- UV(独立访客):一个用户一定时间内
- 日网站带宽 = PV / 统计时间(秒) * 平均页面大小 * 8
- QPS为每秒钟HTTP请求数量
- 根据每天的QPS, 与 PV,来进行QPS测试,测试能承受的最大并发
- ab -c 100 -n 5000 并发请求100次,总共请求5000次
- 注意: 不要对线上服务做压力测试
-
QPS分析优化
- qps达到50, 一般的服务器可以应付
- qps达到100, 1秒钟完成100次请求,但是我们不能保证数据库查询能完成100次,我们可以做一个数据库缓存, 数据库负载均衡
- qps达到800, cdn加速, nginx负载均衡
- qps达到1000, 让memcache 的请求远大于DB的请求, 静态HTML缓存
- qps达到2000, 做业务分离,分布式存储.
-
流量优化
- 防盗链处理: 对于恶意请求, 减少外部使用服务器内部资源;
- 前端优化: 减少http请求,将css请求进行合并,添加异步请求.启用浏览器缓存和文件压缩,CDN加速
- 服务端优化: 页面静态化, 并发处理, 多进程, 多线程, 队列处理
- 数据库优化: 数据库缓存, redis缓存, 分库分表, 分区操作,读写分离,负载均衡
- web服务器优化: 负载均衡, 反向代理
-
防盗链
- 在请求头referer 中加一个域名
- 在请求头中设立一个签名
- Nginx 模块中ngx_http_referer_module 用来阻挡非法域名请求
- 当访问gif,jpg,png,flv等静态资源我们来验证请求源是否合法
-
HTTP连接产生的开销
域名解析--TCP连接--发送请求--等待--下载资源--解析时间 DNS 缓存 Keep-Alive -
图片地图
使图标的图片都在一张图片上 -
合并js,css
-
静态化,开启缓冲区
-
开启epoll模型
-
php高并发解决
php 的swoole mq 并发调度 -
mysql的查询缓存
query_cache_type 为2 时即可使用查询缓存 query_cache_size 查询缓存预留的内存 -
nginx负责均衡策略
功能强大,运行稳定 配置简单灵活 能够自动剔除工作不正常的后端服务器 上传文件使用异步模式 支持多重分配策略,可以分配权重,分配方式灵活 nginx策略 内置策略: IP Hash ,加权轮询 扩展策略: 加权轮询策略: 首先将请求都分给高权重的机器 IP Hash策略: Nginx内置的另一个负载均衡 fair: 根据后端服务器的响应时间判断负载策略,选择最轻的机器进行分流 通用Hash ,一致性Hash策略http { upstream cluster { server srv1; server srv2; server srv3; } server { listen 80; location / { proxy_pass http://cluster } } }
-