2020最新⼤⼚内部PHP⾼级⼯程师⾯试题汇总(⼀)1、给你四个坐标点,判断它们能不能组成⼀个矩形,如判断 ([0,0],[0,1],[1,1],[1,0]) 能组成⼀个矩形。
我们分析这道题, 给4个标点,判断是否矩形
⾼中知识,矩形有4条边,两两相等, 矩形两条对⾓线相等, 矩形的长短边与对⾓线满⾜勾股定理。
故解题思路为,根据坐标点,
列出所有的两点组合边长的数组,去重,看是不是只剩 3个长度(注意正⽅形2个长度)
判断是否满⾜勾股定理
调优⼀下,先判断有没有重复的点,有的话肯定不是矩形
代码如下:
<?php
function isRectangle($point1, $point2, $point3, $point4){
if ($point1 == $point2 || $point1 == $point3  || $point1 == $point4 || $point2 == $point3 || $point2 == $point4 || $point3 == $point4) {        return false;
}
$lengthArr = [];
$lengthArr[] = getLengthSquare($point1, $point2);
$lengthArr[] = getLengthSquare($point1, $point3);
$lengthArr[] = getLengthSquare($point1, $point4);
$lengthArr[] = getLengthSquare($point2, $point3);
$lengthArr[] = getLengthSquare($point2, $point4);
$lengthArr[] = getLengthSquare($point3, $point4);
$lengthArr = array_unique($lengthArr);
$lengthCount = count($lengthArr);
if ($lengthCount == 3 || $lengthCount == 2 ) {
if ($lengthCount == 2) {
return(max($lengthArr) == 2*min($lengthArr));
} else {
$maxLength = max($lengthArr);
$minLength = min($lengthArr);
$otherLength = array_diff($lengthArr, [$maxLength, $minLength]);
return($minLength + $otherLength == $maxLength);
}
} else {
return false;
}
}
function getLengthSquare($point1, $point2){
$res = pow($point1[0]-$point2[0], 2)+pow($point1[1]-$point2[1], 2);
return $res;
}
var_dump(isRectangle([0,0],[0,2],[2,2],[2,0]));
2、写⼀段代码判断单向链表中有没有形成环,如果形成环,请出环的⼊⼝处,即 P 点
/*
*单链表的结点类
*/
class LNode{
//为了简化访问单链表,结点中的数据项的访问权限都设为public    public int data;
public LNode next;
jstl的foreach标签
}
class LinkListUtli {
//当单链表中没有环时返回null,有环时返回环的⼊⼝结点
dos转unix命令public static LNode searchEntranceNode(LNode L)
{
LNode slow=L;//p表⽰从头结点开始每次往后⾛⼀步的指针        LNode fast=L;//q表⽰从头结点开始每次往后⾛两步的指针
while(fast !=null && !=null)
{
if(slow==fast) break;//p与q相等,单链表有环
;
ext;
}
if(fast==null || ==null) return null;
// 重新遍历,寻环的⼊⼝点
slow=L;
while(slow!=fast)
{
;
;
}
return slow;
}
}
3、写⼀个函数,获取⼀篇⽂章内容中的全部图⽚,并下载
function download_images($article_url = '', $image_path = 'tmp'){
// 获取⽂章类容
$content = file_get_contents($article_url);
// 利⽤正则表达式得到图⽚链接infrastructure英语
$reg_tag = '/<img.*?\"([^\"]*(jpg|bmp|jpeg|gif|png)).*?>/';
$ret = preg_match_all($reg_tag, $content, $match_result);
$pic_url_array = array_unique($match_result1[1]);
// 创建路径
$dir = getcwd() . DIRECTORY_SEPARATOR .$image_path;
mkdir(iconv("UTF-8", "GBK", $dir), 0777, true);
foreach($pic_url_array as $pic_url){
// 获取⽂件信息
mysql面试题大全
$ch = curl_init($pic_url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_NOBODY, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE );
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$fileInfo = curl_exec($ch);
$httpinfo = curl_getinfo($ch);
curl_close($ch);
// 获取图⽚⽂件后缀
$ext = strrchr($pic_url, '.');
$filename = $dir . '/' . uniqid() . $ext;
// 保存图⽚信息到⽂件
$local_file = fopen($filename, 'w');
if(false !== $local_file){
if( false !== fwrite($local_file, $filecontent) ){
fclose($local_file);
}
}
}
}
4、获取当前客户端的 IP 地址,并判断是否在(111.111.111.111,222.222.222.222)
如果没有使⽤代理服务器:
$ip = $_SERVER[‘REMOTE_ADDR’];
使⽤透明代理
$ip = $_SERVER[‘HTTP_X_FORWARDED_FOR’];
fifo异步数据复分接设计5、nginx 的 log_format 配置如下:
log_format main ‘remoteaddr−remote_user [timelocal]"request”’
‘statusbody_bytes_sent “httpreferer"″"http_user_agent” “upstreamresponsetime""request_time” “http_x_forwarded_for"';从今天的 nginx log ⽂件 access.log 中:
a、列出 “request_time” 最⼤的 20 ⾏?
b、列出早上 10 点访问量做多的 20 个 url 地址?
6、什么是 CSRF 攻击?XSS 攻击?如何防范?
CSRF:跨站请求伪造,可以通过通过判断来源和加 Token 的⽅式来防范。
XSS:跨站脚本攻击,可以通过对内容转义和过滤来防范,还有 CSP
7、应⽤中我们经常会遇到在 user 表随机调取 10 条数据来展⽰的情况,简述你如何实现该功能。
SELECT * FROM `table` WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) ORDER BY id LIMIT 1;
8、从扑克牌中随机抽 5 张牌,判断是不是⼀个顺⼦,即这 5 张牌是连续的
这个问题有个关键点,扑克牌,1-13 不能再多了。这就很简单了。⽤ PHP 来做,定义⼀个数组分别存着 1 到 13, 拿出⼀个,置空⼀个,最后看下 这五个置空的 是不是连续的。这种情况不考虑抽出的顺序。
9、两条相交的单向链表,如何求它们的第⼀个公共节点
思想:
1. 如果两个链表相交,则从相交点开始,后⾯的节点都相同,即最后⼀个节点肯定相同;
2. 从头到尾遍历两个链表,并记录链表长度,当⼆者的尾节点不同,则⼆者肯定不相交;
3. 尾节点相同,如果 A 长为 LA,B 为 LB,如果 LA>LB, 则 A 前 LA-LB 个先跳过
如果两个单向链表有公共的结点,也就是说两个链表从某⼀结点开始,它们的 m_pNext 都指向同⼀个结点。但由于是单向链表的结点,每个结点只有⼀个 m_pNext,因此从第⼀个公共结点开始,之后它们所有结点都是重合的,不可能再出现分叉。所以,两个有公共结点⽽部分重合的链表,拓扑形状看起来像⼀个 Y,⽽不可能像 X。
10、最长公共⼦序列问题 LCS,如有 [1,2,5,11,32,15,77] 和 [99,32,15,5,1,77] 两个数组,到它们共
同都拥有的数,写出时间复杂度最优的代码,不能⽤ array_intersect(这⾥有坑,需要去研究⼀下动态规划)。
11、linux 的内存分配和多线程原理
12、MYSQL 中主键与唯⼀索引的区别
主键:绝对不能有空值。唯⼀索引:可以有空值
13、http 与 https 的主要区别
关键是 S 上。简⽽⾔之,https 建⽴连接后要先把 SSL 的证书发下去,有了公钥和私钥,就可以解密了。
14、http 状态码及其含意
200 请求已成功,请求所希望的响应头或数据体将随此响应返回。
301 被请求的资源已永久移动到新位置。
302 请求的资源现在临时从不同的 URI 响应请求。
400 1、语义有误,当前请求⽆法被服务器理解。2、请求参数有误。
401 当前请求需要⽤户验证。
403 服务器已经理解请求,但是拒绝执⾏它。
404 请求失败,请求所希望得到的资源未被在服务器上发现。
500 服务器遇到了⼀个未曾预料的状况,⽆法完成对请求的处理,会在程序码出错时出现。
501 服务器不⽀持当前请求所需要的某个功能。⽆法识别请求的⽅法。
502 作为⽹关或者代理⼯作的服务器尝试执⾏请求时,从上游服务器接收到⽆效的响应。
503 由于临时的服务器维护或者过载,服务器当前⽆法处理请求。
15、linux 中怎么查看系统资源占⽤情况
top、htop、free、uptime
16、SQL 注⼊的原理是什么?如何防⽌ SQL 注⼊
原理:第⼀ SQL 本⾝有问题(这个不是主要问题)。第⼆你写的 SQL 很有问题(这是最主要的)
防范:第⼀,绝对不要相信⽤户输⼊的任何东西。第⼆,预编译。现在的框架⼀般都会有 SQL 过滤的。
17、isset (null) isset (false) empty (null) empty (false) 输出
PHP ⼊门问题,isset 和 empty 的区别
分别是 false, true, true, true
18、优化 MYSQL 的⽅法
第⼀,数据超过⼀定数量或者体积,请拆分表,垂直或者⽔平分(最有效果的优化)
第⼆,务必有⾃增主键。通过⾃增主键来查数据是最快的。
第三,常⽤的查询字段建⽴联合索引,写 SQL ⼀定要尊从最左原则,⽤到这个索引。
第四,不要把逻辑运算放到 sql ⾥。⾔外之意是,不要写太复杂的 SQL,你能写复杂的 SQL 你肯定也能通过 PHP 实现。
19、数据库中的事务是什么?
事务(transaction)是作为⼀个单元的⼀组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有⼀个操作失败,事务也不成功。如果所有操作完成,
事务则提交,其修改将作⽤于所有其他数据库进程。如果⼀个操作失败,则事务将回滚,该事务所有操作的影响都将取消。
20、写⼀个函数,尽可能⾼效的从⼀个标准 URL 中取出⽂件的扩展名
会 写正则最好。我反正不会正则,需要⽤的时候就百度。
21、参数为多个⽇期时间的数组,返回离当前时间最近的那个时间
遍历数组,求当前时间差,和第⼀个进⾏对⽐,⼩于第⼀个交换位置。最后取第⼀个即可。
22、echo、print、print_r 的区别
这三个放在⼀起,回答的点在于,print_r 是函数,echo、print 是结构语⾔。
23、http 协议的 header 中有哪些 key 及含义
这个问题,很难。⼀会半会说不清楚。如果做过 PHP restful 接⼝开发,也踩过这⾥⾯的坑,那应该是可以答出来常⽤的⼏个 KEY 的。
24、⼆叉树前中后遍历代码
1. 层序遍历
2. 先序遍历
3. 中序遍历
4. 后序遍历
25、PHP 的数组和 C 语⾔的数组结构上有何区别?
while语句代码但从 PHP 来讲,考的是 PHP 数组的实现。可以简单的认为,PHP 的数组是 hash 桶 + ⼗字链表(实际上是数列 Array,列表 List,散列表 / 关联数组 / 字典 Hashtable 的聚合体)。优点是查询效率很⾼,遍历很⽅便,缺点是,占内存较多。(还是空间换时间的思路,毕竟现在内存⼜不值钱)
C 语⾔的数组,就是定长定类型的数列。
26、Redis 的跳跃表怎么实现的

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。