2021年最新PHP 面试、笔试题汇总(一)

2021年11月23日 阅读数:2
这篇文章主要向大家介绍2021年最新PHP 面试、笔试题汇总(一),主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

 

读在前面:php

面向对象编程和面向对象设计的五个基本原则「SOLID」html

  • 单一职责原则(Single Responsibility Principle)前端

  • 开放封闭原则(Open Closed Principle)程序员

  • 里氏替换原则(Liskov Substitution Principle)面试

  • 接口隔离原则(Interface Segregation Principle)redis

  • 依赖反转原则(Dependency Inversion Principle)算法

1.单一职责原则规定一个类有且仅有一个理由使其改变。换句话说,一个类的边界和职责应当是十分狭窄且集中的。我很喜欢的一句话"在类的职责问题上,无知是福"。一个类应当作它该作的事,而且不该当被它的任何依赖的变化所影响。数据库

2.开放封闭原则,又称开闭原则,规定代码对扩展是开放的,对修改是封闭的。编程

3.里氏替换原则规定对象能够被其子类的实例所替换,而且不会影响到程序的正确性。后端

4.接口隔离原则规定,不该该强制接口的实现依赖于它不使用的方法。

5.依赖反转原则,它规定高层次的代码不该该依赖低层级的代码。换句话说,高层次的代码应该依赖抽象接口,抽象接口就像是「中间人」同样,负责链接着高层次和低层次代码。这个原则的另外一层意思是,抽象接口不该该依赖具体实现,但具体实现应该依赖抽象接口

 

1、秒杀(商品超卖,高并发,同一用户屡次抢购)

后端:redis+队列

redis队列实现,三个队列(库存队列,排队队列,抢购结果队列)

用户先进入排队队列,先进先出,判断是否已经在抢购结果队列,若是在,则直接下一个,若是不在,将用户信息加入抢购结果队列,库存-1,等待数据库空闲时,将抢购结果写入数据库

前端:

面对高并发的抢购活动,前端经常使用的三板斧是【扩容】【静态化】【限流】

扩容:加机器,这是最简单的方法,经过增长前端池的总体承载量来抗峰值。

静态化:将活动页面上的全部能够静态的元素所有静态化,并尽可能减小动态元素。经过CDN来抗峰值。

限流:通常都会采用IP级别的限流,即针对某一个IP,限制单位时间内发起请求数量。或者活动入口的时候增长游戏或者问题环节进行消峰操做。

有损服务:在接近前端池承载能力的水位上限的时候,随机拒绝部分请求来保护活动总体的可用性。

 

2、订单模块(同一订单,多家商户结算问题)

订单拆分:用户支付后,将订单拆分,生成子订单

 

3、用户下单

先判断有没有登陆

点击下单,生成惟一订单号,状态为未支付

 

4、接口安全

使用HTTP的POST方式,对固定参数+附加参数进行数字签名,使用的是md5加密,好比:我想经过标题获取一个信息,在客户端使用 信息标题+日期+双方约定好的一个key经过md5加密生成一个签名(sign),而后做为参数传递到服务器端,服务器端使用一样的方法进行校验,如何接受过来的sign和咱们经过算法算的值相同,证实是一个正常的接口请求,咱们才会返回相应的接口数据。

 

5、如何处理负载、高并发

一、HTML静态化

其实你们都知道,效率最高、消耗最小的就是纯静态化的html页面,因此咱们尽量使咱们的 网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。

二、图片服务器分离

把图片单独存储,尽可能减小图片等大流量的开销,能够放在一些相关的平台上,如七牛云

三、数据库集群和库表散列及缓存

数据库的并发链接为100,一台数据库远远不够,能够从读写分离、主从复制,数据库集群方面来着手。另外尽可能减小数据库的访问,可使用缓存数据库如memcache、redis。

四、镜像:

尽可能减小下载,能够把不一样的请求分发到多个镜像端。

五、负载均衡:

Apache的最大并发链接为1500,只能增长服务器,能够从硬件上着手,如F5服务器。固然硬件的成本比较高,咱们每每从软件方面着手。

负载均衡 (Load Balancing) 创建在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增长吞吐量、增强网络数据处理能力,同时可以提升网络的灵活性和可用性。目前使用最为普遍的负载均衡软件是Nginx、LVS、HAProxy。

 

6、修改会话的生存时间

1.在php.ini中 设置 session.gc_maxlifetime = 1440 //默认时间

2.代码实现;

 

  •  
$lifeTime = 24 * 3600; //保存一天session_set_cookie_params($lifeTime);session_start();

 

7、PHP的垃圾收集机制

PHP能够自动进行内存管理,清除再也不须要的对象。PHP使用了引用计数(referencecounting)这种单纯的垃圾回收(garbagecollection)机制。每一个对象都内含一个引用计数器,每一个reference链接到对象,计数器加1。当reference离开生存空间或被设为NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将再也不须要使用这个对象,释放其所占的内存空间

 

8、正则的引擎

正则引擎主要能够分为两大类:一种是DFA,一种是NFA。

通常而论,DFA引擎则搜索更快一些。可是NFA以表达式为主导,更容易操纵,所以通常程序员更偏心NFA引擎!

可使用是否支持忽略优先量词和分组捕获来判断引擎类型:支持 NFA,不支持 DFA

 

2021年最新PHP 面试、笔试题汇总(一)_经验分享

 

9、对一个大文件进行逐行遍历,以下方法性能较高的是?

写一个实现了IteratorAggregate 接口的类,经过该类使用foreach遍历。

(使用 IteratorAggregate 可将文件打开后经过移动指针的方式逐行遍历,不受文件大小影响。使用 file_get_contents 处理大文件很容易致使PHP内存溢出;调用exec 会产生额外的进程,影响性能;其余人写的类库质量不必定高。)

 

10、读取文件加锁和解锁

 

  •  
$fp = fopen("lock.txt","w+");    if (flock($fp,LOCK_EX)) {        //得到写锁,写数据        fwrite($fp, "write something");        // 解除锁定        flock($fp, LOCK_UN);    } else {        echo "file is locking...";    }    fclose($fp);

 

 

11、array_merge() 数组合并函数

定义:array_merge() 函数把一个或多个数组合并为一个数组。(您能够向函数输入一个或者多个数组。)

注释:若是两个或更多个数组元素有相同的键名,则最后的元素会覆盖其余元素。

若是两个数组都是索引数组,则不会覆盖

若是您仅向 array_merge() 函数输入一个数组,且键名是整数,则该函数将返回带有整数键名的新数组,其键名以 0 开始进行从新索引。

该函数与 array_merge_recursive() 函数之间的不一样是在处理两个或更多个数组元素有相同的键名的状况。array_merge_recursive() 不会进行键名覆盖,而是将多个相同键名的值递归组成一个数组。

示例;

 

  •  
 $a1=array("red","green");    $a2=array("blue","yellow");    $a3=array("CC","DD");     $b1=array("a"=>"sa","b"=>"sb");    $b2=array("a"=>"qa","b"=>"qb");    $b3=array("a"=>"wa","c"=>"ww");        print_r(array_merge($a1,$a2)); //Array ( [0] => red [1] => green [2] => blue [3] => yellow )    print_r(array_merge($a1,$a2,$a3));  //Array ( [0] => red [1] => green [2] => blue [3] => yellow [4] => CC [5] => DD )    print_r(array_merge($b1,$b2));  //Array ( [a] => qa [b] => qb )    print_r(array_merge($b1,$b2,$a3));  // Array ( [a] => qa [b] => qb [0] => CC [1] => DD )    print_r(array_merge($b1,$b2,$b3));  // Array ( [a] => wa [b] => qb [c] => ww )

 

12、获取文件扩展名

 

  •  
//plan Afunction  get_ext(string $url){//$url = 'http://www.sina.com.cn/abc/de/fg.html?id=1&ajksfg&aakzsdfj';$a = parse_url($url); //Array ( [scheme] => http [host] => www.sina.com.cn [path] => /abc/de/fg.html [query] => id=1&ajksfg&aakzsdfj )$file = basename($a['path']);  //fg.html$b = explode('.',$file);return array_pop($b);}//plan Bfunction  get_ext(string $url){//$url = 'http://www.sina.com.cn/abc/de/fg.html?id=1&ajksfg&aakzsdfj';$a = basename($url); //fg.html?id=1&ajksfg&aakzsdfj$b = explode('?',$a);;  //Array ( [0] => fg.html [1] => id=1&ajksfg&aakzsdfj )$ext = explode('.',$b[0]);return array_pop($ext);}

 

十3、遍历一个文件夹下的全部文件和子文件夹

 

  •  
function my_scandir($dir){$files = array();if(is_dir($dir)){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[] = $dir."/".$file;}}}closedir($handle);return $files;}}}

 

 

十4、编写一个函数,递归遍历,实现无限分类

 

  •  
function tree($arr,$pid=0,$level=0){static $list = array();foreach ($arr as $v) {//若是是顶级分类,则将其存到$list中,并以此节点为根节点,遍历其子节点if ($v['parent_id'] == $pid) {$v['level'] = $level;$list[] = $v;tree($arr,$v['cat_id'],$level+1);}}return $list;}

 

十5、获取上月的最后一天

 

  •  
function get_last_month_last_day($date = ''){if ($date != '') {$time = strtotime($date);} else {$time = time();}$day = date('j',$time);//获取该日期是当前月的第几天return date('Y-m-d',strtotime("-{$day} days",$time));}

 

十6、php中WEB上传文件的原理是什么,如何限制上传文件的大小?

上传文件的表单使用post方式,而且要在form中添加enctype=‘multipart/form-data’。

通常能够加上隐藏域:,位置在file域前面。

value的值是上传文件的客户端字节限制。能够避免用户在花时间等待上传大文件以后才发现文件过大上传失败的麻烦。

使用file文件域来选择要上传的文件,当点击提交按钮以后,文件会被上传到服务器中的临时目录,在脚本运行结束时会被销毁,因此应该在脚本结束以前,将其移动到服务器上的某个目录下,能够经过函数move_uploaded_file()来移动临时文件,要获取临时文件的信息,使用$_FILES。

限制上传文件大小的因素有:

客户端的隐藏域MAX_FILE_SIZE的数值(能够被绕开)。

服务器端的upload_max_filesize,post_max_size和memory_limit。这几项不可以用脚原本设置。

自定义文件大小限制逻辑。即便服务器的限制是能本身决定,也会有须要个别考虑的状况。因此这个限制方式常常是必要的。

 

十7、双引号和单引号的区别

双引号解释变量,单引号不解释变量

双引号里插入单引号,其中单引号里若是有变量的话,变量解释

双引号的变量名后面必需要有一个非数字、字母、下划线的特殊字符,或者用{}讲变量括起来,不然会将变量名后面的部分当作一个总体,引发语法错误

双引号解释转义字符,单引号不解释转义字符,可是解释’\和\

能使单引号字符尽可能使用单引号,单引号的效率比双引号要高(由于双引号要先遍历一遍,判断里面有没有变量,而后再进行操做,而单引号则不须要判断)

 

十8、经常使用的超全局变量

$_GET ----->get传送方式

$_POST ----->post传送方式

$_REQUEST ----->能够接收到get和post两种方式的值

$GLOBALS ----->全部的变量都放在里面

$_FILES ----->上传文件使用

$_SERVER ----->系统环境变量

$_SESSION ----->会话控制的时候会用到

$_COOKIE ----->会话控制的时候会用到

 

十9、echo、print_r、print、var_dump之间的区别

* echo、print是php语句,var_dump和print_r是函数

* echo 输出一个或多个字符串,中间以逗号隔开,没有返回值是语言结构而不是真正的函数,所以不能做为表达式的一部分使用

* print也是php的一个关键字,有返回值 只能打印出简单类型变量的值(如int,string),若是字符串显示成功则返回true,不然返回false

* print_r 能够打印出复杂类型变量的值(如数组、对象)以列表的形式显示,并以array、object开头,但print_r输出布尔值和NULL的结果没有意义,由于都是打印"\n",所以var_dump()函数更适合调试

* var_dump() 判断一个变量的类型和长度,并输出变量的数值

 

二10、对于大流量网站,采用什么方法来解决访问量的问题

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

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

优化SQL语句

禁止外部盗链

控制大文件的下载

使用不一样主机分流主要流量

使用流量分析统计