redis 与 memcache
两者区别
- 数据持久化
- 数据结构
- 内存管理方式
- 多线程还是单线程
- 数据如何保持一致性 事务和CAS
- 分布式的实现方式 一致性哈希
redis持久化的实现
- 快照
- AOF
- no
- everyfsync
- always
mysql
- sql 语句
- group by,order by ,limit顺序以及应用
- where与having区别
- jion on的三种方式 left ,rigit
- 数据库引擎:
- Innodb
支持事务,行级锁,使用聚集索引 - MySIAM
不支持事务,表级锁,使用非聚集索引
- Innodb
- 索引的实现原理:
B+Tree - 事务:
- 特性:原子性,一致性,隔离型,持久性
- 级别:读未提交,读提交,可重复读,序列化
- 数据库的分区,分表:
- 分表:merge引擎
- 分区:range,list,key,hash
- 如何优化数据库
- 分布式,读写分离,主从同步
- doublewrite 机制
- 存储时间的类型 datetime
nginx 与 apache 区别
- 优缺点
- nginx负载均衡的实现方式
- 启动PHP的方式:mod ,端口号或者unix,socket文件
HTTP协议
http概念
request
- 请求行:各种请求方法
- 消息报头
- 消息体
response
- 状态行:各种状态码都是什么含义
- 消息报头
- 消息体
长链接与短链接的优缺点
TCP协议
- 三次握手
- 四次挥手
- TCP与UDP区别
进程与线程
- 概念
- 进程间的通信方式:管道,消息队列
面向对象
- 什么是面向对象
封装,继承,多态;展开解释 - 接口和抽象类的区别
设计模式
- 举例设计模式
工厂,单例,观察者,适配器,mvc - 实现单例模式:
以下是一个简单的实现方式1234567891011class Test{private static $test = null;private function __construct();public function getTest(){if(self::$test == null){self::$test = new Test();return self::$test;}}private function __clone();}
PHP
PHP常用函数:
array函数及说明:
123array_shift(),array_unshift(),array_push(),array_pop(),array_merge(),array_map()array_keys(),array_key_exists(),array_diff(),in_array(),array_values(),array_sum()array_slice()string函数及说明:
12strlen(),substr(),mb_substr(),strstr(),strrchr(),strpos(),str_replace(),str_repeat()unfirst(),ucwords(),chr(),ord(),trim(),implode(),
PHP 底层原理:
- 内核
- zend引擎
- 扩展
- 上层API
fast-cgi 与 cgi
魔术方法,全局变量
魔术方法
1__construct() , __destruct() , __set() , __get() , __sleep() , __clone()全局变量
1_SERVER,_POST,_GET,_COOKIE
描述用户在浏览器端输入地址到页面展示数据的过程
语法基础
- empty() 与 isset()
- display_error() 与 error_report()
- 获取客户端的方法
- datetime与strtotime的应用
- PHP的copy on write,即变量引用的底层实现
- 垃圾回收机制底层实现
- 如何获取header中的信息
框架
- 对框架的认识,理解
web 安全
- DDos
- sql注入:参数化查询
- xss跨站脚本攻击:
- CSRF跨站请求伪造:版本号
对于高并发的处理方式
- 使用队列的方式
- 使用版本号的方法
- 提高服务的抗压能力:
- 首先考虑服务的硬件
- 服务器
- 代码模块化
- 缓存
- 数据库
项目
- 做过的项目一定要弄明白
常考算法
二分查找
12345678910111213141516function binaryFind($arr,$target){$left = 0;$right = count($arr);while($left < $right){$mid = $left + ($right - $left) >> 1;if($arr[$mid] == $target){return $mid;}else if($arr[$mid] > $target){$right = $mid - 1;}else{$left = $mid + 1;}}return -1;}快速排序:
123456789101112131415161718192021222324252627function quickSort($arr,$start,$end){if($start < $end){$p = $arr[$start];$i = $start;$j = $end;while($i < $j){while($i < $j && $arr[$j] > $p){$j --;}if($i < $j){$arr[$i++] = $arr[$j];}while($i < $j && $arr[$i] < $p){$i ++;}if($i < $j){$arr[$j--] = $arr[$i];}}$arr[$i] = $p;quickSort($arr,$start,$i-1);quickSort($arr,$i+1,$end);}return $arr;}斐波那契类似递归
12345678910111213141516171819202122232425//递归function test($n){if($n == 1){$return 1;}if($n == 2){$return 1;}return test($n - 1) + test($n - 2);}//非递归function test($n){$x1 = 1;$x2 = 1;for($i = 3; $i < $n; $i++){$x3 = $x1 + $x2;$x2 = $x3;$x1 = $x2;}return $x3;}已知有序数列中有一个重复的元素,去除
123456789101112function del($arr){$index = 1;$n = count($n);for($i = 1; $i < $n; $i++){if($arr[$i] != $arr[$i - 1]){$arr[$index] = $arr[$i];$index ++;}}return $arr;}给定一个序列,求序列中最大连续字数组和
1234567891011function getMax($arr){$n = count($arr);$curr = 0;$max = $arr[0];for($i = 0; $i < $n; $i++){$curr = $curr + $arr[$i] > $arr[$i] ? $curr + $arr[$i] : $arr[$i];$max = $curr > $max ? $curr : $max;}return $max;}Top-K 问题
堆排序,小顶堆1234567891011121314151617181920212223242526272829303132333435363738//调节堆void heapAdjust(int a[], int root, int n){int tmp = a[root];int child = 2 * root + 1;while(child < n){if(child + 1 < n && a[child + 1] < a[child])child ++ ;if(a[child] < a[root]){a[root] = a[child];root = child;child = 2 * root + 1;}else{break;}a[child] = tmp;}}//初始化堆void heapBuild(int a[], int n){for(int i = (n-1) / 2; i < n; i--){heapAdjust(a,i,n);}}//排序void heapSort(int a[], int n){heapBuild(a,n);for(int i = n - 1; i > 0; i--){swap(arr[i],arr[0]);heapAdjust(a,i,n);}}
linux
- shell编程
常用命令
- 端口占用情况
- 进程启动数量查看
- top
- find,grep,crontab
统计日志 awk
总结
暂时想到这些,后续如果还能回忆起来会追加上。
另:以上感觉是后端从业者应知应会的基本问题;如果上面问题能够对答如流,那BAT应该可以进了。