- PHP 基础知识
- PHP 框架相关
- 前端相关
- Linux 操作
- MySql 数据库
- 算法
- 架构设计
PHP面试中常用到的知识点梳理
PHP 基础知识
变量
PHP 中的变量用一个美 元符号后面跟变量名来表示。变量名是区分大小写的。
知识点
引用变量
概念
在PHP中引用意味着用不同的名字访问同一个变量内容
定义方式
使用&
符号
工作原理
php变量在赋值的时候是遵循COW原则的 即 copy on write. 所谓的cow原则即变量只有在被重新赋值的时候才会开辟内存空间 也就是说 即使我们不使用引用 一个变量被赋值后 只要我们不改变变量的值 也与使用引用一样
常量
常量一经定义,不能被修改和删除
定义方式
const
、define
区别
- const是语言结构,执行更快,define是函数
- define不能用于类常量的定义,const可以
预定义常量
+ __FILE__
: 所在文件的路径和文件名
+ __LINE__
: 所在行的行号
+ __DIR__
: 所在目录
+ __FUNCTION__
: 所在函数的函数名称
+ __CLASS__
: 所在类的类名
+ __TRAIT__
: Trait 的名称
+ __METHOD__
: 类名+方法名
+ __NAMESPACE__
: 命名空间的名称
试题解答
- 什么是引用变量?在PHP当中,用什么符号定义引用变量?
用不同的名字访问同一个变量内容,用 & 来定义.
__FILE__
表示什么意思?表示所在文件的路径和文件名
数据类型
知识点
三大数据类型
- 标量
- 字符型
- 整型
- 浮点型
浮点类型不能用用到比较运算中
- 布尔型
- 复合
- 数组
- 对象
- 特殊
- NULL
- Resource
如:文件打开句柄、数据库连接句柄等
PHP字符串的定义方式及区别
定义方式
单引号
、双引号
、heredoc和nowdoc
区别
- 单引号不能解析变量,双引号可以
- 单引号不能解析转义字符,只能解析单引号和反斜线本身;双引号解析所有转义字符
- 单引号因为不需要解析,所以效率高于双引号
- 变量和变量、变量和字符串、字符串和字符串之间可以用.连接
- heredoc类似于双引号,nowdoc类似于单引号,它俩都用来处理大文本字串
FALSE 的七种情况
以后几种情况,在比较时都是等值的
- 整型0:
0
- 浮点0.0:
0.0
- 空字符串:
' '
- 0字符串:
'0'
- 布尔FALSE:
false
- 空数组:
array()
- NULL值:
NULL
超全局数组
- $GLOBALS
包含下面所有
- $_REQUEST
包含GET、POST、COOKIE,安全性低,尽量少用
- $_GET
- $_POST
- $_COOKIE
- $_SESSION
- $_SERVER
- SERVER_ADDR: 服务器端IP地址
- SERVER_NAME: 服务器名称 - REQUEST_TIME: 请求时间 - QUERY_STRING: 请求信息 - HTTP_REFERER: 上级请求页面 - HTTP_USER_AGENT: Head信息中的user_agent信息 - REMOTE_ADDR: 客户端IP地址 - REQUEST_URL: 请求URL - PATH_INFO: url路径信息 - $_FILES
- $_ENV
NULL值的三种情况
- 直接赋值为NULL
- 未定义的变量
- unset销毁的变量
试题解答
- 用PHP写出显示客户端与服务器IP的代码
echo $_SERVER['REMOETE_ADDR]; echo $_SERVER['SERVER_ADDR];
- PHP中字符串可以使用哪三种定义方法以及各自的区别是什么
单引号、双引号、heredoc
运算
知识点
错误控制符
@
: 将其放置在一个PHP表达工之前,该表达式可能产生的任何错误信息都被忽略掉
运算符优先级
优先级详情查看PHP手册
递增/递减
> !
> 算术运算符
> 大小比较
> 等式比较
> 引用
> 位运算符(^)
> 位运算符(|)
> 逻辑与
> 逻辑或
> 三目
> 赋值
> and
> xor
> or
括号
的使用,可以增加代码的可读性,推荐使用.
比较运算符
** ==
和 ===
的区别:**
===
比 ==
多了类型的判断
递增/递减运算符
+ 不影响布尔值
+ 递减NULL值没有效果
+ 递增NULL值为1
+ 递增和递减在前就运算后返回,反之就先返回,后运算
逻辑运算符
短路作用 ||和&& 与 or和and 的优先级不同
试题解答
流程控制
知识点
循环遍历
for循环
只能遍历索引数组
foreach循环
可以遍历索引数组,也可以遍历关联数组。
遍历完后,数组指针会reset到开始状态
while+list()+each()组合循环
list() 函数用于在一次操作中给一组变量赋值。 语法:list(var1,var2…)
each() 函数返回当前元素的键名和键值,并将内部指针向前移动。 该元素的键名和键值会被返回带有四个元素的数组中。两个元素(1 和 Value)包含键值,两个元素(0 和 Key)包含键名。 相关的方法: current() - 返回数组中的当前元素的值 end() - 将内部指针指向数组中的最后一个元素,并输出 next() - 将内部指针指向数组中的下一个元素,并输出 prev() - 将内部指针指向数组中的上一个元素,并输出 reset() - 将内部指针指向数组中的第一个元素,并输出
具体使用详情
可以遍历索引数组,也可以遍历关联数组。 不会进行reset()操作,即:轮循完后,指针不会归位到开头。
分支结构
if……elseif
在elseif语句中只能有一个表达式为true,即在elseif语句中只能有个语句块被执行,多个elseif从句是排斥关系。 使用elseif语句有一个基本原则,总把优先范围小的条件放在前面处理。
switch……case……
switch后面的控制表达式的数据类型只能是整形、浮点类型或者字符串。 continue作用到case时,相当于break,如果想跳出外层循环用continue2。 switch…case… 会生成跳转表,直接跳转到对应case。因此,如果条件比一个简单的比较要复杂得多或者在一个很多次的循环中,那么用swithc语句可能会更快一些。
试题解答
- 请列出3种PHP数组循环操作的语句,并注明各种循环的区别
for、foreach、while+list()+each()
for只能遍历索引数组,而其它两个,还可以遍历关联数组。
- PHP中如何优化多个if…elseif语句
可能性较大的,往前放;如果说判断内容较复杂或者是浮点,整型的话,可以考虑用switch替换。
函数
知识点
序列
range()
调试函数
xdebug_debug_zval() //显示变量调用情况 memory_get_usage() //查看内存使用情况 var_dump()
试题解答
正则表达式
知识点
例题演示
文件及目录处理
会话控制
面向对象
网络协议
环境配置
PHP 框架相关
Laravel
DI(依赖注入),是一种设计模式 IOC(控制反转),是一种设计思想
前端相关
Html,JavaScript,jQuery,AJAX
Linux 操作
MySql 数据库
算法
架构设计
高并发架构的相关概念
什么是高并发
通常指,如果一个系统的日PV在千万以上,有可能是一个高并发系统
QPS
每秒种请求或者查询的数量,在互联网领域,指每秒响应请求数(指HTTP请求);
吞吐量
单位时间内处理的请求数量(_通常由QPS与并发数决定)
响应时间
从请求发出到收到响应花费的时间。例如系统处理一个HTTP请求需要100ms,这个100ms就是系统的响应时间。
PV
综合流览量(Page View), 即页面浏览量或点击量,一个访客在24小时内访问的页面数量。 同一个人浏览你的网站同一页面,只记作一次PV(即:刷新没有用)
UV
独立访客(UniQue Visitor), 即一定时间范围内相同访客多次访问网站,只计算为1个访客
带宽
计算带宽大小需要关注两个指标,峰值流量和页面的平均大小
日网站的带宽
PV / 统计时间(换算到秒) * 平均页面大小(单位KB)* 8
峰值每秒请求数(QPS)=(总PV数80%)/(6小时秒数20%) 80%的访问量集中在20%的时间内(二八定律)
压力测试
测试能承受的最大并发 测试最大承受的QPS值
常用性能测试工具
- ab
全称是apache benchmark,是apache官方推出的工具 工作原理:创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问。它的测试目标是基于URL,因此,它既可以用来测试apache的负载压力,也可以测试nginx,lighthttp,tomcat,IIS等其它web服务器的压力。 使用: 如:模拟并发请求100次,总共请求500次
ab -c 100 -n 5000 待测试网站
注: 1.测试机器与被测试机器分开 2.不要对线上服务做压力测试 3.观察测试工具ab所在机器,以及被测试的前端机的CPU,内存,网络等不超过最高限度的75% (top命令) - ark
- http_load
- Web Bench
- Siege
- Apache JMeter
QPS达到极限怎么处理
QPS达到50
小型网站,一般的服务器都可以达到
QPS达到100
假设关系型数据库的每次请求在0.01秒完成 假设单页面只有一个SQL查询,那么100QPS 意味着1秒完成100次请求,但是此时我们并不能保证数据库查询能完成100次 方案: 数据库缓存层、数据库的负截均衡
QPS达到800
假设我们使用百兆带宽,意味着网站出口的实际带宽是8M左右 假设每个页面只有10k,在这个并发条件下,百兆带宽已经吃完 方案:CDN加速、负载均衡
QPS达到1000
假设使用Memcache缓存数据库查询数据,每个页面对Memcache的请求远大于直接对DB的请求 Memcache的悲观并发数在2w左右,但有可能在之前内网带宽已经吃光,表现出不稳定 方案:静态HTML缓存
QPS达到2000
这个级别下,文件系统访问锁都成了灾难 方案:做业务分离,分布式存储
通用解决方案
流量优化
- 盗链处理
前端优化
- 减少Http请求
合并css,js等文件
- 添加异步请求
- 启用浏览器缓存和文件压缩
- CDN加速
缓存数据到cnd,就近解决资访问问题
- 建立独立图片服务器
服务端优化
- 页面静态化
- 并发处理
多线程、多进程,异步处理、队列
数据库优化
- 数据库缓存
- 分库分表、分区操作
垂直分、水平分
- 读写分离
- 负载均衡
Web服务器优化
- 负载均徇
本文由 MeiLe 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:2017-09-30 10:06:42