php面试技巧及常见面试题答案

来自一个北京phper菜鸡的面试心得分享,面试的高级职位,文章均为个人观点,不喜勿喷。去年、前年都有大批量面试,当然今年也有一些,小本本上记录了自己上百家公司面试情况,得出的结果是坚持才会胜利,主要介绍面试环节部分。

面试有两种情况 1.在职,2.不在职。在职的话可以挑选自己满意的公司投递简历,一般做技术的还是比较看重工作和技术氛围。不在职就需要薪资之类的范围筛选然后海投了,各个平台都有简历。拉勾、boss直聘、智联、51job、猎聘等等。个人觉得在职去面试还是相对较好的,一方面面试不需要太过紧张,另一方面是因为面试也是很累的。

下面开始正题

第一个环节:简历

简历至关重要,简历是块敲门砖,需要勾起hr和技术部门的好奇和认可。能不能约到面试就看你抛的是什么了,而且面试都是基于简历来围绕回答的,所以你需要对你的简历特别熟悉,在公司的时间段,做了哪些事。不会写的可以参考这篇知乎问答 -- 程序员简历该怎么写

第二个环节:面试

部分公司有可能会笔试,但是答与不答看你自己。有的笔试好几页,什么手写算法、方法之类的我一般都会委婉的回避,跟对方说一会还有事能不能直接跟技术聊聊,一般对方不会拒绝的。

再次声明,你需要对简历的技能点很熟,不是很熟最起码也要会用。不然最好别往上写,否则那只会坑了你自己。一般来说都是围绕着聊,可能会有一些扩展和深度提问,也有可能问一些基础问题和面试官公司所用技术点。下面会说一些常用的技术点和回答,大部分答案来自google查找。

技术点有trait yield spl composer 闭包 框架 魔术方法 函数(字符串 数组 时间 数据库)等等。

1.file_get_contents和curl区别

curl支持很多协议,有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDAP,也就是说,它能做到很多file_get_content做不到的事情。curl在php可以实现远程获取和采集内容;实现PHP网页版的FTP上传下载;实现模拟登陆;实现接口对接,数据传输;实现模拟Cookie;下载文件断点续传等等,最重要的一点是curl支持超时设置

2.PHP中传值与引用传值的区别

按值传递:函数范围内对值的任何改变在函数外部都会被忽略

按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改

优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。

3.session和cookie区别

存储位置:session存储于服务器,cookie存储于浏览器

安全性:session安全性比cookie高

session为‘会话服务’,在使用时需要开启服务,cookie不需要开启,可以直接用

4.include和require的区别

require是无条件包含,也就是如果一个流程里加入require,无论条件成立与否都会先执行require,当文件不存在或者无法打开的时候,会提示错误,并且会终止程序执行

include有返回值,而require没有(可能因为如此require的速度比include快),如果被包含的文件不存在的话,那么会提示一个错误,但是程序会继续执行下去

5.抽象类和接口区别

接口是抽象类的变体,接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类。

接口可以多继承,抽象类不行.

接口定义方法,不能实现,而抽象类可以实现部分方法。

接口中基本数据类型为static 而抽类象不是的。

6.什么是面向对象

面向对象是一种编程思想,它利于提高程序的重用性,使程序结构更加清晰。主要特征:封装、继承、多态。

7.对mvc的认识

由模型M、视图V、控制器C完成的应用程序,由模型发出要实现的功能到控制器,控制器接收组织功能传递给视图。mvc是一种软件架构,优点是:可以实现代码的重用性,避免产生代码冗余;M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式

8.大流量网站如何解决访问量问题

确认服务器硬件是否能够支持当前的流量

数据库读写分离,优化数据表

程序功能规则,禁止外部的盗链

控制大文件的下载

使用流量分析统计软件

使用不同主机分流主要流量

尽量使用静态页,缓存

9.什么是SQL注入?

SQL注入攻击是黑客对数据库进行攻击的常用手段之一。一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,注入者可以在表单中输入一段数据库查询代码并提交,程序将提交的信息拼凑生成一个完整sql语句,服务器被欺骗而执行该条恶意的SQL命令。注入者根据程序返回的结果,成功获取一些敏感数据,甚至控制整个服务器。

10.如何防止SQL注入

1.开启PHP安全模式Safe_mode=on;

2.打开magic_quotes_gpc来防止SQL注入,Magic_quotes_gpc=off;默认是关闭的,它打开后将自动把用户提交的sql语句的查询进行转换,把'转为\',这对防止sql注入有重大作用。因此开启:magic_quotes_gpc=on;

控制错误信息,关闭sql错误提示信息,将错误信息写到系统日志。

3.使用mysqli或pdo预处理。

11.数据库的常用存储引擎以及它们的区别

MyISAM:不支持事务,表锁,易产生碎片,要经常优化,读写速度较快,支持全文索引。

InnoDB:支持事务,行锁,有崩溃恢复能力。读写速度比MyISAM慢,5.6之后支持全文索引。

存储引擎是基于表的,而不是数据库

12.数据库优化

选取最适用的字段属性,尽可能减少定义字段宽度,尽量把字段设置NOTNULL,例如'省份'、'性别'最好适用ENUM

使用连接(JOIN)来代替子查询

适用联合(UNION)来代替手动创建的临时表

事务处理

锁定表、优化事务处理

适用外键,优化锁定表

建立索引

优化查询语句

13.Mysql的读写分离如何实现

读写分离的实现原理就是在执行SQL语句的时候,判断到底是读操作还是写操作,把读的操作转向到读服务器上(从服务器,一般是多台),写的操作转到写的服务器上(主服务器,一般是一台,视数据量来看)。当然为了保证多台数据库数据的一致性,需要主从复制。

14.常见的HTTP状态码

200 - 请求成功

301 - 重定向到其他URL

404 - 请求的资源(网页等)不存在

505 - 内部服务器错误

15.什么是静态化和伪静态

1、 静态化指的是页面静态化,也即生成实实在在的静态文件,也即不需要查询数据库就可以直接从文件中获取数据,指的是真静态。

实现方式主要有两种:一种是我们在添加信息入库的时候就生成的静态文件,也称为模板替换技术。另一种是用户在访问我们的页面时先判断是否有对应的缓存文件存在,如果存在就读缓存,不存在就读数据库,同时生成缓存文件。

2、伪静态不是真正意义上的静态化,之所以使用伪静态,主要是为了SEO推广,搜索引擎对动态的文件获取难度大,不利于网站的推广。实习原理是基于Apache或Nginx的rewrite机智

主要有两种方式:一种是直接在配置虚拟机的位置配置伪静态,这个每次修改完成后需要重启web服务器。另一种采用分布式的,可以在网站的根目录上创建.htaccess的文件,在里面配置相应的重写规则来实现伪静态,这种每次重写时不需要重启web服务器,且结构上比较清晰。

16.redis和memache的区别

总结一:

1.数据类型

Redis数据类型丰富,支持set list等类型

memcache支持简单k/v数据类型,需要客户端自己处理复杂对象

2.持久性

redis支持数据落地持久化存储

memcache不支持数据持久存储

3.分布式存储

redis支持master-slave复制模式

memcache可以使用一致性hash做分布式

value大小不同

memcache是一个内存缓存,key的长度小于250字符,单个item存储要小于1M,不适合虚拟机使用

4.数据一致性不同

redis使用的是单线程模型,保证了数据按顺序提交。

memcache需要使用cas保证数据一致性。CAS(Check and Set)是一个确保并发一致性的机制,属于“乐观锁”范畴;原理很简单:拿版本号,操作,对比版本号,如果一致就操作,不一致就放弃任何操作

5.cpu利用

redis单线程模型只能使用一个cpu,可以开启多个redis进程

总结二:

1.Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcached相比一个最大的区别。

2.Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。

3.Redis支持数据的备份,即master-slave模式的数据备份。

4.Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

我个人认为最本质的不同是Redis在很多方面具备数据库的特征,或者说就是一个数据库系统,而Memcached只是简单的K/V缓存

总结三:

redis和memecache的不同在于:

1、存储方式:

memecache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小

redis有部份存在硬盘上,这样能保证数据的持久性。

2、数据支持类型:

redis在数据支持上要比memecache多的多。

3、使用底层模型不同:

新版本的redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

4、运行环境不同:

redis目前官方只支持Linux 上去行,从而省去了对于其它系统的支持,这样的话可以更好的把精力用于本系统 环境上的优化,虽然后来微软有一个小组为其写了补丁。但是没有放到主干上

memcache只能当做缓存,cache

redis的内容是可以落地的,就是说跟MongoDB有些类似,然后redis也可以作为缓存,并且可以设置master-slave

php概率算法

function get_rand($proArr) {

    $result = '';

    //概率数组的总概率精度

    $proSum = array_sum($proArr);

    //概率数组循环

    foreach ($proArr as $key => $proCur) {

        $randNum = mt_rand(1, $proSum);

        if ($randNum <= $proCur) {

            $result = $key;

            break;

        } else {

            $proSum -= $proCur;

        }

    }

    unset ($proArr);

    return $result;

}

$prize_arr =array('a'=>20, 'c'=>80);

二分查找

function binary(&$arr,$low,$top,$target){

    while($low <= $top){

//由于php取商是有小数的,所以向下取整,不过也可不加,数组也会取整

        $mid = floor(($low+$top)/2);

        if($arr[$mid]==$target){

            return $mid;

        }elseif($arr[$mid]<$target){

            $low = $mid+1;               

        }else{

            $top = $mid-1;

        }

    }

    return -1;

}

$arr = array(1,3,9,23,54);

echo binary($arr, 0, sizeof($arr), 1);

冒泡排序

function fun($arr){

$len = count($arr);

for($i=1;$i<$len;$i++){

for($j=0;$j<($len-$i);$j++){

if($arr[$j] > $arr[$j+1]){

$tmp = $arr[$j];

$arr[$j] = $arr[$j+1];

$arr[$j+1] = $tmp;

}

}

}

return $arr;

}

遍历文件夹下所有文件

function my_scandir($dir)

{

$files = array();

if($handle = opendir($dir)) {

while (($file = readdir($handle))!== false) {

if($file != '..' && $file != '.') {

if(is_dir($dir."/".$file)) {

$files[$file]=my_scandir($dir."/".$file);

} else {

$files[] = $file;

}

}

}

closedir($handle);

return $files;

}

}

关于面试先写到这吧,还有很多运气和实力在里面呢,希望大家都能找到心仪的工作。后续也会写一些类似的文章,喜欢的点个赞,支持一下。在这里拜谢了

你可能感兴趣的:(php面试技巧及常见面试题答案)