经过一些面试,发现中小型企业总会先让你做一下笔试题,而每个企业笔试考察的知识点也都十分类似,无非是PHP,数据库,HTTP,linux中最简单几个知识点,外加一个简单排序之类的编程题。做完笔试题后一般面试官都会根据你笔试的内容和你简历所写的内容进行询问。以下内容都是在面试中遇到两次以上的面试题,附上自己的总结和回答,部分问题可能没有编写答案,可以自己学习。内容还在不断更新。。。
一、PHP
1.include和include_once的区别?
include、include_once、require和require_once这四个函数经常会作为php面试题的考点,以下是我对这四个函数做的总结,理解了这四个函数的作用,这题也就不难了
include:读入文件并且执行里面的程序
require:将目标文件读入,并将自身代替为读入的内容
include_once:和include几乎相同,唯一区别是读入前会先检查是否读入过,是则不会再次读入
require_once:和 require 语句完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含
include在引入不存文件时产生一个警告且脚本还会继续执行,而require则会导致一个致命性错误且脚本停止执行。
2.写出你能想到的php常用函数?
这个还是要靠平时的积累,有的会要求写十个以上,如果不是紧张到脑子空白的话应该很好写,比如最简单的substr(),count()等,也许你可以写一些高难度一点的函数,可能这是面试官想看的吧
3.session和cookie的区别?
session和cookie几乎成了必考题,有的公司会考的简单,简要说明一下两者的区别即可,有的公司则会深入考察一下两者的区别,比如:
一个登陆的网页关闭后再进去为什么需要重新登陆?
一个登陆的网页时间长了为什么需要重新登陆?
为什么cookie过期了就推出登陆了?等等
cookie以文本格式存储在浏览器上,存储量有限;而session存储在服务端,可以无限量存储多个变量并且比cookie更安全,cookie的存储限制了数据量,只允许4KB,而session是无限量的
4.nginx和apache的区别
nginx:
- 轻量级,采用 C 进行编写,同样的 web 服务,会占用更少的内存及资源
- 抗并发,nginx 以 epoll and kqueue 作为开发模型,处理请求是异步非阻塞的,负载能力比 -apache 高很多,而 apache 则是阻塞型的。在高并发下 nginx 能保持低资源低消耗高性能 ,而 apache 在 PHP 处理慢或者前端压力很大的情况下,很容易出现进程数飙升,从而拒绝服务的现象。
- nginx 处理静态文件好,静态处理性能比 apache 高三倍以上
- nginx 的设计高度模块化,编写模块相对简单
- nginx 配置简洁,正则配置让很多事情变得简单,而且改完配置能使用 -t 测试配置有没有问题,
- apache 配置复杂 ,重启的时候发现配置出错了,会很崩溃
- nginx 作为负载均衡服务器,支持 7 层负载均衡
- nginx 本身就是一个反向代理服务器,而且可以作为非常优秀的邮件代理服务器,启动特别容易, 并且几乎可以做到 7*24 不间断运行,即使运行数个月也不需要重新启动,还能够不间断服务的情况下进行软件版本的升级
- 社区活跃,各种高性能模块出品迅速
Apache:
- apache 的 rewrite 比 nginx 强大,在 rewrite 频繁的情况下,用 apache
- apache 发展到现在,模块超多,基本想到的都可以找到
- apache 更为成熟,少 bug ,nginx 的 bug 相对较多
- apache 超稳定
- apache 对 PHP 支持比较简单,nginx 需要配合其他后端用
- apache 在处理动态请求有优势,nginx 在这方面是鸡肋,一般动态请求要 apache 去做,nginx 适合静态和反向。
- apache 仍然是目前的主流,拥有丰富的特性,成熟的技术和开发社区
5.php和nginx怎么交互?
可以参考:https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/83032578
一般都会问到php-fpm,这也是nginx和php交互中不可少的
PHP-FPM(PHP FastCGI Process Manager)意:PHP FastCGI 进程管理器,用于管理PHP 进程池的软件,用于接受web服务器的请求
6.php怎么实现类的自动加载?
sql_autoload_register()可以注册任意数量的自动加载器,当使用尚未被定义的类(class)和接口(interface)时自动去加载。通过注册自动加载器,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类
尽管 autoload()函数也能自动加载类和接口,但更建议使用 spl_autoload_register()函数。 spl_autoload_register() 提供了一种更加灵活的方式来实现类的自动加载(同一个应用中,可以支持任意数量的加载器,比如第三方库中的)。因此,不再建议使用 autoload()函数,在以后的版本中它可能被弃用。
7.命名空间?
什么是命名空间?从广义上来说,命名空间是一种封装事物的方法
PHP 命名空间可以解决以下两类问题:
- 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
- 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
8.说出几个php中魔术方法?
__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() 和 __debugInfo()
9.redis数据类型?
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)
10.对一个无序数组进行从小到大排序?
掌握几个基本的排序,一般面试中经常会写
<?php
$a = array(3,8,1,4,11,7);
$len = count($a);
for ($i=1; $i<$len; $i++) {
for($j=$len-1; $j>=$i;$j--) {
if ($a[$j] < $a[$j-1]){//如果改成从大到小的话,只要将if改成if ($a[$j] > $a[$j-1])
$temp = $a[$j];
$a[$j] = $a[$j-1];
$a[$j-1] = $temp;
}
}
}
print_r($a);
11.有一个从小到大排列的整数数组A,元素个数是6万。在A中查找某个整数n,如果n存在于A中则返回它的下标,否则返回-1,你能想到几种查找办法?
测试用例:[-1, 2, 9, 100, 200]-->查找2返回1,查找3返回-1
这里可以二分查找或者直接暴力
二分可以参考:https://blog.yiqiesuifeng.cn/index.php/archives/117/
12.写一个函数提取一段url中的参数?
对url中?后面的参数部分可以直接用exlode()函数进行处理,也可以用正则处理
13.对RESTful的理解?
RESTful相关问题问的较少,当聊到接口的时候可能会问
参考:https://blog.yiqiesuifeng.cn/index.php/archives/132/
14.单引号和双引号的区别?
- 双引号内部变量会解析,单引号则不解析
- 双引号中的变量($var)和特殊字符(rn之类)会被转义,单引号中的内容不会被转义(所以效率更高)
15.传值赋值和引用赋值的区别?
传值赋值方式会改变原有变量的值
16.常用数组操作函数?
17.常用字符串操作函数?
18.说说php-fpm是什么?
19.nginx如何配置?
参考:https://blog.csdn.net/qq_37887764/article/details/81775666
20.为什么需要nginx,只有php不是也可以运行?
只安装php可以运行php代码,但是无法实现客户端和服务端的交互
21.高并发的解决方案?
- web服务器优化:负载均衡
- 流量优化:web资源防盗链处理,将恶意请求屏蔽,
- 前端优化:减少http请求、添加异步请求、启用浏览器缓存和文件压缩优化、CDN加速、建立独立的图片服务器
- 服务端优化:页面静态化、并发处理、队列处理、
- 数据库优化:数据库缓存、分库分表、分区操作、读写分离、负载均衡
22.MVC的理解?
- M->Model->业务模型:应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据。
- V->view->视图:应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。
- C->controller->控制器:应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
23.isset()和empty() 的区别?
isset():
若变量不存在则返回FALSE
若变量存在且其值为NULL
,也返回FALSE
若变量存在且值不为NULL
,则返回TURE
同时检查多个变量时,每个单项都符合上一条要求时才返回TRUE
,否则结果为FALSE
empty():
若变量不存在则返回TRUE
若变量存在且其值为""、0、"0"、NULL、、FALSE、array()、var $var; 以及没有任何属性的对象,则返回TURE
若变量存在且值不为""、0、"0"、NULL、、FALSE、array()、var $var; 以及没有任何属性的对象,则返回FALSE
23.echo,print_r,print,var_dump的区别?
- echo和print是语言结构,而并不是真正的函数, print_r和var_dump是函数,语句没有返回值,函数可以有返回值(即便没有用)
- print:只能打印出简单类型变量的值(如int,string)
- print_r():可以打印出复杂类型变量的值(如数组,对象),能打印数组,对象
- echo:输出一个或者多个字符串
- var_dump():能打印对象数组,并且带数据类型
24.PHP中布尔值为false
的情况?
JS:
- undefined(未定义,找不到值时出现)
- null(代表空值)
- false(布尔值的false,字符串"false"布尔值为true)
- 0(数字0,字符串"0"布尔值为true)
- NaN(无法计算结果时出现,表示"非数值";但是tapeof NaN==="number")
- ""(双引号)或''(单引号) (空字符串,中间有空格时也是true)
PHP:
- null(代表空值)为false
- false(布尔值的false,字符串"false"布尔值为true)
- 0(数字0,字符串"0"布尔值都为false)
- ""(双引号)或''(单引号)为false (中间有空格时是true)
25.mysql_fetch_row () 和 mysql_fetch_array () 的区别?
二、数据库
1.用sql语句建一张简单的数据表,并实现一个简单的查询?
做了好几个公司的笔试题,基本都是这种类型,用sql语句实现三四个字段的表,然后一个简单的查询。有时候可能会遇到给你两张表,让你实现一个联合查询,大多比较简单,一个join查询就就搞定了。这种题不需要特别准备,如果很久没写原生sql语句了,可以熟悉一下建表和查询的sql语法
2.MyISAM与InnoDB两者之间区别?
mysql引擎的考察,需要简单说一些两者的区别,使用场景
MyISAM:
不是事务安全的,不支持外键,如果执行大量的select,insert MyISAM比较适合。
只支持表级锁
支持全文索引
堆组织表,使用的是非聚簇索引、索引和文件分开,随机存储,只能缓存索引
InnoDB:
支持事务安全的引擎,支持外键、行锁、事务是他的最大特点。如果有大量的update和insert,建议使用InnoDB,特别是针对多个并发和QPS较高的情况。
支持行级锁
不支持全文索引
索引组织表,使用的聚簇索引、索引就是数据,顺序存储,因此能缓存索引,也能缓存数据
参考:https://blog.csdn.net/qq_27607965/article/details/79925288
3.你知道的mysql索引?
对mysql索引的考察,我能想到的是以下五种索引,平时用的最多的就是前三种索引
- 主键索引
- 普通索引
- 唯一索引
- 组合索引
- 全文索引
参考:https://blog.yiqiesuifeng.cn/index.php/archives/123/
4.什么时候场景需要建索引?
面试的时候几乎每个面试官都会问这个问题,索引也是平时经常需要用的,所以需要好好研究一下
- 较频繁地作为查询条件的字段
- 唯一性太差的字段不适合建立索引
- 更新太频繁地字段不适合创建索引
- 不会出现在where条件中的字段不该建立索引
5.怎么优化sql语句?
sql优化是很重要的一个点,面试中经常问的就是sql语句优化和建索引,上面说过了索引,接下来说一下sql语句优化
- 尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引
- 应尽量避免在where子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描
- 仅列出需要查询的字段,这对速度不会有明显影响,主要考虑节省内存。避免使用 select *
- 使用join时,应该用小结果集驱动大结果集
- 使用limit对查询进行限制,但是limit的基础比较大时使用between
- 避免使用null
- 不要使用count(id), 而应该使用count(*)
- in 和 not in 也要慎用,否则会导致全表扫描
参考:https://blog.yiqiesuifeng.cn/index.php/archives/122/
6.防止sql注入的方式?
7.Redis数据类型?
8.一般你会怎么建索引?
9.varchar(1)可以存下一个汉字吗?可以存多少个英文字母?
10.join查询实现?
11.mysql索引B+树叶子结点存储什么?
12.Redis和Memcahe区别?
三、HTTP
1.HTTP请求方式有哪些?
get、post、put、delete、head、options、trace
2.get和post的区别?
GET在浏览器回退时是无害的,而POST会再次提交请求
GET通过url传递请求资源,POST通过request body提交数据
GET长度限制,POST没有限制
对参数的数据类型,GET只接受ASCII字符,而POST没有限制
......
3.写出HTTP常见的状态码和表示的意思?
200 - 请求成功
301 - 资源(网页等)被永久转移到其它URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误
参考:https://www.runoob.com/http/http-status-codes.html
4.什么是HTTP?
超文本传输协议,基于TCP/IP通信协议来传递数据
有些大厂面试一般还会问http1.0和http1.1的区别,以及http2.0和https等考察点,都需要好好理解
四、Linux
1.写出你常用的linux指令?
一般熟悉linux的都可以写出来,面试中可能还会根据你写的进行问
2.改变文件权限操作?
chmod,chown,chgrp,以及chmod的用法
3.查看当前进程?
如:ps -A
4.查看文件最后20行内容?
如:tail -n 20 文件名
怎么查看一个文件后5行内容?
5.vi/vim中怎么直接跳转到最后几行?
6.vi/vim怎么删除指定两行内容?
7.vim查找的替换指令?
8.vim复制粘贴指令?
9.目录权限rwx对应数字之间转化关系?
10.sed命令用法?
11.查看当前端口占用情况?
还不快抢沙发