2019(初级)PHP最全常见面试题集合(附答案)! - Go语言中文社区

2019(初级)PHP最全常见面试题集合(附答案)!


以下所有几乎必问,每个公司侧重点不同,面试前先大概了解公司业务或者岗位需求。

PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。

1、常见状态码

1xx (临时响应)表示临时响应并需要请求者继续执行操作的状态代码。

100 (继续) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。
101 (切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。
102 由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。

2xx (成功)表示成功处理了请求的状态代码。

200 (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。
201 (已创建) 请求成功并且服务器创建了新的资源。
202 (已接受) 服务器已接受请求,但尚未处理。
203 (非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。
204 (无内容) 服务器成功处理了请求,但没有返回任何内容。
205 (重置内容) 服务器成功处理了请求,但没有返回任何内容。
206 (部分内容) 服务器成功处理了部分 GET 请求。
207 由WebDAV(RFC 2518)扩展的状态码,代表之后的消息体将是一个XML消息,并且可能依照之前子请求数量的不同,包含一系列独立的响应代码。

3xx (重定向) 表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。

300 (多种选择) 针对请求,服务器可执行多种操作。 服务器可根据请求者 (useragent)选择一项操作,或提供操作列表供请求者选择。
301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或HEAD请求的响应)时,会自动将请求者转到新位置。
302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
303 (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
305 (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。
307 (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

4xx (请求错误) 这些状态代码表示请求可能出错,妨碍了服务器的处理。

400 (错误请求) 服务器不理解请求的语法。
401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
402 该状态码是为了将来可能的需求而预留的。
403 (禁止) 服务器拒绝请求。
404 (未找到) 服务器找不到请求的网页。
405 (方法禁用) 禁用请求中指定的方法。
406 (不接受) 无法使用请求的内容特性响应请求的网页。
407 (需要代理授权) 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。
408 (请求超时)服务器等候请求时发生超时。
409 (冲突) 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。
410 (已删除) 如果请求的资源已永久删除,服务器就会返回此响应。
411 (需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。
412 (未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。
413 (请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
414 (请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。这比较少见,通常的情况包括:本应使用POST方法的表单提交变成了GET方法,导致查询字符串(Query String)过长。
415 (不支持的媒体类型) 请求的格式不受请求页面的支持。
416 (请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码。
417 (未满足期望值) 服务器未满足”期望”请求标头字段的要求。

5xx (服务器错误)这些状态代码表示服务器在尝试处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。

500 (服务器内部错误) 服务器遇到错误,无法完成请求。
501 (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。
502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。
503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。
504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505 (HTTP 版本不受支持)服务器不支持请求中所用的 HTTP 协议版本。

600 源站没有返回响应头部,只返回实体内容

延伸:OSI七层模型,物理层,数据链路层,网络层(IP),传输层(TCP),会话层,表示层,应用层(HTTP、FTP、TFTP、SMTP)
说明: 以上状态码不会都问,记住你所常见的,有时间尽量都记住。

2、get和post区别

1、get,url参数可见,post,url参数不可见。
2、get通过url拼接传递参数,post通过请求body体传递。
3、get请求是可以缓存的,post请求不可以缓存。
4、get请求页面后退不产生影响,post请求页面后退会重新提交。
5、get一般传输数据大小不超过2K~4K,post请求传输数据的大小根据php.ini 配置文件设定。
6、get请求将header和data一起发送,服务器响应200则返回数据。post请求浏览器先发送header,服务器响应100,浏览器再发送data,服务器响应200则返回数据。

3、cookie和session的区别

1、cookie存储在客户端,不会浪费服务器资源,不建议将敏感重要信息保存在cookie,而且用户可以禁止cookie。
2、session存储在服务器上,信息比较安全,但比较占用服务器资源,session是基于cookie的,sessionID存储在cookie中。
3、如果客户端cookie被禁用掉可以将sessionID添加到url链接中进行传递。

4、reqiure的include的作用及区别?

两者都用于包含文件,require如果包含文件出错会报致命错误并且停止运行,而include会报Notice错误,程序继续运行。require_once会检查是否重复包含,如果已经包含则不再执行,include同理。

5、PHP中常量定义的方式有哪些?有什么区别?

const和define()。const更快,是语言结构,define是函数。define不能用于类常量定义,const可以。

6、客户端IP地址和服务器端IP地址。

 $_SERVER['REMOTE_ADDR']
 $_SERVER['SERVER_ADDR']

7、print()、echo、print_r()、var_dump()等区别。

print()、echo 都是语言结构,不同的是前者打印只能接受一个变量,后者可以输出多个。

print_r()和var_dump()都是函数。
前者格式化打印变量。但print_r()输出布尔值和NULL的结果没有意义,打印true返回1,null则不显示。
后者也是格式化打印变量。但会详细的打印出变量的类型,长度,数值,如果包含多层将递归打印。更适合调试。

8、常用字符串函数。

serialize()、unserialize()	序列化是将变量转换为可保存或传输的字符串的过程。
strlen()	返回字符串长度。
strrev()	反转字符串。
strpos(原字符串,待查找字符串)	存在返回第一个字符下标,不存在返回false。
strstr(原字符串,待查找字符串)	返回待查找字符串及其后剩余部分,不存在返回false。
str_replace("world", "Kitty", "Hello world!")	 将某个字符串替换为另一个字符串。
explode(" ",原字符串)	将原字符串按分割字符串转成数组。
implode(" ",原数组)		将原数组中的元素连接分割字符组合成字符串。
trim()		移除字符串两侧的空白字符和其他字符。ltrim()移除左边、rtrim()移除右边。
substr("Hello world",6)	返回字符串的一部分。
substr_replace(string,replacement,start,length)	函数把字符串的一部分替换为另一个字符串。
htmlspecialchars()	把一些预定义的字符转换为 HTML 实体。
str_repeat("Shanghai",5)	字符串重复指定次数。
str_split("Shanghai",3)		将字符串分割成数组,可以指定每个数组元素长度。

9、常用数组函数

array_keys()	返回数组中所有的键名。
array_values()	返回数组中所有的值。
array_shift()	删除数组中首个元素,并返回被删除元素的值。
array_unshift()	在数组开头插入一个或多个元素,并返回数组元素个数。
array_diff()	比较数组,返回差集(只比较键值)。
array_intersect()	比较数组,返回交集(只比较键值)。
array_diff_assoc()	比较数组,返回差集(比较键名和键值)。
array_merge()	把一个或多个数组合并为一个数组。
array_pop()	删除数组的最后一个元素(出栈)。
array_push()	将一个或多个元素插入数组的末尾(入栈)。
sort()	对数组进行升序排序。
rsort()	对数组进行降序(逆向)排序。
asort()	对关联数组按照键值进行升序排序。
ksort()	对数组按照键名进行升序排序。
array_rand()	返回数组中一个或多个随机的键。
array_combine()	通过合并两个数组来创建一个新数组。
array_unique()	删除数组中的重复值。

10、常用文件操作函数。

fopen()	打开一个文件或 URL。
fread()	读取打开的文件。
fwrite()	写入文件。
fclose()	关闭打开的文件。
file_get_contents()	将文件读入字符串。
file_put_contents()	将字符串写入文件。file_put_contents("test.txt","test!",FILE_APPEND);
filesize()	返回文件大小。
filetype()	返回文件类型。
file_exists()	检查文件或目录是否存在。

真题:打开文件,将文件内容读取出来,在开头加入Hello World,将拼接好的字符串写回到文件当中

$file = './hello.txt';
$handle = fopen($file,'r');
$content = fread($handle,filesize($file));
$content = 'Hello World'.$content;
fclose($handle);
$handle = fopen($file,'w');
fwrite($handle,$content);
fclose($handle);

真题:PHP遍历文件夹

$dir = './test';
function loopDir($dir)
{
    $handle = opendir($dir);
    //目录/文件/子目录/子文件名称为0或者空这种情况不全等于false不跳出循环,目录里指针全读取完则为false,跳出循环
    while(false!==($file = readdir($handle)))
    {
        //$file只显示名称,并不显示完整路径
        if($file != '.' && $file != '..')
        {
            echo $file."n";
            if(filetype($dir.'/'.$file) == 'dir')
            {
                loopDir($dir.'/'.$file);
            }
        }
    }
}
loopDir($dir);

11、PHP垃圾回收机制

php中的变量存储在变量容器zval中,zval中除了存储变量类型和值外,还有is_ref和refcount字段。refcount表示指向变量的元素个数,is_ref表示变量表示是否是引用变量。如果refcount为0时,就回收该变量容器。

12、PHP常见的设计模式

工厂模式、单例模式、注册模式、适配器模式、观察者模式、策略模式、原型模式、装饰器模式

工厂模式:用工厂方法代替new操作的一种模式,如果需要更改所实例化的类名,只需在工厂方法内修改,不需逐一寻找代码中具体实例化的地方。
单例模式:防止重复实例化,避免大量的new操作,减少消耗系统和内存的资源,使得有且仅有一个实例对象。
参考链接:
https://www.cnblogs.com/legendheng/p/9082266.html
https://blog.csdn.net/Merlin_feng/article/details/42390737
https://blog.csdn.net/flitrue/article/details/52614599

13、栈和堆、栈和队列的区别?

栈是编译期间就分配好的内存空间, 存取数据较快,代码中必须就栈的大小有明确的定义,缺乏灵活性。
堆是程序运行期间动态分配的内存空间,可以根据程序的运行情况确定要分配的堆内存的大小。

队列先进先出,栈先进后出。
栈是只能在表的一端进行插入和删除操作的线性表。 队列是只能在表的一端进行插入和在另一端进行删除操作的线性表。

14、数据库事物及其特性?

事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。

事务特性:

(1)原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。

(2)一致性。事务的执行使得数据库从一种正确状态转换成另一种正确状态

(3)隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务,

(4) 持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。

15、数据库三范式

第一范式(1NF)无重复的列(原子性)
第二范式(2NF)属性完全依赖于主键
第三范式(3NF)属性不依赖于其它非主属性

参考链接:
https://blog.csdn.net/zhan_zehong/article/details/21411883

16、数据库索引作用、类型及其区别?

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

索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。
普通索引:最基本的索引,没有任何约束限制。
唯一索引:与普通索引类似,但是具有唯一性约束。
主键索引:特殊的唯一索引,不允许有空值。
组合索引:将多个列组合在一起创建索引,可以覆盖多个列。
外键 全文基本不用,一般用业务逻辑实现。
外键索引:只有 InnoDB类型的表才可以使用外键索引,保证数据的一致性、完整性和实现级联操作。
全文索引: MySQLI自带的全文索引只能用于 MyISAM,并且只能对英文进行全文检索。

真题: 2019新浪PHP实习生原题
慕课网360大牛PHP面试视频关注公众号【蛋叔】回复“PHP面试”
复合索引前缀原则(向左原则)考点

KEY(a, b, c)
WHERE a land b=2 and c= 3
WHERE a =1 and b =2
WHERE a =1
WhERE b=2 and c= 3(不生效)
WHERE a =1 and c=3(不生效)

17、表存储引擎 InnoDB和MyISAM的区别

InnoDB支持行锁,MyISAM支持表锁
InnoDB支持事务处理,MyISAM不支持
InnoDB默认使用共享表空间,MyISAM不使用
InnoDB数据存储在共享表空间,MyISAM存储在后缀为MYD和MY
InnoDB支持外键、崩溃后的安全恢复,MyISAM不支持崩溃后的安全恢复

18、数据库中join和left join的区别

left join 左连接 意思是包含左边表所有记录,右边所有的匹配的记录,如果没有则用空补齐
JOIN: 如果表中有至少一个匹配,则返回行
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行

19、SQL查询的安全方案

1使用预处理语句防SQL注入
delete from user where id= 1 or 1=1
delete from user where id=?
2写入数据库的数据要进行特殊字符的转义
3查询错误信息不要返回给用户,将错误记录到日志

//MySQL的其他安全设置
//1.定期做数据备份
//2.不给查询用户root权限,合理分配权限
//3.关闭远程访问数据库权限
//4.修改root口令,不用默认口令,使用较复杂的口令
//5.删除多余的用户
//6.改变root用户的名称
//7.限制一般用户浏览其他库
//8.限制用户对数据文件的访问权限

20、定位SQL慢查询

//分析SQL查询慢的方法
//记录慢查询日志,分析查询日志,不要直接打开慢查询日志进行分析,这样比较浪费时间和精力,
//可以使用 pt-query-digest工具进行分析

//使用 show profile
//set profiling=1;开启,服务器上执行的所有语句会检测消耗的时间,存到临时表中
//show profiles
//show profile for query临时表ID

//使用 show status
//show status会返回一些计数器, show global status查看服务器
//级别的所有计数
//有时根据这些计数,可以猜测出哪些操作代价较高或者消耗时间多

//使用 show processlist
//观察是否有大量线程处于不正常的状态或者特征

//使用 explain(desc) 分析单条SQL语句

21、SQL优化

a. 设计良好的数据库结构,允许部分数据冗余,尽量避免join查询,提高效率。

b. 选择合适的表字段数据类型和存储引擎,适当的添加索引。

c. mysql库主从读写分离。

d. 找规律分表,减少单表中的数据量提高查询速度。

e。添加缓存机制,比如memcached,apc等。

f. 不经常改动的页面,生成静态页面。

g. 书写高效率的SQL。比如 SELECT * FROM TABEL 改为 SELECT field_1, field_2, field_3 FROM TABLE.

22、PDO连接MySQL实例

<?php
$dbms='mysql';     //数据库类型
$host='localhost'; //数据库主机名
$dbName='test';    //使用的数据库
$user='root';      //数据库连接用户名
$pass='';          //对应的密码
$dsn="$dbms:host=$host;dbname=$dbName";


try {
    $dbh = new PDO($dsn, $user, $pass); //初始化一个PDO对象
    echo "连接成功<br/>";
    /*你还可以进行一次搜索操作
    foreach ($dbh->query('SELECT * from FOO') as $row) {
        print_r($row); //你可以用 echo($GLOBAL); 来看到这些值
    }
    */
    $dbh = null;
} catch (PDOException $e) {
    die ("Error!: " . $e->getMessage() . "<br/>");
}
//默认这个不是长连接,如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true) 变成这样:
$db = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));

?>

23、数据结构和数据类型

数组,最简单而且应用最广泛的数据结构之一特性:使用连续的内存来存储、数组中的所有元素必须是相同的类型或类型的衍生(同质数据结构)、元素可以通过下标直接访问
链表,线性表的一种,最基本、最简单,也是最常用的数据结构特性:元素之间的关系是一对一的关系(除了第一个和最后一个元素,其他元素都是首尾相接)、顺序存储结构和链式存储结构两种存储方式。
栈,和队列相似,一个带有数据存储特性的数据结构特性:存储数据是先进后出的、栈只有一个出口,只能从栈顶部增加和移除元素
堆,一般情况下,堆叫二叉堆,近似完全二叉树的数据结构特性:子节点的键值或者索引总是小于它的父节点、每个节点的左右子树又是一个二叉堆、根节点最大的堆叫最大堆或者大根堆、最小的叫最小堆或者小根
线性表,由零个或多个数据元素组成的有限序列特性:线性表是一个序列、0个元素构成的线性表是空表、第一个元素无先驱、最后一个元素无后继、其他元素都只有一个先驱和后继、有长度,长度是元素个数,长度有限
双向链表
特性:每个元素都是一个对象,每个对象有一个关键字key和两个指针(next和prev)
队列
特性:先进先出(FIFO)、并发中使用、可以安全将对象从一个任务传给另一个任务
字典特性:关联数组、也被叫做字典或者键值对
图特性:通常使用邻接矩阵和邻接表表示、前者易实现但是对于稀疏
矩阵会浪费较多空间、后者使用链表的方式存储信息但是对于图搜
索时间复杂度较高

三大数据类型(标量(浮点、整型、字符串、布尔)、复合(数组、对象)、特殊(resource、null))
算法特性:有穷性,确定性、可行性、输入、输出

24、MVC

MVC是一种架构模式,M(model)、V(view)、C(controller),model是模型层处理数据,view是视图层展示交互界面,controller是控制器层处理业务逻辑。

用户在视图层提交数据到控制器层,控制器层调用模型层的方法进行数据处理然后根据返回结果再进行不同的业务处理最后返回到视图层。

25、AOP思想

AOP面试切面编程,提取各个模块中可能重复操作的部分,权限认证,异常处理,日志记录等。

26、RESTful

restful api是rest在web接口的应用和延伸。轻量级、通常用json描述数据。请求是无状态的,一个请求不需要依赖于另一个请求。统一的错误返回处理。

所有的接口都是基于资源的,增删改查都只是对资源状态的改变。
get:查询
post:创建
put:更新
delete:删除
url只表示资源路径
GET:/movie/:mid

27、数据结构和算法

常见的排序算法和查找算法以及相应的时间复杂度和空间复杂度要掌握,冒泡排序、快速排序、选择排序、二分查找等要能手写出来,还有一点常问的就是让你写某个算法并且改进该算法以及改进前后相应的时间复杂度。

这里我就不贴了,网上随手一搜太多了

28、项目

以上都是对你相应技术栈的能力考查,面试另外一个重点就是问你的项目。

简历上最好写两到三个项目,一个主项目,你最熟悉的,面试官可能会基于你的项目问你一些问题,也可能会让你自己阐述你的主要项目,在这个过程中一定要提前想好你主项目中的亮点,难点,这个是对于项目这一块最重要的。

29、其他建议

1、面试状态要调整好,当你看到这篇文章的时候应该是处于正在找工作或者将要找工作的状态,你很可能会收到多次的邀约,会有各种各样的事情,但无论怎样,请一定要以一个比较好的状态参加面试。
2、如果是电话面试,HR问你时间最好不要立马就同意面试,如果可以的话约在次日或者其他时间,以便你做好各方面准备。
3、每一次面试都要总结得失。
4、学会写博客,技术/生活都可以,它会记录下很多有意义的时刻。
5、待更新。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_32958797/article/details/88323456
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢