php2021经典面试题

PHP经典面试题

  1. 从用户在浏览器中输入网址并回车,到看到完整的见面,中间都经历了哪些过程。
    入门问题。这个问题有一个很大的坑,面试官可能会从这个问题下手问你一大堆问题。
    以 PHP 为例:通常最简单的回答,从用户的电脑找到最近的 DNS 服务,然后解析到对应的 IP 然后双方开始 HTTP 连接,然后发送请求信息,服务器拿到请求信息就开始准备回应的信息,中间要经过 nginx 转发到 frstCGI (PHP-FPM), 然后 PHP 开始解析框架,解析请求头部,找到对应的 API,该查数据库查数据,该组装 HTML 组装 HTML,完事了就重新返回给用户。用户拿到返回数据,浏览器开始渲染页面,JS 开始加载。

  2. == 和 === 的区别,写出以下输出:"aa"== 1,"bb"== 0,1=="1"

    • == 等于,不需要对比数据类型
    • === 全等,需要对比类型

    false, true, true

    如果字符串是 数字 或前导数字,则它将解析为相应的整数值,否则将转换为零 ( 0)。

  3. 对称加密和非对称加密的方式

    对称加密:我们俩共用一个秘钥,你加密,我解密。

    非对称加密:我给你一个公钥,你加密完了,我还能有我的私钥把密文解开。但是你没有我的私钥。

    扩展:椭圆加密算法。

  4. PHP 的的这种弱类型变量是怎么实现的? (这题有点深可以不看)
    考 zval 的,PHP 的八种类型,本质只有一个结构。

    参考:https://blog.csdn.net/ohmygirl/article/details/41542445

  5. echo、print、print_r 的区别
    这三个放在一起,回答的点在于,print_r 是函数,echo、print 是结构语言。

    至于他们具体的区别参考:https://www.cnblogs.com/xiaotaoing/p/6687368.html

  6. isset (null) isset (false) empty (null) empty (false) 输出
    PHP 入门问题,isset 和 empty 的区别

    分别是 false, true, true, true
    isset — 检测变量是否设置 如果 var 存在并且值不是 NULL 则返回 TRUE ,否则返回 FALSE

    empty— 检查一个变量是否为空 当var存在,并且是一个非空非零的值时返回 FALSE 否则返回 TRUE .

    is_null — 检测变量是否为 NULL 如果 varnull 则返回 TRUE ,否则返回 FALSE

  7. 从扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这 5 张牌是连续的
    这个问题有个关键点,扑克牌,1-13 不能再多了。这就很简单了。用 PHP 来做,定义一个数组分别存着 1 到 13, 拿出一个,置空一个,最后看下 这五个置空的 是不是连续的。这种情况不考虑抽出的顺序。

    function eatChicken(array $data){
     $min = min($data);
    
     for ($i = $min; $i < $min + 5; ++$i) {
             var_dump($i);
         if (!in_array($i, $data)) {
             return false;
         }
     }
     return true;
    }
    //var_dump(eatChicken([1, 3, 5, 2, 4]));
    var_dump(eatChicken([10, 13, 11, 12, 14]));
    //var_dump(eatChicken([1, 3, 5, 7, 9]));
    
       
    

    参考:https://www.detechn.com/post/1707.html

  8. 请写出自少两个支持回调处理的 PHP 函数,并自己实现一个支持回调的 PHP 函数

    array_map,array_filter, array_walk

    $func  = function( $arg1 ,  $arg2 ) {
     	return  $arg1  *  $arg2 ;
    };
    
    call_user_func_array ( $func , array( 2 ,  4 )); //int(8)
    
    
  9. 请写出自少两个获取指定文件夹下所有文件的方法(代码或思路)。#
    核心方法是 scandir, 核心思想是递归。
    参考:https://www.detechn.com/post/3764.html

    $dir     =  '/tmp' ;
    $files1  =  scandir ( $dir );
    print_r ( $files1 );
    Array
    (
    	[0] => .
    	[1] => ..
    	[2] => bar.php
    	[3] => foo.txt
    	[4] => somedir
    )
    
    
    function readDirDeep($path)
    {
    	$handle = opendir($path);
    	while (false !== ($filename = readdir($handle))) {
    		if ($filename == '.' || $filename == '..') continue;
    		echo  $filename . '<br>';
    		//str_repeat(str,n) 重复一个str字符串n次
    		if (is_dir($path . '/' . $filename)) {
    			readDirDeep($path . '/' . $filename);
    		}
    	}
    	//闭关
    	closedir($handle);
    }
    readDirQueue('C:\Users\Asus\Desktop');
    
    
  10. PHP 如何实现不用自带的 cookie 函数为客户端下发 cookie。
    header — 发送原生 HTTP 头

    示例

    //setcookie('name','121212');
    header('Set-Cookie:name=88997766');
    var_dump($_COOKIE['name']);
    
    
  11. $a=[0,1,2,3]; $b=[1,2,3,4,5]; $a+=$b; var_dump ($a) 等于多少?
    基础问题。本质还是考 PHP 数组的结构和特点。

    结果是 01235。PHP 用数字索引和 STRING 索引差别还是很大的

    参考:http://www.jb51.net/article/38593.htm

  12. $a=[1,2,3]; foreach ($a as &$v){} foreach ($a as $v){} var_dump ($a) 等于多少;
    122
    此处有一坑。foreach 完之后,$index , $value 并不会消失保留最后一次赋值。
    这里的第一次 foreach 之后,数组中最后一个元素变成引用,引用变量 $v 继续存在且指向数组的最后一个元素。第二次遍历,因为遍历变量名是 $v , 所以等于说每次遍历都将此次遍历的值修改成最后元素的值,直至到遍历最后一个元素(引用元素),因为此时数组的最后一个元素已被修改成上一个元素的值,最后一次赋值就是 自己 == 自己。 故最后一个等于倒数第二个

    博客:https://www.cnblogs.com/xfych/p/14927049.html

  13. 有这样一个字符串 abcdefgkbcdefab...... 随机长度,写一个函数来求 bcde 在这个字符串中出现的次数
    substr_count();

    参考:https://www.php.net/manual/zh/function.substr-count

  14. Trait 优先级
    在 trait 继承中,优先顺序依次是:来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法

    参考:https://www.php.net/manual/zh/language.oop5.traits.php

  15. 参数为多个日期时间的数组,返回离当前时间最近的那个时间
    遍历数组,求当前时间差,和第一个进行对比,小于第一个交换位置。最后取第一个即可。

    参考:https://www.jianshu.com/p/23b4c4e71bda

  16. php获取时间是星期几

    date("l"); //data就可以获取英文的星期比如Sunday
    date("w"); //这个可以获取数字星期比如123,注意0是星期日

    获取中文星期几:

    $weekarray=array("日","一","二","三","四","五","六"); //先定义一个数组
    echo "星期".$weekarray[date("w")];

    获取指定日期是:

    $weekarray=array("日","一","二","三","四","五","六");
    echo "星期".$weekarray[date("w",strtotime("2011-11-11"))];

    参考: https://www.cnblogs.com/liangzia/p/12029692.html

  17. http 状态码及其含意
    200 请求已成功,请求所希望的响应头或数据体将随此响应返回。
    301 被请求的资源已永久移动到新位置。
    302 请求的资源现在临时从不同的 URI 响应请求。
    400 1、语义有误,当前请求无法被服务器理解。2、请求参数有误。
    401 当前请求需要用户验证。
    403 服务器已经理解请求,但是拒绝执行它。
    404 请求失败,请求所希望得到的资源未被在服务器上发现。
    500 服务器遇到了一个未曾预料的状况,无法完成对请求的处理,会在程序码出错时出现。
    501 服务器不支持当前请求所需要的某个功能。无法识别请求的方法。
    502 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
    503 由于临时的服务器维护或者过载,服务器当前无法处理请求。

  18. http 与 https 的主要区别
    关键是 S 上。简而言之,https 建立连接后要先把 SSL 的证书发下去,有了公钥和私钥,就可以解密了。

    参考:https://www.cnblogs.com/zyl-Tara/p/7079696.html

  19. php5与php7的区别。php7新特性。php8新特性
    参考官方:https://www.php.net/manual/zh/appendices.php

  20. 获取当前客户端的 IP 地址,并判断是否在(111.111.111.111,222.222.222.222)
    如果没有使用代理服务器:

    $ip = $_SERVER['REMOTE_ADDR'];

    使用透明代理

    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];

    参考文章

    https://www.cnblogs.com/rendd/p/6183094.html

  21. 有一个 1G 大小的一个文件,里面每一行是一个词,词的大小不超过 16 个字节,内存限制大小是 1M。返回频数最高的 100 个词
    方法太多了,但是实现起来 各有各的问题。

    我可能只会用 HASH 映射做。其他的,不会。

    十道海量数据处理面试题与十个方法大总结

    > https://blog.csdn.net/v_JULY_v/article/details/6279498
    
  22. php读取超大文件(使用yield生成器)

    <?php
    
    function getLines($file) {
    	$f = fopen($file, 'r');
    	try {
    		while ($line = fgets($f)) {
    			yield $line;
    		}
    	} finally {
    		fclose($f);
    	}
    }
    
    foreach (getLines("logs.log") as $n => $line) {
    	//逐行内容
    	echo $line;
    	//行数
    	var_dump($n);
    }
    
    

    参考: 鸟哥,官方文档 等

    https://www.jeeinn.com/2020/11/1454/

    https://www.laruence.com/2012/08/16/2709.html

    https://www.php.net/manual/zh/language.exceptions.php

    https://www.php.net/manual/zh/language.generators.syntax.php

  23. 老旧话题:PHP读取超大文件

    <?php
    $begin = microtime( true );
    $fp = fopen( './test.log', 'r' );
    while( !feof( $fp ) ){
      // 如果你要使用echo,那么,你会很惨烈...
      fread( $fp, 10240 );
    }
    fclose( $fp );
    $end = microtime( true );
    echo "cost : ".( $end - $begin ).' sec'.PHP_EOL;
    exit;
    

    参考:https://segmentfault.com/a/1190000017205171



部分题参考:https://learnku.com/articles/20714

apache

  1. Apache动、静态编译

    关于apache的动态与静态编译的理解,引用某人的比喻如下:

    好比有两个人a和m,a代表apache,m代表module,要想让a使用m的东西,一个方法是把m的东西都放到a那里去,a使用的时候就是现成的了,就是所谓的静态编译
    还有一个方法,就是告诉a,m的住址,当a要使用m的东西的时候,a去找m,然后使用,不过,这种方法要注意的一个问题就是:m必须要有实际的住址,否则a会找不到m而产生错误的,这种方法也就是apache 的动态(DSO)编译了。

    参考:http://bbs.chinaunix.net/thread-1939368-1-1.html

  2. Apache 的三种工作模式

    在apache的早期版本2.0默认prefork,2.2版本是worker,2.4版本是event,

    参考:https://blog.mimvp.com/article/27778.html

ngixn

  1. nginx与php-fpm通信的两种方式

    在linux中,nginx服务器和php-fpm可以通过tcp socket和unix socket两种方式实现。

    unix socket是一种终端,可以使同一台操作系统上的两个或多个进程进行数据通信。这种方式需要再nginx配置文件中填写php-fpm的pid文件位置,效率要比tcp socket高。

    tcp socket的优点是可以跨服务器,当nginx和php-fpm不在同一台机器上时,只能使用这种方式。

    windows系统只能使用tcp socket的通信方式

    参考:https://blog.csdn.net/koastal/article/details/52303316

Mysql

  1. mysql 数据库中 innodb 和 myisam 引擎的区别

    区别主要在数据和索引的存储结构和存储方式上,以及对于事务的支持。

    参考:https://blog.csdn.net/chajinglong/article/details/56666771

  2. MYSQL 中主键与唯一索引的区别

    主键:绝对不能有空值。唯一索引:可以有空值

    参考:https://www.cnblogs.com/lonelyxmas/p/4594624.html

其他

  1. 从用户在浏览器中输入网址并回车,到看到完整的见面,中间都经历了哪些过程。

    入门问题。这个问题有一个很大的坑,面试官可能会从这个问题下手问你一大堆问题。

    以 PHP 为例:通常最简单的回答,从用户的电脑找到最近的 DNS 服务,然后解析到对应的 IP 然后双方开始 HTTP 连接,然后发送请求信息,服务器拿到请求信息就开始准备回应的信息,中间要经过 nginx 转发到 frstCGI (PHP-FPM), 然后 PHP 开始解析框架,解析请求头部,找到对应的 API,该查数据库查数据,该组装 HTML 组装 HTML,完事了就重新返回给用户。用户拿到返回数据,浏览器开始渲染页面,JS 开始加载。

    转自链接:https://learnku.com/articles/20714

  2. http 与 https 的主要区别
    关键是 S 上。简而言之,https 建立连接后要先把 SSL 的证书发下去,有了公钥和私钥,就可以解密了。

    参考:https://www.cnblogs.com/zyl-Tara/p/7079696.html

  3. 在 HTTP 通讯过程中,是客户端还是服务端主动断开连接?
    三次握手和四次挥手,以及他们每步的状态。

    这个问题最好能一步到位回答的全面的。一般都是有客户端告诉服务端,我这边东西发完了,可以断连接了么。但是如果客户端发完 FIN 服务端没有回复,就会重试,直到超过超时时间,就断了。服务端也一样,超过时间,服务端就

posted @ 2021-06-24 10:24  这该死的代码  阅读(275)  评论(0编辑  收藏  举报