首页 > php技术 > php基础知识> 详细内容
PHP面试基础知识
日期:2019-01-02 
1.COW机制

Copy On Write 写时复制。变量在写入时才真正复制一份内存进行修改。

具体参考:写时复制COW机制

2. PHP字符串的4种表达方式

单引号(效率最高)
双引号
heredoc(类似双引号)
nowdoc(类似单引号)
具体参考:PHP字符串的4种表达方式

3. 不要用等号去比较浮点数

因为计算机在计算浮点数时,会将浮点数转换为二进制数,难免会造成精度丢失。

4.  FALSE的七种情况

0,0.0,false,'','0',[],null

整型0,浮点0.0,布尔false,空字符串,0字符串,空数组,NULL

5. NULL的三种情况

直接赋值为NULL、未定义的变量、unset销毁的变量

6. 运算符

PHP 支持一个错误控制运算符:@。当将其放置在一个 PHP 表达式之前,该表达式可能产生的任何错误信息都被忽略掉。
运算符优先级:递增/递减 > ! > 算术运算符 > 大小比较 > (不)相等比较 > 引用 > 位运算符( ^ ) > 位运算符( | ) > 逻辑与 > 逻辑或 > 三目 > 赋值 > and > xor > or
括号可以增加代码可读性
递增/递减运算符不影响布尔值
递增NULL值为1,递减NULL值没有效果
逻辑运算符短路效应:&& 或 || ,当左边部分符合条件是,右边部分将不会执行
7. PHP遍历数组的三种方式

使用for循环:只能遍历索引数组
使用foreach循环:可以遍历索引和关联数组,会reset()
使用while、list()、each()组合循环:可以遍历索引和关联数组,不会reset()
8. include和require区别

无论require位置如何,指定文件都将包含到出现require的脚本中。例如,即时require放在计算为假的if语句中,依然会包含指定文件
加载过程中,如果未找到文件则include会发出一条警告,而require会发出一个致命错误
require(include)/require_once(include_once)唯一区别是后者PHP会检查该文件是否已被包含过,如果是则不会再次包含
9. 字符串函数 

具体参考:字符串函数

10. 数组函数

具体参考:数组函数

11. 可变函数

如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。

function foo() {
    echo "In foo()<br />\n";
}
$a = 'foo';
$a();  // 等于foo()
12. 正则表达式

作用:分割、查找、匹配、替换字符串
preg_match($pattern, $subject, $match):执行匹配正则表达式,匹配一次,返回pattern的匹配次数
preg_match_all($pattern, $subject, $match):执行一个全局正则表达式匹配,全局匹配,返回全局匹配的次数
preg_replace($pattern, $replacement, $subject):执行一个正则表达式的搜索和替换,返回全部结果
preg_filter($pattern, $replacement, $subject):执行一个正则表达式的搜索和替换,仅仅返回(可能经过转化)与目标匹配的结果
preg_grep($pattern, $subject):返回给定数组$subject中与$pattern相匹配的元素组成的数组
preg_split($pattern, $subject):类似explode()函数,通过一个正则表达式分隔字符串
preg_quote($str):转义正则表达式字符
13.会话控制

为什么要使用会话控制技术?因为HTTP协议是无状态的,为了保存用户信息,所以使用会话控制技术。
Cookie:存储在客户端,不占用服务器资源,但是不安全
Session:存储在服务端,占用服务器资源,比较安全
Session是基于Cookie的,用户禁用Cookie也可以使用Session,可以用session_name()、session_id()函数或SID常量传递SessionID (SID在用户开启Cookie时为空,关闭时有值)
<a href="1.php?<?php echo session_name() .'=' .session_id();  ?>">...</a>
<a href="1.php?<?php echo SID; ?>">...</a>
14.文件函数

具体参考:文件函数

15.HTTP协议

特点

HTTP协议是无状态、无连接的;基于B/S模式;通信开销小、简单快速、传输成本低;使用灵活、可使用超文本传输协议;节省传输时间。

工作原理

客户端发送请求给服务器,创建一个TCP连接,指定端口号,默认为80,连接到服务器,服务器监听浏览器请求,一旦监听到客户端请求,分析请求类型后,服务器会向客户端返回状态信息和数据内容。

HTTP请求方法

GET      请求指定的页面信息,并返回实体主体
HEAD     类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST    向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT      从客户端向服务器传送的数据取代指定的文档的内容。
DELETE    请求服务器删除指定的页面
CONNECT   HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
OPTIONS   允许客户端查看服务器的性能
TRACE     回显服务器收到的请求,主要用于测试或诊断。
HTTP状态码

1**     信息,服务器收到请求,需要请求者继续执行操作
2**    成功,操作被成功接收并处理
3**    重定向,需要进一步的操作以完成请求
4**    客户端错误,请求包含语法错误或无法完成请求
5**    服务器错误,服务器在处理请求的过程中发生了错误
常见HTTP状态码

200    请求成功
301    资源(网页等)被永久转移到其它URL
404    请求的资源(网页等)不存在
500    内部服务器错误
16.OSI七层模型

物理层
数据链路层
网络层
传输层:协议有TCP、UDP 数据包一旦离开网卡即进入网络传输层
会话层
表示层
应用层:协议有HTTP、HTTPS、FTP、SMTP、DNS、DHCP
17.Mysql整数类型

TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT

属性:UNSIGNED

长度:可以为整数类型指定宽度,对大多数应用是没有意义的,它不会限制值的合法范围,只会影响显示字符的个数。例如:INT(3):指定该字段为3位,如果不足,则可以为0填充。e.g:001

18.Mysql索引

索引的影响

大大减少服务器需要扫描的数据量
帮助服务器避免排序和临时表
将随机I/O变顺序I/O
大大提高查询速度,降低写的速度,占用磁盘
索引的使用场景

对于非常小的表,大部分情况下全表扫描效率更高
中到大型表,索引有效
特大型的表,建立和使用索引的代价将随之增长,可以使用分区技术来解决
索引的类型

普通索引:最基本的索引,没有任何约束限制
唯一索引:与普通索引类似,但是具有唯一性约束
主键索引:特殊的唯一索引,不允许有空值
组合索引:将多个列组合在一起创建索引,可以覆盖多个列
外键索引:只有InnoDB类型的表才可以使用外键索引,保证数据的一致性,完整性和实现级联操作
全文检索:Mysql自带的全文索引只能用去MyISAM,并且只能对英文进行全文检索
注意

复合索引遵循前缀原则
like查询,%不能在前,否则索引失效,可以使用全文索引解决
如果or前的条件中的列有索引,后面的没有,则索引不会被用到
列类型是字符串,查询时一定要给值加引号,否则索引失效
19.关联查询

六种关联查询

交叉连接(CROSS JOIN)
SELECT * FROM A,B(,C)
SELECT * FROM A CROSS JOIN B (CROSS JOIN C)
内连接(INNER JOIN)
SELECT * FROM A,B WHERE A.id=B.id
SELECT * FROM A INNER JOIN B ON A.id=B.id
外连接(LEFT JOIN/RIGHT JOIN)
联合查询(UNION与UNINO ALL)
全连接(FULL JOIN):Mysql不支持全连接,可以使用LEFT JOIN 和 RIGHT JOIN 联合使用
SELECT * FROM A LEFT JOIN B ON A.id=B.id UNION SELECT * FROM A RIGHT JOIN B ON A。id=B.id
20.Mysql查询优化

查找分析查询速度慢的原因

记录慢查询日志,可以使用pt-query-digest工具分析
使用show profile。set profile=1;开启,服务器上执行的所有语句会检测消耗的时间,存到临时表中
show status:返回一些计数器,show global status查看服务器级别的所有计数
show processlist:观察是否有大量线程处于不正常的状态或特征
explain:分析单条SQL语句
21.Mysql分表和分区

分区

适用场景

表非常大,无法全部存在内存,或者只在表的最后有热点数据,其他都是历史数据
分区表的数据更易维护,可以对独立的分区进行独立的操作
分区表的数据可以分布在不同的机器上,从而高效使用资源
可以备份和恢复独立的分区
缺点

一个表最多只有1024个分区
分区字段中如果有主键和唯一索引列,那么主键列和唯一列都必须包含进来
分区表无法使用外键约束
所有分区必须使用相同的存储引擎
分表:垂直分表/水平分表

22.高并发和大流量解决方案

相关概念

高并发:通常一个系统的日PV在千万以上,有可能是一个高并发的系统
PV:Page View 综合浏览量,即页面浏览量或点击量。同一个人浏览网站同一个页面,只记作一次PV
UV:独立访客(Unique Visitor),即一定时间范围呢相同的访客多次访问网站,只计算一个独立访客
QPS:每秒钟请求的查询数量,在互联网领域,指每秒响应请求数(HTTP请求)
吞吐量:单位时间内处理的请求数量(通常由QPS与并发数决定)
响应时间:从请求发出到收到相应花费的时间。例如系统处理一个HTTP请求需要100ms,100ms就是响应时间
日网站带宽=PV / 统计时间(s)*平均页面大小(KB)*8
峰值每秒请求数(QPS)=(总PV数*80%)/(6小时秒数*20%) 80%的访问量集中在20%的时间
压力测试:测试能承受的最大并发,QPS值    使用ab等压力工具
解决方案

流量优化:防盗链处理
前端优化:减少HTTP请求、添加异步请求、启用浏览器缓存和文件压缩、CDN加速、建立独立图片服务器
服务端优化:页面静态化、并发处理
数据库优化:数据库缓存、分库分表、分区、读写分离、负载均衡
web服务器优化:负载均衡