PHP 高級面試115題匯總(含答案)

1、給你四個坐標(biāo)點,判斷它們能不能組成一個矩形,如判斷 ([0,0],[0,1],[1,1],[1,0]) 能組成一個矩形。

勾股定理,矩形是對角線相等的四邊形。只要任意三點不在一條直線上,任選一點,求這一點到另外三點的長度的平方,兩個短的之和如果等于最長的,那么這就是矩形。

2、寫一段代碼判斷單向鏈表中有沒有形成環(huán),如果形成環(huán),請找出環(huán)的入口處,即 P 點

/*

*單鏈表的結(jié)點類

*/

class LNode{

? ? //為了簡化訪問單鏈表,結(jié)點中的數(shù)據(jù)項的訪問權(quán)限都設(shè)為public

? ? public int data;

? ? public LNode next;

}

class LinkListUtli {

? ? //當(dāng)單鏈表中沒有環(huán)時返回null,有環(huán)時返回環(huán)的入口結(jié)點

? ? public static LNode searchEntranceNode(LNode L)

? ? {

? ? ? ? LNode slow=L;//p表示從頭結(jié)點開始每次往后走一步的指針

? ? ? ? LNode fast=L;//q表示從頭結(jié)點開始每次往后走兩步的指針

? ? ? ? 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)的入口點

? ? ? ? slow=L;

? ? ? ? while(slow!=fast)

? ? ? ? {

? ? ? ? ? ? slow=slow.next;

? ? ? ? ? ? fast=fast.next;

? ? ? ? }

? ? ? ? return slow;

? ? }

}

3、寫一個函數(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 點訪問量做多的 20 個 url 地址?

6、什么是 CSRF 攻擊?XSS 攻擊?如何防范?

CSRF:跨站請求偽造,可以通過通過判斷來源和加 Token 的方式來防范。

XSS:跨站腳本攻擊,可以通過對內(nèi)容轉(zhuǎn)義和過濾來防范,還有 CSP

7、應(yīng)用中我們經(jīng)常會遇到在 user 表隨機調(diào)取 10 條數(shù)據(jù)來展示的情況,簡述你如何實現(xiàn)該功能。

SELECT * FROM `table` WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) ORDER BY id LIMIT 1;

8、從撲克牌中隨機抽 5 張牌,判斷是不是一個順子,即這 5 張牌是連續(xù)的

這個問題有個關(guān)鍵點,撲克牌,1-13 不能再多了。這就很簡單了。用 PHP 來做,定義一個數(shù)組分別存著 1 到 13, 拿出一個,置空一個,最后看下 這五個置空的 是不是連續(xù)的。這種情況不考慮抽出的順序。

9、兩條相交的單向鏈表,如何求它們的第一個公共節(jié)點

思想:

如果兩個鏈表相交,則從相交點開始,后面的節(jié)點都相同,即最后一個節(jié)點肯定相同;

從頭到尾遍歷兩個鏈表,并記錄鏈表長度,當(dāng)二者的尾節(jié)點不同,則二者肯定不相交;

尾節(jié)點相同,如果 A 長為 LA,B 為 LB,如果 LA>LB, 則 A 前 LA-LB 個先跳過

如果兩個單向鏈表有公共的結(jié)點,也就是說兩個鏈表從某一結(jié)點開始,它們的 m_pNext 都指向同一個結(jié)點。但由于是單向鏈表的結(jié)點,每個結(jié)點只有一個 m_pNext,因此從第一個公共結(jié)點開始,之后它們所有結(jié)點都是重合的,不可能再出現(xiàn)分叉。所以,兩個有公共結(jié)點而部分重合的鏈表,拓?fù)湫螤羁雌饋硐褚粋€ Y,而不可能像 X。

10、最長公共子序列問題 LCS,如有 [1,2,5,11,32,15,77] 和 [99,32,15,5,1,77] 兩個數(shù)組,找到它們共同都擁有的數(shù),寫出時間復(fù)雜度最優(yōu)的代碼,不能用 array_intersect(這里有坑,需要去研究一下動態(tài)規(guī)劃)。

11、linux 的內(nèi)存分配和多線程原理

12、MYSQL 中主鍵與唯一索引的區(qū)別

主鍵:絕對不能有空值。唯一索引:可以有空值

13、http 與 https 的主要區(qū)別

關(guān)鍵是 S 上。簡而言之,https 建立連接后要先把 SSL 的證書發(fā)下去,有了公鑰和私鑰,就可以解密了。

14、http 狀態(tài)碼及其含意

200 請求已成功,請求所希望的響應(yīng)頭或數(shù)據(jù)體將隨此響應(yīng)返回。

301 被請求的資源已永久移動到新位置。

302 請求的資源現(xiàn)在臨時從不同的 URI 響應(yīng)請求。

400 1、語義有誤,當(dāng)前請求無法被服務(wù)器理解。2、請求參數(shù)有誤。

401 當(dāng)前請求需要用戶驗證。

403 服務(wù)器已經(jīng)理解請求,但是拒絕執(zhí)行它。

404 請求失敗,請求所希望得到的資源未被在服務(wù)器上發(fā)現(xiàn)。

500 服務(wù)器遇到了一個未曾預(yù)料的狀況,無法完成對請求的處理,會在程序碼出錯時出現(xiàn)。

501 服務(wù)器不支持當(dāng)前請求所需要的某個功能。無法識別請求的方法。

502 作為網(wǎng)關(guān)或者代理工作的服務(wù)器嘗試執(zhí)行請求時,從上游服務(wù)器接收到無效的響應(yīng)。

503 由于臨時的服務(wù)器維護(hù)或者過載,服務(wù)器當(dāng)前無法處理請求。

15、linux 中怎么查看系統(tǒng)資源占用情況

top、htop、free、uptime

16、SQL 注入的原理是什么?如何防止 SQL 注入

原理:第一 SQL 本身有問題(這個不是主要問題)。第二你寫的 SQL 很有問題(這是最主要的)

防范:第一,絕對不要相信用戶輸入的任何東西。第二,預(yù)編譯。現(xiàn)在的框架一般都會有 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ù)量或者體積,請拆分表,垂直或者水平分(最有效果的優(yōu)化)

第二,務(wù)必有自增主鍵。通過自增主鍵來查數(shù)據(jù)是最快的。

第三,常用的查詢字段建立聯(lián)合索引,寫 SQL 一定要尊從最左原則,用到這個索引。

第四,不要把邏輯運算放到 sql 里。言外之意是,不要寫太復(fù)雜的 SQL,你能寫復(fù)雜的 SQL 你肯定也能通過 PHP 實現(xiàn)。

19、數(shù)據(jù)庫中的事務(wù)是什么?

事務(wù)(transaction)是作為一個單元的一組有序的數(shù)據(jù)庫操作。如果組中的所有操作都成功,則認(rèn)為事務(wù)成功,即使只有一個操作失敗,事務(wù)也不成功。如果所有操作完成,

事務(wù)則提交,其修改將作用于所有其他數(shù)據(jù)庫進(jìn)程。如果一個操作失敗,則事務(wù)將回滾,該事務(wù)所有操作的影響都將取消。

20、寫一個函數(shù),盡可能高效的從一個標(biāo)準(zhǔn) URL 中取出文件的擴展名

會 寫正則最好。我反正不會正則,需要用的時候就百度。

21、參數(shù)為多個日期時間的數(shù)組,返回離當(dāng)前時間最近的那個時間

遍歷數(shù)組,求當(dāng)前時間差,和第一個進(jìn)行對比,小于第一個交換位置。最后取第一個即可。

22、echo、print、print_r 的區(qū)別

這三個放在一起,回答的點在于,print_r 是函數(shù),echo、print 是結(jié)構(gòu)語言。

23、http 協(xié)議的 header 中有哪些 key 及含義

這個問題,很難。一會半會說不清楚。如果做過 PHP restful 接口開發(fā),也踩過這里面的坑,那應(yīng)該是可以答出來常用的幾個 KEY 的。

24、二叉樹前中后遍歷代碼

層序遍歷

先序遍歷

中序遍歷

后序遍歷

25、PHP 的數(shù)組和 C 語言的數(shù)組結(jié)構(gòu)上有何區(qū)別?

但從 PHP 來講,考的是 PHP 數(shù)組的實現(xiàn)??梢院唵蔚恼J(rèn)為,PHP 的數(shù)組是 hash 桶 + 十字鏈表(實際上是數(shù)列 Array,列表 List,散列表 / 關(guān)聯(lián)數(shù)組 / 字典 Hashtable 的聚合體)。優(yōu)點是查詢效率很高,遍歷很方便,缺點是,占內(nèi)存較多。(還是空間換時間的思路,畢竟現(xiàn)在內(nèi)存又不值錢)

C 語言的數(shù)組,就是定長定類型的數(shù)列。

26、Redis 的跳躍表怎么實現(xiàn)的

跳躍表 (skiplist) 是一種有序數(shù)據(jù)結(jié)構(gòu),它通過在每個節(jié)點中維持多個指向其他節(jié)點的指針,從而達(dá)到快速訪問節(jié)點的目的。

27、哈希是什么?hash 沖突后,數(shù)據(jù)怎么存?

28、聚簇索引,聚集索引的區(qū)別?

29、B+Tree 是怎么進(jìn)行搜索的

30、數(shù)組和 hash 的區(qū)別是什么?

完整的面試題請加群獲取需要的加群(點擊→)677079770

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容