sis最新ip地址2020入口一_2020最新大厂内部 PHP 高级工程师面试题汇总(一)
1、給你四個(gè)坐標(biāo)點(diǎn),判斷它們能不能組成一個(gè)矩形,如判斷 ([0,0],[0,1],[1,1],[1,0]) 能組成一個(gè)矩形。
我們分析這道題, 給4個(gè)標(biāo)點(diǎn),判斷是否矩形
高中知識(shí),矩形有4條邊,兩兩相等, 矩形兩條對(duì)角線相等, 矩形的長(zhǎng)短邊與對(duì)角線滿足勾股定理。
故解題思路為,根據(jù)坐標(biāo)點(diǎn),
列出所有的兩點(diǎn)組合邊長(zhǎng)的數(shù)組,去重,看是不是只剩 3個(gè)長(zhǎng)度(注意正方形2個(gè)長(zhǎng)度)
判斷是否滿足勾股定理
調(diào)優(yōu)一下,先判斷有沒有重復(fù)的點(diǎn),有的話肯定不是矩形
代碼如下:
<?phpfunction 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、寫一段代碼判斷單向鏈表中有沒有形成環(huán),如果形成環(huán),請(qǐng)找出環(huán)的入口處,即 P 點(diǎn)
/**單鏈表的結(jié)點(diǎn)類*/ class LNode{//為了簡(jiǎn)化訪問單鏈表,結(jié)點(diǎn)中的數(shù)據(jù)項(xiàng)的訪問權(quán)限都設(shè)為publicpublic int data;public LNode next; }class LinkListUtli {//當(dāng)單鏈表中沒有環(huán)時(shí)返回null,有環(huán)時(shí)返回環(huán)的入口結(jié)點(diǎn)public static LNode searchEntranceNode(LNode L){LNode slow=L;//p表示從頭結(jié)點(diǎn)開始每次往后走一步的指針LNode fast=L;//q表示從頭結(jié)點(diǎn)開始每次往后走兩步的指針while(fast !=null && fast.next !=null) {if(slow==fast) break;//p與q相等,單鏈表有環(huán)slow=slow.next;fast=fast.next.next;}if(fast==null || fast.next==null) return null;// 重新遍歷,尋找環(huán)的入口點(diǎn)slow=L;while(slow!=fast){slow=slow.next;fast=fast.next;}return slow;} }3、寫一個(gè)函數(shù),獲取一篇文章內(nèi)容中的全部圖片,并下載
function download_images($article_url = '', $image_path = 'tmp'){// 獲取文章類容$content = file_get_contents($article_url);// 利用正則表達(dá)式得到圖片鏈接$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]);// 創(chuàng)建路徑$dir = getcwd() . DIRECTORY_SEPARATOR .$image_path;mkdir(iconv("UTF-8", "GBK", $dir), 0777, true);foreach($pic_url_array as $pic_url){// 獲取文件信息$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、獲取當(dāng)前客戶端的 IP 地址,并判斷是否在(111.111.111.111,222.222.222.222)
如果沒有使用代理服務(wù)器:
$ip = $_SERVER['REMOTE_ADDR'];使用透明代理
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];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 點(diǎn)訪問量做多的 20 個(gè) url 地址?
6、什么是 CSRF 攻擊?XSS 攻擊?如何防范?
CSRF:跨站請(qǐng)求偽造,可以通過通過判斷來源和加 Token 的方式來防范。
XSS:跨站腳本攻擊,可以通過對(duì)內(nèi)容轉(zhuǎn)義和過濾來防范,還有 CSP
7、應(yīng)用中我們經(jīng)常會(huì)遇到在 user 表隨機(jī)調(diào)取 10 條數(shù)據(jù)來展示的情況,簡(jiǎn)述你如何實(shí)現(xiàn)該功能。
SELECT * FROM `table` WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) ORDER BY id LIMIT 1;8、從撲克牌中隨機(jī)抽 5 張牌,判斷是不是一個(gè)順子,即這 5 張牌是連續(xù)的
這個(gè)問題有個(gè)關(guān)鍵點(diǎn),撲克牌,1-13 不能再多了。這就很簡(jiǎn)單了。用 PHP 來做,定義一個(gè)數(shù)組分別存著 1 到 13, 拿出一個(gè),置空一個(gè),最后看下 這五個(gè)置空的 是不是連續(xù)的。這種情況不考慮抽出的順序。
9、兩條相交的單向鏈表,如何求它們的第一個(gè)公共節(jié)點(diǎn)
思想:
- 如果兩個(gè)鏈表相交,則從相交點(diǎn)開始,后面的節(jié)點(diǎn)都相同,即最后一個(gè)節(jié)點(diǎn)肯定相同;
- 從頭到尾遍歷兩個(gè)鏈表,并記錄鏈表長(zhǎng)度,當(dāng)二者的尾節(jié)點(diǎn)不同,則二者肯定不相交;
- 尾節(jié)點(diǎn)相同,如果 A 長(zhǎng)為 LA,B 為 LB,如果 LA>LB, 則 A 前 LA-LB 個(gè)先跳過
10、最長(zhǎng)公共子序列問題 LCS,如有 [1,2,5,11,32,15,77] 和 [99,32,15,5,1,77] 兩個(gè)數(shù)組,找到它們共同都擁有的數(shù),寫出時(shí)間復(fù)雜度最優(yōu)的代碼,不能用 array_intersect(這里有坑,需要去研究一下動(dòng)態(tài)規(guī)劃)。
11、linux 的內(nèi)存分配和多線程原理
12、MYSQL 中主鍵與唯一索引的區(qū)別
主鍵:絕對(duì)不能有空值。唯一索引:可以有空值
13、http 與 https 的主要區(qū)別
關(guān)鍵是 S 上。簡(jiǎn)而言之,https 建立連接后要先把 SSL 的證書發(fā)下去,有了公鑰和私鑰,就可以解密了。
14、http 狀態(tài)碼及其含意
- 200 請(qǐng)求已成功,請(qǐng)求所希望的響應(yīng)頭或數(shù)據(jù)體將隨此響應(yīng)返回。
- 301 被請(qǐng)求的資源已永久移動(dòng)到新位置。
- 302 請(qǐng)求的資源現(xiàn)在臨時(shí)從不同的 URI 響應(yīng)請(qǐng)求。
- 400 1、語義有誤,當(dāng)前請(qǐng)求無法被服務(wù)器理解。2、請(qǐng)求參數(shù)有誤。
- 401 當(dāng)前請(qǐng)求需要用戶驗(yàn)證。
- 403 服務(wù)器已經(jīng)理解請(qǐng)求,但是拒絕執(zhí)行它。
- 404 請(qǐng)求失敗,請(qǐng)求所希望得到的資源未被在服務(wù)器上發(fā)現(xiàn)。
- 500 服務(wù)器遇到了一個(gè)未曾預(yù)料的狀況,無法完成對(duì)請(qǐng)求的處理,會(huì)在程序碼出錯(cuò)時(shí)出現(xiàn)。
- 501 服務(wù)器不支持當(dāng)前請(qǐng)求所需要的某個(gè)功能。無法識(shí)別請(qǐng)求的方法。
- 502 作為網(wǎng)關(guān)或者代理工作的服務(wù)器嘗試執(zhí)行請(qǐng)求時(shí),從上游服務(wù)器接收到無效的響應(yīng)。
- 503 由于臨時(shí)的服務(wù)器維護(hù)或者過載,服務(wù)器當(dāng)前無法處理請(qǐng)求。
15、linux 中怎么查看系統(tǒng)資源占用情況
top、htop、free、uptime
16、SQL 注入的原理是什么?如何防止 SQL 注入
原理:第一 SQL 本身有問題(這個(gè)不是主要問題)。第二你寫的 SQL 很有問題(這是最主要的)
防范:第一,絕對(duì)不要相信用戶輸入的任何東西。第二,預(yù)編譯。現(xiàn)在的框架一般都會(huì)有 SQL 過濾的。
17、isset (null) isset (false) empty (null) empty (false) 輸出
PHP 入門問題,isset 和 empty 的區(qū)別
分別是 false, true, true, true
18、優(yōu)化 MYSQL 的方法
第一,數(shù)據(jù)超過一定數(shù)量或者體積,請(qǐng)拆分表,垂直或者水平分(最有效果的優(yōu)化)
第二,務(wù)必有自增主鍵。通過自增主鍵來查數(shù)據(jù)是最快的。
第三,常用的查詢字段建立聯(lián)合索引,寫 SQL 一定要尊從最左原則,用到這個(gè)索引。
第四,不要把邏輯運(yùn)算放到 sql 里。言外之意是,不要寫太復(fù)雜的 SQL,你能寫復(fù)雜的 SQL 你肯定也能通過 PHP 實(shí)現(xiàn)。
19、數(shù)據(jù)庫中的事務(wù)是什么?
事務(wù)(transaction)是作為一個(gè)單元的一組有序的數(shù)據(jù)庫操作。如果組中的所有操作都成功,則認(rèn)為事務(wù)成功,即使只有一個(gè)操作失敗,事務(wù)也不成功。如果所有操作完成,
事務(wù)則提交,其修改將作用于所有其他數(shù)據(jù)庫進(jìn)程。如果一個(gè)操作失敗,則事務(wù)將回滾,該事務(wù)所有操作的影響都將取消。
20、寫一個(gè)函數(shù),盡可能高效的從一個(gè)標(biāo)準(zhǔn) URL 中取出文件的擴(kuò)展名
會(huì) 寫正則最好。
21、參數(shù)為多個(gè)日期時(shí)間的數(shù)組,返回離當(dāng)前時(shí)間最近的那個(gè)時(shí)間
遍歷數(shù)組,求當(dāng)前時(shí)間差,和第一個(gè)進(jìn)行對(duì)比,小于第一個(gè)交換位置。最后取第一個(gè)即可。
22、echo、print、print_r 的區(qū)別
這三個(gè)放在一起,回答的點(diǎn)在于,print_r 是函數(shù),echo、print 是結(jié)構(gòu)語言。
至于他們具體的區(qū)別參考:https://www.cnblogs.com/xiaotaoing/p/66873...
23、http 協(xié)議的 header 中有哪些 key 及含義
這個(gè)問題,很難。一會(huì)半會(huì)說不清楚。如果做過 PHP restful 接口開發(fā),也踩過這里面的坑,那應(yīng)該是可以答出來常用的幾個(gè) KEY 的。
24、二叉樹前中后遍歷代碼
- 層序遍歷
- 先序遍歷
- 中序遍歷
- 后序遍歷
25、PHP 的數(shù)組和 C 語言的數(shù)組結(jié)構(gòu)上有何區(qū)別?
但從 PHP 來講,考的是 PHP 數(shù)組的實(shí)現(xiàn)。可以簡(jiǎn)單的認(rèn)為,PHP 的數(shù)組是 hash 桶 + 十字鏈表(實(shí)際上是數(shù)列 Array,列表 List,散列表 / 關(guān)聯(lián)數(shù)組 / 字典 Hashtable 的聚合體)。優(yōu)點(diǎn)是查詢效率很高,遍歷很方便,缺點(diǎn)是,占內(nèi)存較多。(還是空間換時(shí)間的思路,畢竟現(xiàn)在內(nèi)存又不值錢)
C 語言的數(shù)組,就是定長(zhǎng)定類型的數(shù)列。
26、Redis 的跳躍表怎么實(shí)現(xiàn)的
跳躍表 (skiplist) 是一種有序數(shù)據(jù)結(jié)構(gòu),它通過在每個(gè)節(jié)點(diǎn)中維持多個(gè)指向其他節(jié)點(diǎn)的指針,從而達(dá)到快速訪問節(jié)點(diǎn)的目的。
27、哈希是什么?hash 沖突后,數(shù)據(jù)怎么存?
28、聚簇索引,聚集索引的區(qū)別?
29、B+Tree 是怎么進(jìn)行搜索的
30、數(shù)組和 hash 的區(qū)別是什么?
31、寫個(gè)函數(shù),判斷下面擴(kuò)號(hào)是否閉合,左右對(duì)稱即為閉合: ((())),)(()),(()))),(((((()),(()()),()()
32、 找出數(shù)組中不重復(fù)的值 [1,2,3,3,2,1,5]
用普通方法,肯定很容易的。
33、32 題你的時(shí)間復(fù)雜度是多少?有的情況下,你寫了個(gè)算法,然后面試官會(huì)讓你把你的算法的時(shí)間復(fù)雜度表達(dá)式寫出來
34、PHP 的的這種弱類型變量是怎么實(shí)現(xiàn)的?
考 zval 的,PHP 的八種類型,本質(zhì)只有一個(gè)結(jié)構(gòu)。
35、在 HTTP 通訊過程中,是客戶端還是服務(wù)端主動(dòng)斷開連接?
三次握手和四次揮手,以及他們每步的狀態(tài)。
這個(gè)問題最好能一步到位回答的全面的。一般都是有客戶端告訴服務(wù)端,我這邊東西發(fā)完了,可以斷連接了么。但是如果客戶端發(fā)完 FIN 服務(wù)端沒有回復(fù),就會(huì)重試,直到超過超時(shí)時(shí)間,就斷了。服務(wù)端也一樣,超過時(shí)間,服務(wù)端就斷了。
36、PHP 中發(fā)起 http 請(qǐng)求有哪幾種方式?它們有何區(qū)別?
- GET
- POST
- HEAD
- PUT
- DELETE
- OPTIONS
- TRACE
- CONNECT
37、有一顆二叉樹,寫代碼找出來從根節(jié)點(diǎn)到 flag 節(jié)點(diǎn)的最短路徑并打印出來,flag 節(jié)點(diǎn)有多個(gè)。比如下圖這個(gè)樹中的 6 和 14 是 flag 節(jié)點(diǎn),請(qǐng)寫代碼打印 8、3、6 和 8、10、14 兩個(gè)路徑
典型的二叉搜索樹。大學(xué)數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)題。
38、有兩個(gè)文件文件,大小都超過了 1G,一行一條數(shù)據(jù),每行數(shù)據(jù)不超過 500 字節(jié),兩文件中有一部分內(nèi)容是完全相同的,請(qǐng)寫代碼找到相同的行,并寫到新文件中。PHP 最大允許內(nèi)內(nèi)為 255M。
將文件拆分成若干個(gè)小文件,根據(jù)內(nèi)容計(jì)算 hash 值,分散到不同文件。
39、請(qǐng)寫出自少兩個(gè)支持回調(diào)處理的 PHP 函數(shù),并自己實(shí)現(xiàn)一個(gè)支持回調(diào)的 PHP 函數(shù)
array_map,array_filter, array_walk
40、請(qǐng)寫出自少兩個(gè)獲取指定文件夾下所有文件的方法(代碼或思路)。
核心方法是 scandir, 核心思想是遞歸。
41、請(qǐng)寫出自少三種截取文件名后綴的方法或函數(shù)(PHP 原生函數(shù)和自己實(shí)現(xiàn)函數(shù)均可)
echo substr(strrchr($file, '.'), 1);echo substr($file, strrpos($file, '.')+1);$arr=explode('.', $file); echo $arr[count($arr)-1];$arr=explode('.', $file); echo end($arr);echo strrev(explode('.', strrev($file))[0]);echo pathinfo($file)['extension'];echo pathinfo($file, PATHINFO_EXTENSION);42、PHP 如何實(shí)現(xiàn)不用自帶的 cookie 函數(shù)為客戶端下發(fā) cookie。對(duì)于分布式系統(tǒng),如何來保存 session 值。
這個(gè)題有點(diǎn)繞。考的還是 COOKIE 和 SESSION 的基礎(chǔ)知識(shí)。服務(wù)端通過 set-cookie 命令來通知客戶端保存 cookie。
只要按照 domain path 過期時(shí)間等規(guī)則 用 header 函數(shù)就可以實(shí)現(xiàn)。
分布式系統(tǒng) session,集中處理。按我們公司的架構(gòu),為了實(shí)現(xiàn)高可用和高容災(zāi),提供一個(gè)分布式的驗(yàn)簽服務(wù)。具體的可以看下 redis 的分布式服務(wù)架構(gòu)。
43、請(qǐng)用 SHELL 統(tǒng)計(jì) 5 分鐘內(nèi),nginx 日志里訪問最多的 URL 地址,對(duì)應(yīng)的 IP 是哪些?
44、寫一段 shell 腳本實(shí)現(xiàn)備份 mysql 指定庫(如 test) 到指定文件夾并打包,并刪除 30 天前的備份,然后將新的備份推送到遠(yuǎn)端服務(wù)器,完成后送郵件通知。
45、mysql 數(shù)據(jù)庫中 innodb 和 myisam 引擎的區(qū)別
區(qū)別主要在數(shù)據(jù)和索引的存儲(chǔ)結(jié)構(gòu)和存儲(chǔ)方式上,以及對(duì)于事務(wù)的支持。
46、從用戶在瀏覽器中輸入網(wǎng)址并回車,到看到完整的見面,中間都經(jīng)歷了哪些過程。
入門問題。這個(gè)問題有一個(gè)很大的坑,面試官可能會(huì)從這個(gè)問題下手問你一大堆問題。
以 PHP 為例:通常最簡(jiǎn)單的回答,從用戶的電腦找到最近的 DNS 服務(wù),然后解析到對(duì)應(yīng)的 IP 然后雙方開始 HTTP 連接,然后發(fā)送請(qǐng)求信息,服務(wù)器拿到請(qǐng)求信息就開始準(zhǔn)備回應(yīng)的信息,中間要經(jīng)過 nginx 轉(zhuǎn)發(fā)到 frstCGI (PHP-FPM), 然后 PHP 開始解析框架,解析請(qǐng)求頭部,找到對(duì)應(yīng)的 API,該查數(shù)據(jù)庫查數(shù)據(jù),該組裝 HTML 組裝 HTML,完事了就重新返回給用戶。用戶拿到返回?cái)?shù)據(jù),瀏覽器開始渲染頁面,JS 開始加載。
47、如何分析一條 sql 語句的性能。
explain,具體的請(qǐng)百度。(基本很少用性能分析語句。MYSQL 的表設(shè)計(jì)上盡量冗余一部分字段,避免在 MYSQL 里處理大量的邏輯運(yùn)算。我們是做 PHP 服務(wù)開發(fā)的,mysql 語句能簡(jiǎn)單盡量簡(jiǎn)單。邏輯運(yùn)算的地方可以在 PHP 里做。)
48、ping 一個(gè)服務(wù)器 ping 不通,用哪個(gè)命令跟蹤路由包?
linux:traceroute,windows:tracert49、$a=[0,1,2,3]; $b=[1,2,3,4,5]; $a+=$b; var_dump ($a) 等于多少?
基礎(chǔ)問題。本質(zhì)還是考 PHP 數(shù)組的結(jié)構(gòu)和特點(diǎn)。
結(jié)果是 01235。PHP 用數(shù)字索引和 STRING 索引差別還是很大的
50、$a=[1,2,3]; foreach ($a as &$v){} foreach ($a as $v){} var_dump ($a) 等于多少;
122
此處有一坑。foreach 完之后,$index , $value 并不會(huì)消失保留最后一次賦值。
這里的第一次 foreach 之后,數(shù)組中最后一個(gè)元素變成引用,引用變量 $v 繼續(xù)存在且指向數(shù)組的最后一個(gè)元素。第二次遍歷,因?yàn)楸闅v變量名是 $v , 所以等于說每次遍歷都將此次遍歷的值修改成最后元素的值,直至到遍歷最后一個(gè)元素(引用元素),因?yàn)榇藭r(shí)數(shù)組的最后一個(gè)元素已被修改成上一個(gè)元素的值,最后一次賦值就是 自己 == 自己。 故最后一個(gè)等于倒數(shù)第二個(gè)
更多學(xué)習(xí)內(nèi)容可以訪問
阿布阿布:【對(duì)標(biāo)大廠】精品PHP架構(gòu)師教程目錄大全,只要你能看完保證薪資上升一個(gè)臺(tái)階(持續(xù)更新)??zhuanlan.zhihu.com以上內(nèi)容希望幫助到大家,很多PHPer在進(jìn)階的時(shí)候總會(huì)遇到一些問題和瓶頸,業(yè)務(wù)代碼寫多了沒有方向感,不知道該從那里入手去提升,對(duì)此我整理了一些資料,包括但不限于:分布式架構(gòu)、高可擴(kuò)展、高性能、高并發(fā)、服務(wù)器性能調(diào)優(yōu)、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優(yōu)化、shell腳本、Docker、微服務(wù)、Nginx等多個(gè)知識(shí)點(diǎn)高級(jí)進(jìn)階干貨需要的可以免費(fèi)分享給大家,需要的可以加入我的PHP技術(shù)交流群953224940
進(jìn)階PHP月薪30k>>>架構(gòu)師成長(zhǎng)路線【視頻、面試文檔免費(fèi)獲取】?shimo.im總結(jié)
以上是生活随笔為你收集整理的sis最新ip地址2020入口一_2020最新大厂内部 PHP 高级工程师面试题汇总(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谷歌google安装vue插件,(npm
- 下一篇: drupal 8 php filter,