天涯论坛

 找回密码
 立即注册
搜索
查看: 14|回复: 3

2020年BAT大厂PHP工程师面试题整理(附带答案)

[复制链接]

2991

主题

330

回帖

9919万

积分

论坛元老

Rank: 8Rank: 8

积分
99199252
发表于 2024-10-4 12:50:59 | 显示全部楼层 |阅读模式

今天下午来到北京百度科技园进行面试PHP工程师岗位。面试官问了非常多问题,由于重点是从事php方面的,因此下面谈的这些面试问题重点都是php方面的,当然其它的语言面试有些问题会被问到。我大概整理回忆下:

PHP研发工程师笔试试卷

姓名:

1、PHP研发部分

1.合并两个数组有几种方式,试比较它们的异同

答: 

1)array_merge()

2)’+’

3)array_merge_recursive

array_merge 简单的合并数组

array_merge_recursive 合并两个数组,倘若数组中有完全同样的数据,将它们递归合并

array_combine 和 ‘+’ :合并两个数组,前者的值做为新数组的键

2.请写一个函数来检测用户提交的数据是不是为整数(不区分数据类型,能够为二进制、八进制、十进制、十六进制数字)

答:

其实重点还是is_int和 floor 这个办法

if(!is_numeric($jp_total)||strpos($jp_total,".")!==false){echo "不是整数";}else{ echo "是整数";}

3.PHP的strtolower()和strtoupper()函数在安装非中文系统的服务器下可能会引起将汉字转换为乱码,请写两个替代的函数实现兼容Unicode文字的字符串体积写转换

答:

原由是:中文是由于多字节构成的,而仅有英文系统的单个英文字符仅有一个字节,因此该系统把中文的每一个字节都做了strtolower()处理,改变后的中文字节拼接在一块成为了乱码(新生成的编码映射对应的字符可能就不是中文了)

手动处理用str_split(string string,intstring,intsplit_length = 1)按每一个字节切割,像中文能切割成三个字节。对识别到的字节若是英文字母则进行转换。

<?phpfunction mystrtoupper($a){ $b = str_split($a, 1); $r = ; foreach($b as $v){ $v = ord($v); if($v >= 97 && $v<= 122){ $v -= 32; }$r .= chr($v); } return $r;}$a = a中你继续F@#$%^&*(BMDJFDoalsdkfjasl;echo origin string:.$a."\n";echo result string:;$r = mystrtoupper($a);var_dump($r);

4.PHP的is_writeable()函数存在Bug,没法准确判断一个目录/文件是不是可写,请写一个函数来判断目录/文件是不是绝对可写

答:

其中bug存在两个方面,

1)在windowns中,当文件仅有只读属性时,is_writeable()函数才返回false,当返回true时,该文件不必定是可写的。

倘若是目录,在目录中新建文件并经过打开文件来判断;

倘若是文件,能够经过打开文件(fopen),来测试文件是不是可写。

2)在Unix中,当php配置文件中开启safe_mode时(safe_mode=on),is_writeable()一样不可用。

读取配置文件是不是safe_mode是不是开启。

/*** Tests for file writability** is_writable() returns TRUE on Windows servers when you really cant write to* the file, based on the read-only attribute. is_writable() is also unreliable* on Unix servers if safe_mode is on.** @access private* @return void*/if ( ! function_exists(is_really_writable)){function is_really_writable($file){ // If were on a Unix server with safe_mode off we call is_writableif (DIRECTORY_SEPARATOR == / AND @ini_get("safe_mode") == FALSE) { return is_writable($file); } // For windows servers and safe_mode "on" installations well actually // write a file then read it. Bah...if (is_dir($file)) { $file = rtrim($file, /)./.md5(mt_rand(1,100).mt_rand(1,100)); if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) { return FALSE; } fclose($fp);@chmod($file, DIR_WRITE_MODE); @unlink($file); return TRUE; } elseif ( ! is_file($file) OR ($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) {return FALSE; } fclose($fp); return TRUE; }}

5.PHP处理上传文件信息数组中的文件类型$_FILES[‘type’]由客户端浏览器供给,有可能是黑客伪造的信息,请写一个函数来保证用户上传的图像文件类型真实靠谱

答:

用getimagesize来判断上传照片的类型比$_FILES函数的type更靠谱

同一个文件,运用区别的浏览器php返回的type类型是不同样的,由浏览器供给type类型的话,就有可能被黑客利用向服务器提交一个伪装撑照片后缀的可执行文件。

能够经过getimagesize()函数来判断上传的文件类型,倘若是头像文件 会返回这般的一个数组

Array( [0] => 331[1] => 234 [2] => 3 [3] => width="331" height="234" [bits] => 8 [mime] => image/png);

倘若经过getimagesize()函数返回的是这般的一个数组 说明上传的是头像文件。其中索引为2的暗示类型

1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(intel byteorder),8 = TIFF(motorola byte order),9 = JPC,10 = JP2,11 = JPX,12 =JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM,

能够经过这个再去限制上传的头像类型

<?php $file=$_FILES[file]; if(!empty($file)) { var_dump($file); var_dump(getimagesize($file["tmp_name"])); } ?>

6.PHP经过对数据的URL编码来实现与Javascript的数据交互,然则针对部分特殊字符的编解码与Javascript的规则不尽相同,请详细说明这种差异,并针对UTF-8字符集的数据,写出PHP的编解码函数和Javascript的编解码函数,保证PHP编码数据能够被Javascript正确解码 、Javascript编码的数据能够被PHP正确解码

答:

<?php $str = 思源博客siyuantlw/tlw/sy/俺只是一个打酱油的; $str = iconv("GB2312",UTF-8,$str); $str = urlencode($str);?>//js decodeURIComponent 貌似对GB2312编码的格式不识别,必须转为utf-8才能够而后倘若字符串中有空格的 就转为 + 号了<html> <script> var ds = <?php echo $str;?>; var dddd= decodeURIComponent (ds); alert(dddd);</script></html>

7.试阐述Memcache的key多节点分布的算法?当任一节点显现故障时PHP的Memcache客户端将怎样处置?怎样保证Memcache数据读写操作的原子性?

答:

原理:一致性hash          

原子性

原子性会引起的问题:简单的说便是A,B皆想操作key1,而后都在key1上增多自己的信息,就会有问题

memcached是原子的吗?

宏观

所有的被发送到memcached的单个命令是完全原子的。倘若您针对同一份数据同期发送了一个set命令和一个get命令,它们不会影响对方。它们将被串行化、先后执行。即使在多线程模式,所有的命令都是原子的;命令序列不是原子的。倘若经过get命令获取了一个item,修改了它,而后想把它set回memcached,咱们保准这个item被其他进程(process,未必是操作系统中的进程)操作过。在并发的状况下,您可能覆写了一个被其他进程set的item。

memcached 1.2.5以及更高版本,供给了gets和cas命令,它们能够处理上面的问题。倘若运用gets命令查找某个key的item,memcached会 给您返回该item当前值的独一标识。倘若您覆写了这个item并想把它写回到memcached中,您能够经过cas命令把那个独一标识一块发送给 memcached。倘若该item存放在memcached中的独一标识与您供给的一致,您的写操作将会成功。倘若另一个进程在这时期修改了这个 item,那样该item存放在memcached中的独一标识将会改变,您的写操作就会失败。

8.怎样实现PHP的安全最大化?怎么样避免SQL注入漏洞和XSS跨站脚本攻击漏洞?

答:

基本原则:不对外界展示服务器或程序设计细节(屏蔽错误),不相信任何用户提交的数据(过滤用户提交)

1)屏蔽错误,将display_errors 设置为off

2)过滤用户提交参数,这儿需要重视的是不可仅仅经过浏览器端的验证,还需要经过服务器端的过滤

这儿是需要重视最多的地区由于所有用户提交的数据入口都在这儿,这是过滤数据的第1步。

思虑是不是过滤select,insert,update,delete,drop,create等直接操作数据的命令语句

运用addslashes 将所有特殊字符过滤

打开magic_quotes_gpc,开启该参数数后自动将sql语句转换,将 转换成  \

3)能够思虑设置统一入口,只准许用户经过指定的入口拜访不可拜访未经许可的文件等内容

4)能够思虑对安全性需求高的文件进行源自验证,例如想要执行b.php必须先执行a.php,能够在b.php中判断来自a.php的referer,避免用户直接执行b.php

2、系统关联部分

1.请简述Linux/BSD系统下进程间通讯的方式有那些,并详细说明在PHP下怎样实现

答:

管道(Pipe)及有名管道(namedpipe):管道可用于拥有亲缘关系进程间的通信,有名管道克服了管道名字的限制,因此呢,除拥有管道所拥有的功能外,它还准许无亲缘关系进程间的通信;

信号(Signal):信号是比较繁杂的通信方式,用于通告接受进程有某种事件出现,除了用于进程间通信外,进程还能够发送信号给进程本身;linux除了支持Unix初期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实质上,该函数是基于BSD的,BSD为了实现靠谱信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);

报文(Message)队列(信息队列):信息队列是信息的链接表,包含Posix信息队列systemV信息队列。有足够权限的进程能够向队列中添加信息,被赋予读权限的进程则能够读走队列中的信息信息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区体积受限等缺点。

共享内存:使得多个进程能够拜访一起内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。常常与其它通信机制,如信号量结合运用,来达到进程间的同步及互斥。

信号量(semaphore):重点做为进程间以及同一进程区别线程之间的同步手段。

套接口(Socket):更为通常的进程间通信机制,可用于区别设备之间的进程间通信。起初是由于Unix系统的BSD分支研发出来的,但此刻通常能够移植到其它类Unix系统上:Linux和SystemV的变种都支持套接字。

2.为何显现僵死进程(孤儿进程)?怎么样查看僵死进程?怎样处理僵死进程问题?

答:

僵尸进程:一个进程运用fork创建子进程,倘若子进程退出,而父进程并调用wait或waitpid获取子进程的状态信息,那样子进程的进程描述符仍然保留在系统中。这种进程叫作之为僵死进程。

查看:运用ps aux

删除:ps aux | grep -e ‘^ [Zz]’ | awk ‘{print $2}’ | xargs kill -9

3.请描述Apache 2.x版本的MPM(Multi-Processing Module)机制,并详细说明在区别的MPM机制下怎样支持PHP?

答:

常用的应该就仅有3个:worker、prefork、perchild

prefork:在功能上便是运用Apache的运行方式,一个父进程,而后按照设置以及连接状况生成相应的子进程数。这种模式靠谱性和健壮性都是最好的。然则在性能上,开销过大。达不到咱们这些“吸血鬼”的需求了_。倘若连接数太多的话,会引起咱们没法远程登陆,必定要等到连接数下降后才可连接,这是最让我头痛的事情。

worker:混合线程/进程的MPM。一个父进程,后面是带有线程的子进程。每一个子进程的线程数是固定且相同的。这是最“平庸”的一个模式,但运用人最多的一种模式。由于它性能等各方面比较平衡。性能上要比prefork好有些,只是牺牲了一点点的健壮性和靠谱罢了通常举荐运用这个选项。

perchild:是混合线程/进程的MPM。当起步perchild MPM时,它会创立指定数量的子进程,且每一个子进程都拥有指定数量的线程,如负载增多了,那它不会创立新的进程(子进程是固定的),只是在子进程下创立新的线程。它还有一个特点便是能够为每一个子进程配置区别的用户和组。能够每一个虚拟主机指定一个子进程。这种模式性能是最佳的,然则靠谱性和健壮性就相对是最差的。各取所需,我个人觉得这种模式不错,倘若不消第三方的模块的话_。

4.请简述PHP在Apache下的几种运行方式并加以比较?怎样让PHP在Linux+Apache下以Fast CGI方式运行?

答:

php在apache有3中运行方式:CGI模式、FastCGI模式、Apache 模块DLL。

比较:

Cgi模式和模块dll加载方式比较:

Cgi模式下,apache调用外边执行器php.exe执行php代码,并将解释后生成的html代码和原html整合,再传递给apache服务器,其在执行时每次都需要重新解析php.ini、重新载入所有dll扩展并重初始化所有数据结构,运行速度非常慢,但由于外边加载执行器,php代码执行出错不会引起apache崩溃。

在模块化(DLL)中,PHP是与Web服务器一块起步并运行的。因此从某种方向来讲,以apache模块方式安装的 PHP4有着比CGI模式更好的安全性以及更好的执行效率和速度。

Cgi和fastcgi模式比较:

Fastcig是cgi的升级版,Cgi和fastcgi工作模式大抵相同,但fastcgi模式中fastcgi的进程管理器可用来管理cgi解释器,该管理器在cgi解释器完成请求后,会处在挂起状态,用以等待接下来的请求,由于向比较cgi每次都需要重新解析php.ini、重新载入所有dll扩展并重初始化所有数据结构,fastcig模式显著要快非常多

5.请写出让PHP能够在命令行下以脚本方式执行时安装PHP所必须指定的configure参数,并说明怎样在命令行下运行PHP脚本(写出两种方式)同期向PHP脚本传递参数?

答:

因为 –enable-cli 和 –enable-cgi 同期默认有效,因此呢,不必再配置行中加上 –enable-cli 来使得 CLI 在 make install 过程中被拷贝到 {PREFIX}/bin/php

php -f “index.php”php -r “print_r(get_defined_constants());”

试题二:

1、请列举你能想到的UNIX信号,并说明信号用途。

答:

Unix信号量能够在文件/usr/include/sys/signal.h中查看

SIGHUP 进程由於掌控终端死去掌控终端发出起命令

SIGINT 键盘中断所产生的信号

SIGQUIT 键盘终止

2、请列举、你能想到的所有的字符串查询算法,并加注释简单说明。

答:

次序查询

二分查询

分块查询

哈希表查询

3、有一个IP位置(192.168.0.1),请写出其32位无符号整数形式。

答:

此题是将十进制转换成二进制 采用取余法就可很简单 答案是:11000000.10101000.00000000.00000001 千万不可只记答案哦

4、写出、你能想到的所有HTTP返回状态值,并说明用途例如:返回404暗示找不到页面)

答:

200 (成功) 服务器已成功处理了请求。一般,这暗示服务器供给了请求的网页。

301 (永久移动) 请求的网页已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。

302 (临时移动) 服务器日前区别位置的网页响应请求,但请求者应继续运用原有位置来进行以后的请求。

401 (未授权) 请求需求身份验证。针对需要登录的网页,服务器可能返回此响应。

403 (禁止) 服务器拒绝请求。

404 (未找到) 服务器找不到请求的网页。

500 (服务器内部错误) 服务器遇到错误,没法完成请求。

501 (尚未实施) 服务器不具备完成请求的功能。例如,服务器没法识别请求办法时可能会返回此代码。

502 (错误网关) 服务器做为网关或代理,从上游服务器收到无效响应。

503 (服务不可用) 服务器日前没法运用因为超载或停机守护)。一般,这只是暂时状态。

504 (网关超时) 服务器做为网关或代理,然则即时从上游服务器收到请求。

505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。

基本任务-选作(会得到额外分数):

画几个你最熟练的SERVER端模型出来(格式不重要,尽可能将图画清楚,说明思路就可

进阶任务:

1、PHP的垃圾收集机制是怎么样的?

说明:

1)倘若,你熟练PHP源码,那样请从源码入手,回答些问题,会得到额外加分

2)倘若,你不熟练PHP源码,那样尽你所能,多写点东西,包含利用自己的编程直觉得到的信息,都能够

3)对,则有分,错误不扣,不写无分。

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

2、请写出HTTP头,并符合以下需求

1)这是一个post请求

2)目的:http://www.example.com:8080/test

3)POST变量:

username: test

pwd: test2

intro: Hello world!

4)包括以下COOKIE信息:

cur_query: you&me

说明:

1)倘若,你记不得某个HTTP协议中的指令字了,那样,无奈这举是用“汉字”代替。

2)倘若,你能记住更加多的HTTP协议指令字,那样多写几句,总是没坏处,对吧?

3)最关键的,只需要画出正确的“轮廓”(还记得httpwatch等工具打印出来的头部吗?那便是“轮廓”的含义),会有分数,但倘若,连“轮廓”都写错了,那样就很遗憾了。

答:

Accept: text/html 能够接受的数据类型Accept-Encoding: gzip 接受的压缩类型Accept-Language: zh-CN 接受语言Cache-Control: no-cache 是不是有缓存Connection : keep-alive 是不是保持链接Host:http://www.example.com:8080/testCookie:intro=Hello world!Content-Disposition: form-data; username=”test”&pwd=”test2”&intro=”hello world!”User-Agent: 浏览器信息Referer: 前一个页面位置

编程任务:

咱们碰到了大麻烦,一个新来的传教士惹恼了上帝,上帝很愤怒,需求咱们把圣经(bbe.txt)背熟,直至他说哪个单词,咱们就要飞快的回答出这个单词在第几行第几个单词位置。听说你是个优秀的程序员,那么帮忙咱们完成这个不可能的任务吧。

需求如下:

1)/myworks/example/bbe.txt,98版本英文圣经一本

2)输入部分需求如下:php ./example.php [单词]

3)输出部分如下:[单词] 1,2 2,4 5,6 暗示:此单词在1行2列(第二个单词),2行4列…

说明:

1)此文本4MB之巨…

2)单词的含义:由英文字母(体积写),数字(0-9)构成的串

3)供给给你的设备OS为ubuntu 9.10,内存仅有1G,况且,很不幸的,其中700M用来做了别的

4)上机考试不准许上网,但我装了man文档以及读取CHM以及PDF的阅读器,在电脑的桌面的CHM文件夹中,有相应的PHP参考手册

5)算法繁杂需求不可大于O(N^2)(便是N的平方)

6)什么?PHP低效且用起来不顺手,好的,你能够用别的语言来实现。但重视供给给你的设备仅有python 2.4/perl 5.8/gcc[g++] 4.1

答:

两份答案感觉还能够

 bbe.txt文件咱们 想像成是 空格 隔开的算了

hello123 hello tim jasonwoaini1 tianjianxiong333 hh aaa/* 此文件用于按照bbe.txt文件对所有单词创建索引,相当于一次预处理 */ ini_set(display_errors,on);set_time_limit(0);$file = file($src); // 数组foreach($file as $i => &$ls){ $a = explode(" ",$ls); $len = count($a); if ($len > 0){ for($j=0;$i<$len;$j++){$data = "此单词".$a[$j]."在".($i+1)."行,".($j+1)."列"; $key = md5(trim(strtolower($a[$j]))); file_put_contents($key,$data); } } //echo $i.". > ".$ls.<br />;}example.php:#!/usr/local/bin/php -q <?phpset_time_limit(0); $getkey=empty($argv[1]) ? $_REQUEST[k] : $argv[1];$arr = explode(",",$getkey); $len = count($arr);if($len > 0){for($i=0;$i<$len;$i++){ echo getKey($arr[$i])."\n"; }}functuion getKey($key){ $str = "找到此单词[".$key."]"; if($key){ $fc = md5($key); $str = file_get_contents($fc)); }return $str;}?>

别人的办法

1)运用ascii码,判断字符所在范围

2)只要扫描一遍字符就可繁杂度为O(N)

3)利用了php string{$i} 的特性,取字符串内任一字符

4)todo:改为fgetc版本,能够完全不需要运用以上php特性

5)字符串匹配算法:http://wendell07.blog.hexun.com/14112681_d.html,日前看来最快的办法:Sunday,因为本题是单词匹配,问题更简单,只要找到头尾……

$word = $argv[1];$lines = 0;$handle = @fopen("bbe.txt", "r");if ($handle) { while(!feof($handle)) { $line = fgets($handle, 4096); $local = local_word($line, $word); $lines++; if( !empty($local) ){ echo "$lines,".implode(,$local)."\n"; } }fclose($handle);}function local_word($line, $word){ $local = array(); $local_length = 1; $word_length = strlen($word); for($i = 0; ( $char = $line{$i} ) !== ; $i++ ){ // 单词最后一个字符必定不是符号,且必有一个符号结尾,此计为一个新词 if( !is_symbel( $line{ $i-1 } ) && is_symbel($char) ){ $local_length++; } if( $char === $word[0] && // 倘若第1个字符相同is_symbel( $line{ $i-1 } ) && // 且为单词起始 is_symbel( $line{ $i+$word_length }) // 单词结尾应该为符号 ){ // 进入验证单词模式,一个一个字符比对 for($j = 1; ($w_char = $word{$j}) !== ; $j++ ){ // 遇到单词字符不匹配 if( $w_char != $line{ $i+$j } ){ $i += $j; break; } // 倘若单词比对完全正确 if( $j == ($word_length-1) ){ //echo "$line_length, $word_length\n";$local[] = $local_length; } } } } return $local;}function is_symbel($char){ $asc = ord($char); return !( (48 <= $asc && $asc <= 57) || (65 <= $asc && $asc <= 90) || (97<= $asc && $asc <=122) );}倘若你经常参加面试的话,你就会发掘几乎所有的面试开场白都是进行自我介绍,这是由于一方面面试官是刚从HR那里得到你的信息的,面试之前他可能不太认识你的详细信息,因此期盼经过自我介绍这个环节,认识一下你的过往经历,还有便是他利用这个时间看下你的简历。经过三面、四面后几家机构等到了百度offer,下面我把面试的过程和有些面试题分享给大众,整理的PDF目录如下:

说实话我并不是那种别人一看就很爱好的工程师,由于始终在小机构做个小架构,因此适合我的职位范围相对来讲很窄。

不外不碍事,跳出舒适区看一下其他风景,我感觉对我来讲是一件好事。

便是这条街最靓滴仔!!!

ENDPHP开源社区

扫描关注  进入”PHP资料“

免费获取进阶

面试、文档、视频资源





上一篇:学习PHP要找对自己有用的学习方式,不要一味的用别人的学习办法
下一篇:从PHP到Node,聊一聊淘宝首页背面的技术
回复

使用道具 举报

2996

主题

3万

回帖

9910万

积分

论坛元老

Rank: 8Rank: 8

积分
99109194
发表于 2024-10-22 04:46:18 | 显示全部楼层
感谢楼主分享,祝愿外链论坛越办越好!
回复

使用道具 举报

2996

主题

3万

回帖

9910万

积分

论坛元老

Rank: 8Rank: 8

积分
99109194
发表于 2024-10-27 16:55:20 | 显示全部楼层
你的见解独到,让我受益匪浅,非常感谢。
回复

使用道具 举报

3069

主题

3万

回帖

9913万

积分

论坛元老

Rank: 8Rank: 8

积分
99138952
发表于 4 天前 | 显示全部楼层
楼主果然英明!不得不赞美你一下!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|天涯论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-23 01:07 , Processed in 0.161443 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.