php2021经典面试题
PHP经典面试题
-
从用户在浏览器中输入网址并回车,到看到完整的见面,中间都经历了哪些过程。
入门问题。这个问题有一个很大的坑,面试官可能会从这个问题下手问你一大堆问题。
以 PHP 为例:通常最简单的回答,从用户的电脑找到最近的 DNS 服务,然后解析到对应的 IP 然后双方开始 HTTP 连接,然后发送请求信息,服务器拿到请求信息就开始准备回应的信息,中间要经过 nginx 转发到 frstCGI (PHP-FPM), 然后 PHP 开始解析框架,解析请求头部,找到对应的 API,该查数据库查数据,该组装 HTML 组装 HTML,完事了就重新返回给用户。用户拿到返回数据,浏览器开始渲染页面,JS 开始加载。 -
== 和 === 的区别,写出以下输出:"aa"== 1,"bb"== 0,1=="1"
- == 等于,不需要对比数据类型
- === 全等,需要对比类型
false, true, true
如果字符串是 数字 或前导数字,则它将解析为相应的整数值,否则将转换为零 ( 0)。
-
对称加密和非对称加密的方式
对称加密:我们俩共用一个秘钥,你加密,我解密。
非对称加密:我给你一个公钥,你加密完了,我还能有我的私钥把密文解开。但是你没有我的私钥。
扩展:椭圆加密算法。
-
PHP 的的这种弱类型变量是怎么实现的? (这题有点深可以不看)
考 zval 的,PHP 的八种类型,本质只有一个结构。 -
echo、print、print_r 的区别
这三个放在一起,回答的点在于,print_r 是函数,echo、print 是结构语言。至于他们具体的区别参考:https://www.cnblogs.com/xiaotaoing/p/6687368.html
-
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
如果var
是 null 则返回TRUE
,否则返回FALSE
。 -
从扑克牌中随机抽 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]));
-
请写出自少两个支持回调处理的 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)
-
请写出自少两个获取指定文件夹下所有文件的方法(代码或思路)。#
核心方法是 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');
-
PHP 如何实现不用自带的 cookie 函数为客户端下发 cookie。
header — 发送原生 HTTP 头示例
//setcookie('name','121212'); header('Set-Cookie:name=88997766'); var_dump($_COOKIE['name']);
-
$a=[0,1,2,3]; $b=[1,2,3,4,5]; $a+=$b; var_dump ($a) 等于多少?
基础问题。本质还是考 PHP 数组的结构和特点。结果是 01235。PHP 用数字索引和 STRING 索引差别还是很大的
-
$a=[1,2,3]; foreach ($a as &$v){} foreach ($a as $v){} var_dump ($a) 等于多少;
122
此处有一坑。foreach 完之后,$index , $value 并不会消失保留最后一次赋值。
这里的第一次 foreach 之后,数组中最后一个元素变成引用,引用变量 $v 继续存在且指向数组的最后一个元素。第二次遍历,因为遍历变量名是 $v , 所以等于说每次遍历都将此次遍历的值修改成最后元素的值,直至到遍历最后一个元素(引用元素),因为此时数组的最后一个元素已被修改成上一个元素的值,最后一次赋值就是 自己 == 自己。 故最后一个等于倒数第二个 -
有这样一个字符串 abcdefgkbcdefab...... 随机长度,写一个函数来求 bcde 在这个字符串中出现的次数
substr_count(); -
Trait 优先级
在 trait 继承中,优先顺序依次是:来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法 -
参数为多个日期时间的数组,返回离当前时间最近的那个时间
遍历数组,求当前时间差,和第一个进行对比,小于第一个交换位置。最后取第一个即可。 -
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"))]; -
http 状态码及其含意
200 请求已成功,请求所希望的响应头或数据体将随此响应返回。
301 被请求的资源已永久移动到新位置。
302 请求的资源现在临时从不同的 URI 响应请求。
400 1、语义有误,当前请求无法被服务器理解。2、请求参数有误。
401 当前请求需要用户验证。
403 服务器已经理解请求,但是拒绝执行它。
404 请求失败,请求所希望得到的资源未被在服务器上发现。
500 服务器遇到了一个未曾预料的状况,无法完成对请求的处理,会在程序码出错时出现。
501 服务器不支持当前请求所需要的某个功能。无法识别请求的方法。
502 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
503 由于临时的服务器维护或者过载,服务器当前无法处理请求。 -
http 与 https 的主要区别
关键是 S 上。简而言之,https 建立连接后要先把 SSL 的证书发下去,有了公钥和私钥,就可以解密了。 -
php5与php7的区别。php7新特性。php8新特性
参考官方:https://www.php.net/manual/zh/appendices.php -
获取当前客户端的 IP 地址,并判断是否在(111.111.111.111,222.222.222.222)
如果没有使用代理服务器:$ip = $_SERVER['REMOTE_ADDR'];
使用透明代理
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
参考文章
-
有一个 1G 大小的一个文件,里面每一行是一个词,词的大小不超过 16 个字节,内存限制大小是 1M。返回频数最高的 100 个词
方法太多了,但是实现起来 各有各的问题。我可能只会用 HASH 映射做。其他的,不会。
十道海量数据处理面试题与十个方法大总结
> https://blog.csdn.net/v_JULY_v/article/details/6279498
-
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
-
老旧话题: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://learnku.com/articles/20714
apache
-
Apache动、静态编译
关于apache的动态与静态编译的理解,引用某人的比喻如下:
好比有两个人a和m,a代表apache,m代表module,要想让a使用m的东西,一个方法是把m的东西都放到a那里去,a使用的时候就是现成的了,就是所谓的静态编译
还有一个方法,就是告诉a,m的住址,当a要使用m的东西的时候,a去找m,然后使用,不过,这种方法要注意的一个问题就是:m必须要有实际的住址,否则a会找不到m而产生错误的,这种方法也就是apache 的动态(DSO)编译了。 -
Apache 的三种工作模式
在apache的早期版本2.0默认prefork,2.2版本是worker,2.4版本是event,
ngixn
-
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的通信方式
Mysql
-
mysql 数据库中 innodb 和 myisam 引擎的区别
区别主要在数据和索引的存储结构和存储方式上,以及对于事务的支持。
参考:https://blog.csdn.net/chajinglong/article/details/56666771
-
MYSQL 中主键与唯一索引的区别
主键:绝对不能有空值。唯一索引:可以有空值
其他
-
从用户在浏览器中输入网址并回车,到看到完整的见面,中间都经历了哪些过程。
入门问题。这个问题有一个很大的坑,面试官可能会从这个问题下手问你一大堆问题。
以 PHP 为例:通常最简单的回答,从用户的电脑找到最近的 DNS 服务,然后解析到对应的 IP 然后双方开始 HTTP 连接,然后发送请求信息,服务器拿到请求信息就开始准备回应的信息,中间要经过 nginx 转发到 frstCGI (PHP-FPM), 然后 PHP 开始解析框架,解析请求头部,找到对应的 API,该查数据库查数据,该组装 HTML 组装 HTML,完事了就重新返回给用户。用户拿到返回数据,浏览器开始渲染页面,JS 开始加载。
-
http 与 https 的主要区别
关键是 S 上。简而言之,https 建立连接后要先把 SSL 的证书发下去,有了公钥和私钥,就可以解密了。 -
在 HTTP 通讯过程中,是客户端还是服务端主动断开连接?
三次握手和四次挥手,以及他们每步的状态。这个问题最好能一步到位回答的全面的。一般都是有客户端告诉服务端,我这边东西发完了,可以断连接了么。但是如果客户端发完 FIN 服务端没有回复,就会重试,直到超过超时时间,就断了。服务端也一样,超过时间,服务端就