php面试题

php面试题整理

1.什么是面向对象?主要特征是什么?

1
2
3
面向对象是程序的一种设计方式,提高程序重用性,使程序结构更加清晰。

主要特征:封装、继承、多态

2.SESSION和COOKIE的区别是什么,请从协议和,产生的原因和作用说明?

1
2
3
1.协议方面:http无状态协议,不能区分用户是否从同一个网站上来的,同一个用户请求不同的页面不能看作是同一个用户。

2.SESSION存储在服务端,COOKIE存储在客户端。SESSION相对于安全点,COOKIE用某些手段可以篡改。SESSION依赖于COOKIE进行传递。禁用COOKIE后SESSION不能正常使用。

3.HTTP协议中302、403、500状态码的含义?

1
2
3
4
5
6
7
一二三四五原则:
一、消息系列
二、成功系列
三、重定向系列
四、请求错误系列
五、服务器端端错误系列
302临时转移成功、403禁止访问、500服务器内部错误

4.LINUX建立压缩包,解压缩包的命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Tar.gz:
打包:tar czf file.tar.gz file.txt
解压:tar xzf file.tar.gz

Bz2:
打包:bzip 2 [-k] 文件
解压:bunzip2 [-k] 文件

Gzip:(只对文件,不保留原文件)
打包:gzip file1.txt
解压: gunzip file1.txt.gz

Zip:-r(对目录)
打包:zip file1.zip
解压:unzip file.zip

5.请写出数据类型(int char varchar datetime text)的意思;请问 varchar 和 char有什么区别?();

1
2
3
4
5
6
7
int:整形 
char:固定长度字符串
varchar:可变长度字符串
datetime:日期时间格式
text:文本型

varchar和char的区别:char是固定长度的字符串类型,分配多少空间,就会占用多少空间。Varchar是可变型字符串类型,内容有多大就占用多大空间,能有效节省空间。由于varchar类型是可变的,所以在数据长度改变时,服务器需要进行额外操作,所以效率比char类型低

6. MyISAM 和 InnoDB 的基本区别?索引结构如何实现?

1
2
3
4
5
MyISAM类型不支持事务、表锁,易产生碎片化,要经常优化,读写速度较快。InnoDB类型支持事务,行锁,有崩溃恢复能力,读写速度比MyISAM慢。

MyISAM支持表锁不支持行锁,InnoDB表锁和行锁都支持。

创建索引:alert table tablename add index ('字段名')

7.isset()和empty()的区别

1
isset()检测变量是否存在,可以传入多个变量,若其中一个不存在则返回假,empty()检测变量是否为空,只可传入一个变量,如果为空为假则返回真

8.如何在页面之间传递变量(至少两种方式)?

1
GET,POST,COOKIE,SESSION,隐藏表单

9.请写出常见的排序算法?并用PHP实现冒泡排序,将数组$array = ()按照从小到大的方式进行排序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
常见的排序算法有:冒泡排序法、快速排序法、简单选择排序法、堆排序法、直接插入排序法、希尔排序法、合并排序法
冒泡排序法的基本思想是:对排序记录关键字从后往前,进行多次扫描,当发现两个相邻的关键字不满足排序规则时,就将这两个关键字进行位置交换。这样关键字较小的记录将会逐渐从后面像前面移动。

//冒泡排序
function mp_sort($arr){
$arrayLength = count($arr);
for($i = 0; $i < $arrayLength; $i++){
for($j = $i+1 ; $j < $arrayLength; $j++){
if($arr[$j] < $arr[$i]){
$value = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $value;
}
}
}

return $arr;
}

$arr = [1 , 3 , 5 , 7 , 9 , 8 , 6];
$res = mp_sort($arr);

10.请说明PHP中引用与传值的区别?什么时候用引用什么时候用传值?

1
2
3
4
传值:函数范围内对值的任意改变都会被函数外部所忽略
引用:函数内部对值的改变在函数外部也能反映出来

按值传递,php必须进行赋值,对于特别大的字符串或者对象来说,这将会是一个代价很大的操作,按引用传递,则不需要赋值,可以节省内存开销,对于性能提高很有好处,但是每次值的改变,都会影响到原来的变量。

11.请简述一下数据库优化?

1
2
3
4
从结构层:web服务器采用负载均衡,mysql服务器采用主从复制,读写分离
从储存层:采用合适的存储引擎
从设计层:采用分区分表,索引,表的字段采用合适的属性,开启mysql缓存
sql语句层:优化查询语句

12.如何解决异常处理?

1
抛出异常,使用try...catch,异常的代码放到try代码块,如果没有出发异常,代码继续执行,如果异常被触发,就会抛出一个异常.Catch代码块捕获异常,并创建一个包含异常的对象,$->getMessage(),输出异常的错误信息。

13.怎么保证促销商品不会超卖?

1
2
3
数据库锁,高并发时会对数据库的性能影响很大;
文件锁,会导致大量的I/O操作
可以采用Redis队列实现,将要促销的商品数量以队列的方式存入redis中,每当用户抢到一件促销商品时则从队列中删除一个数据,确保商品不会超卖。操作简单,而且效率极高

14.商城秒杀的实现?

1
2
3
抢购、秒杀场景需要解决的主要问题有两个:高并发对数据库产生的压力、竞争状态下如何解决库存的正确减少
高并发方面:可以采用数据缓存来处理抢购,避免直接操作数据库
库存方面:可以采用队列方式,把要秒杀的商品存放到队列中,因为pop操作时原子性的,即使有很多用户同时到达,也是依次执行,文件锁和事务在高并发的情况下性能下降很快;

15.laravel框架有哪些特色?

1
2
3
4
5
6
7
8
laravel框架的设计思想比较先进,非常适合应用各种开发模式,Laravel框架的最大特点和优秀之处就是集合了PHP比较新的特点,以及各种各样的设计模式,loc模式,依赖注入模式等
artisan:命令行工具,很多手动的工作都自动化
可继承的模板:简化view的开发和管理
blade模板:渲染速度更快
ORM操作数据库
migrate:管理数据库和版本控制
测试功能也很强大
composer也是亮点

16.为什么使用Laravel框架,他有什么好处,为什么不用其他框架?

1
能快速开发功能,自带各种方便的服务,比如数据验证、队列、缓存、数据迁移、测试、artisan命令行等,还有强大的ORM

17.写出一个能创建多级目录的PHP函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function makeDir($dirName , $auth){
if(is_dir($dirName)){
echo '目录已经存在';
} else {
$res = make_dir($dirName , $auth , true);
if($res){
echo '创建目录成功';
} else {
echo '创建目录失败';
}
}
}

makeDir('./a/b' , 0755);

18.MySql的索引有哪些?

1
MySQL目前主要有的索引类型为:普通索引、唯一索引、主键索引、组合索引、全文索引。

19.php的八种变量类型

1
int、bool、string、array、resource、null、float、object

20.Redis支持五种数据类型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
分别是string 字符串(key=>value)、hash 哈希(key=>对象)、list 列表(队列)、set 集合()、zset有序集合

String(字符串)
string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
常用命令:set、get、decr、incr、mget等。
注意:一个键最大能存储512MB。

Hash(哈希)
Redis hash 是一个键值(key=>value)对集合;是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
每个 hash 可以存储 232 -1 键值对(40多亿)。
常用命令:hget、hset、hgetall等。
应用场景:存储一些结构化的数据,比如用户的昵称、年龄、性别、积分等,存储一个用户信息对象数据。

List(列表)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
list类型经常会被用于消息队列的服务,以完成多程序之间的消息交换。
常用命令:lpush、rpush、lpop、rpop、lrange等。
列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。

Set(集合)
Redis的Set是string类型的无序集合。和列表一样,在执行插入和删除和判断是否存在某元素时,效率是很高的。集合最大的优势在于可以进行交集并集差集操作。Set可包含的最大元素数量是4294967295。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
应用场景:
1、利用交集求共同好友。
2、利用唯一性,可以统计访问网站的所有独立IP。
3、好友推荐的时候根据tag求交集,大于某个threshold(临界值的)就可以推荐。
常用命令:sadd、spop、smembers、sunion等。
集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。

zset(sorted set:有序集合)
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
sorted set是插入有序的,即自动排序。
常用命令:zadd、zrange、zrem、zcard等。
当你需要一个有序的并且不重复的集合列表时,那么可以选择sorted set数据结构。
应用举例:
(1)例如存储全班同学的成绩,其集合value可以是同学的学号,而score就可以是成绩。
(2)排行榜应用,根据得分列出topN的用户等。

21.php中静态变量的和普通变量的区别

1
在普通变量之前加上static关键字就构成了静态变量,静态变量只会初始化一次,静态变量的声明不能用表达式,类似于static $a = 1+2这种;需要直接复制static $ = 1;作用域为局部作用域

22.为什么会产生跨域问题?

1
2
3
4
5
跨域问题来源于JavaScript的同源策略,即只有 协议+主机名+端口号(如存在)相同,则允许相互访问。也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源。跨域问题是针对JS和ajax的,html本身没有跨域问题,比如a标签、script标签、甚至form标签

1.浏览器限制
2.跨域(域名、端口不一样都是跨域问题)
3.XHR(XMLHttpRequest请求)

23.解决跨域问题方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1.允许浏览器跨域访问 

2.jsonP

3.服务端方面解决: 服务器实现需要注意两种情况,简单请求和非简单请求。简单请求是先执行请求再验证,非简单请求是先验证再请求。

简单请求(比较常见):方法为get,head,post,请求header里面没有自定义头,Content-Type的值为以下几种 text/plain,multipart/form-data,application/x-www-form-urlencoded。
非简单请求(比较常见):put,delect方法的ajax请求,发送json格式的ajax请求,带自定义头的ajax请求。
简单请求处理方案:在响应头中添加

Access-Control-Allow-Origin=“允许跨域的url”,即跨省域时,请求头Origin的值,所以一般是获取Origin的值。
Access-Control-Allow-Method=“*”,允许的方法。

非简单请求处理方案:在相应头中添加
Access-Control-Allow-Origin=“允许跨域的url”,即跨域时,可以获取请求头Origin的值。
Access-Control-Allow-Method=“*”,允许的方法
Access-Control-Request-Headers=“Content-Type,自定义的header的key”。

带cookies的跨域解决:在响应头添加
Access-Control-Allow-Credentials,="true",允许使用cookies

24.redis缓存穿透,缓存击穿,缓存雪崩原因+解决方案

1
没搞明白,可以参考一下:https://www.cnblogs.com/xichji/p/11286443.html

25.git相关的面试题

26.linux相关的面试题

1
大概就是常用的linux命令

27.系统运行出错后去哪里看日志,怎么看日志,排错思路

28.mysql慢查询应该怎么解决,怎么获取慢查询sql