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



一、給你四個座標點,判斷它們能不能組成一個矩形,如判斷 ([0,0],[0,1],[1,1],[1,0]) 能組成一個矩形。
勾股定理,矩形是對角線相等的四邊形。只要任意三點不在一條直線上,任選一點,求這一點到另外三點的長度的平方,兩個短的之和若是等於最長的,那麼這就是矩形。javascript

二、寫一段代碼判斷單向鏈表中有沒有造成環,若是造成環,請找出環的入口處,即 P 點php

 1 /*
 2  *單鏈表的結點類
 3  */
 4 class LNode{
 5     //爲了簡化訪問單鏈表,結點中的數據項的訪問權限都設爲public
 6     public int data;
 7     public LNode next;
 8 }
 9 
10 class LinkListUtli {
11     //當單鏈表中沒有環時返回null,有環時返回環的入口結點
12     public static LNode searchEntranceNode(LNode L)
13     {
14         LNode slow=L;//p表示從頭結點開始每次日後走一步的指針
15         LNode fast=L;//q表示從頭結點開始每次日後走兩步的指針
16         while(fast !=null && fast.next !=null) 
17         {
18             if(slow==fast) break;//p與q相等,單鏈表有環
19             slow=slow.next;
20             fast=fast.next.next;
21         }
22         if(fast==null || fast.next==null) return null;
23 
24         // 從新遍歷,尋找環的入口點
25         slow=L;
26         while(slow!=fast)
27         {
28             slow=slow.next;
29             fast=fast.next;
30         }
31 
32         return slow;
33     }
34 }
35 3、寫一個函數,獲取一篇文章內容中的所有圖片,並下載
36 
37 function download_images($article_url = '', $image_path = 'tmp'){
38 
39     // 獲取文章類容
40     $content = file_get_contents($article_url);
41 
42     // 利用正則表達式獲得圖片連接
43     $reg_tag = '/<img.*?\"([^\"]*(jpg|bmp|jpeg|gif|png)).*?>/';
44     $ret = preg_match_all($reg_tag, $content, $match_result); 
45     $pic_url_array = array_unique($match_result1[1]);
46 
47     // 建立路徑
48     $dir = getcwd() . DIRECTORY_SEPARATOR .$image_path;
49     mkdir(iconv("UTF-8", "GBK", $dir), 0777, true);
50 
51     foreach($pic_url_array as $pic_url){
52         // 獲取文件信息
53         $ch = curl_init($pic_url);
54         curl_setopt($ch, CURLOPT_HEADER, 0);
55         curl_setopt($ch, CURLOPT_NOBODY, 0);
56         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE );
57         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE );
58         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
59         $fileInfo = curl_exec($ch);
60         $httpinfo = curl_getinfo($ch);
61         curl_close($ch);
62 
63         // 獲取圖片文件後綴
64         $ext = strrchr($pic_url, '.');
65         $filename = $dir . '/' . uniqid() . $ext; 
66 
67         // 保存圖片信息到文件
68         $local_file = fopen($filename, 'w');
69         if(false !== $local_file){
70             if( false !== fwrite($local_file, $filecontent) ){
71             fclose($local_file);
72             }
73         }
74     }
75 
76 }

 

四、獲取當前客戶端的 IP 地址,並判斷是否在java

(111.111.111.111,222.222.222.222)
若是沒有使用代理服務器:

$ip = $_SERVER['REMOTE_ADDR'];
使用透明代理

$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];

 

五、nginx 的 log_format 配置以下:mysql

1 log_format main ‘remoteaddr−remote_user [timelocal]"request」’ 
2 ‘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 地址?linux

六、什麼是 CSRF 攻擊?XSS 攻擊?如何防範?
CSRF:跨站請求僞造,能夠經過經過判斷來源和加 Token 的方式來防範。nginx

XSS:跨站腳本攻擊,能夠經過對內容轉義和過濾來防範,還有 CSP面試

七、應用中咱們常常會遇到在 user 表隨機調取 10 條數據來展現的狀況,簡述你如何實現該功能。正則表達式

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

 

八、從撲克牌中隨機抽 5 張牌,判斷是否是一個順子,即這 5 張牌是連續的
這個問題有個關鍵點,撲克牌,1-13 不能再多了。這就很簡單了。用 PHP 來作,定義一個數組分別存着 1 到 13, 拿出一個,置空一個,最後看下 這五個置空的 是否是連續的。這種狀況不考慮抽出的順序。redis

九、兩條相交的單向鏈表,如何求它們的第一個公共節點
思想:算法

若是兩個鏈表相交,則從相交點開始,後面的節點都相同,即最後一個節點確定相同;
從頭至尾遍歷兩個鏈表,並記錄鏈表長度,當兩者的尾節點不一樣,則兩者確定不相交;
尾節點相同,若是 A 長爲 LA,B 爲 LB,若是 LA>LB, 則 A 前 LA-LB 個先跳過
若是兩個單向鏈表有公共的結點,也就是說兩個鏈表從某一結點開始,它們的 m_pNext 都指向同一個結點。但因爲是單向鏈表的結點,每一個結點只有一個 m_pNext,所以從第一個公共結點開始,以後它們全部結點都是重合的,不可能再出現分叉。因此,兩個有公共結點而部分重合的鏈表,拓撲形狀看起來像一個 Y,而不可能像 X。

十、最長公共子序列問題 LCS,若有 [1,2,5,11,32,15,77] 和 [99,32,15,5,1,77] 兩個數組,找到它們共同都擁有的數,寫出時間複雜度最優的代碼,不能用 array_intersect(這裏有坑,須要去研究一下動態規劃)。

十一、linux 的內存分配和多線程原理

十二、MYSQL 中主鍵與惟一索引的區別
主鍵:絕對不能有空值。惟一索引:能夠有空值

1三、http 與 https 的主要區別
關鍵是 S 上。簡而言之,https 創建鏈接後要先把 SSL 的證書發下去,有了公鑰和私鑰,就能夠解密了。

1四、http 狀態碼及其含意

200 請求已成功,請求所但願的響應頭或數據體將隨此響應返回。
301 被請求的資源已永久移動到新位置。
302 請求的資源如今臨時從不一樣的 URI 響應請求。
400 一、語義有誤,當前請求沒法被服務器理解。二、請求參數有誤。
401 當前請求須要用戶驗證。
403 服務器已經理解請求,可是拒絕執行它。
404 請求失敗,請求所但願獲得的資源未被在服務器上發現。
500 服務器遇到了一個不曾預料的情況,沒法完成對請求的處理,會在程序碼出錯時出現。
501 服務器不支持當前請求所須要的某個功能。沒法識別請求的方法。
502 做爲網關或者代理工做的服務器嘗試執行請求時,從上游服務器接收到無效的響應。
503 因爲臨時的服務器維護或者過載,服務器當前沒法處理請求。

1五、linux 中怎麼查看系統資源佔用狀況

top、htop、free、uptime

1六、SQL 注入的原理是什麼?如何防止 SQL 注入
原理:第一 SQL 自己有問題(這個不是主要問題)。第二你寫的 SQL 頗有問題(這是最主要的)

防範:第一,絕對不要相信用戶輸入的任何東西。第二,預編譯。如今的框架通常都會有 SQL 過濾的。

1七、isset (null) isset (false) empty (null) empty (false) 輸出
PHP 入門問題,isset 和 empty 的區別

分別是 false, true, true, true

1八、優化 MYSQL 的方法
第一,數據超過必定數量或者體積,請拆分表,垂直或者水平分(最有效果的優化)

第二,務必有自增主鍵。經過自增主鍵來查數據是最快的。

第三,經常使用的查詢字段創建聯合索引,寫 SQL 必定要尊從最左原則,用到這個索引。

第四,不要把邏輯運算放到 sql 裏。言外之意是,不要寫太複雜的 SQL,你能寫複雜的 SQL 你確定也能經過 PHP 實現。

1九、數據庫中的事務是什麼?
事務(transaction)是做爲一個單元的一組有序的數據庫操做。若是組中的全部操做都成功,則認爲事務成功,即便只有一個操做失敗,事務也不成功。若是全部操做完成,

事務則提交,其修改將做用於全部其餘數據庫進程。若是一個操做失敗,則事務將回滾,該事務全部操做的影響都將取消。

20、寫一個函數,儘量高效的從一個標準 URL 中取出文件的擴展名
會 寫正則最好。我反正不會正則,須要用的時候就百度。

2一、參數爲多個日期時間的數組,返回離當前時間最近的那個時間
遍歷數組,求當前時間差,和第一個進行對比,小於第一個交換位置。最後取第一個便可。

2二、echo、print、print_r 的區別
這三個放在一塊兒,回答的點在於,print_r 是函數,echo、print 是結構語言。

2三、http 協議的 header 中有哪些 key 及含義
這個問題,很難。一會半會說不清楚。若是作過 PHP restful 接口開發,也踩過這裏面的坑,那應該是能夠答出來經常使用的幾個 KEY 的。

2四、二叉樹前中後遍歷代

  1. 層序遍歷
  2. 先序遍歷
  3. 中序遍歷
  4. 後序遍歷

2五、PHP 的數組和 C 語言的數組結構上有何區別?
但從 PHP 來說,考的是 PHP 數組的實現。能夠簡單的認爲,PHP 的數組是 hash 桶 + 十字鏈表(其實是數列 Array,列表 List,散列表 / 關聯數組 / 字典 Hashtable 的聚合體)。優勢是查詢效率很高,遍歷很方便,缺點是,佔內存較多。(仍是空間換時間的思路,畢竟如今內存又不值錢)

C 語言的數組,就是定長定類型的數列。

2六、Redis 的跳躍表怎麼實現的
跳躍表 (skiplist) 是一種有序數據結構,它經過在每一個節點中維持多個指向其餘節點的指針,從而達到快速訪問節點的目的。

2七、哈希是什麼?hash 衝突後,數據怎麼存?

2八、聚簇索引,彙集索引的區別?

2九、B+Tree 是怎麼進行搜索的

30、數組和 hash 的區別是什麼?

3一、寫個函數,判斷下面擴號是否閉合,左右對稱即爲閉合:((())),)(()),(()))),(((((()),(()()),()()

3二、 找出數組中不重複的值 [1,2,3,3,2,1,5]
用普通方法,確定很容易的。

3三、32 題你的時間複雜度是多少?有的狀況下,你寫了個算法,而後面試官會讓你把你的算法的時間複雜度表達式寫出來

3四、PHP 的的這種弱類型變量是怎麼實現的?
考 zval 的,PHP 的八種類型,本質只有一個結構。

3五、在 HTTP 通信過程當中,是客戶端仍是服務端主動斷開鏈接
三次握手和四次揮手,以及他們每步的狀態。

這個問題最好能一步到位回答的全面的。通常都是有客戶端告訴服務端,我這邊東西發完了,能夠斷鏈接了麼。可是若是客戶端發完 FIN 服務端沒有回覆,就會重試,直到超過超時時間,就斷了。服務端也同樣,超過期間,服務端就斷了。

3六、PHP 中發起 http 請求有哪幾種方式?它們有何區別?

GET
POST
HEAD
PUT
DELETE
OPTIONS
TRACE
CONNECT

3七、有一顆二叉樹,寫代碼找出來從根節點到 flag 節點的最短路徑並打印出來,flag 節點有多個。好比下圖這個樹中的 6 和 14 是 flag 節點,請寫代碼打印 八、三、6 和 八、十、14 兩個路徑

典型的二叉搜索樹。大學數據結構的基礎題。

3八、有兩個文件文件,大小都超過了 1G,一行一條數據,每行數據不超過 500 字節,兩文件中有一部份內容是徹底相同的,請寫代碼找到相同的行,並寫到新文件中。PHP 最大容許內內爲 255M。
將文件拆分紅若干個小文件,根據內容計算 hash 值,分散到不一樣文件。

3九、請寫出自少兩個支持回調處理的 PHP 函數,並本身實現一個支持回調的 PHP 函數

array_map,array_filter, array_walk

40、請寫出自少兩個獲取指定文件夾下全部文件的方法(代碼或思路)。
核心方法是 scandir, 核心思想是遞歸。

4一、請寫出自少三種截取文件名後綴的方法或函數(PHP 原生函數和本身實現函數都可)

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);

4二、PHP 如何實現不用自帶的 cookie 函數爲客戶端下發 cookie。對於分佈式系統,如何來保存 session 值。
這個題有點繞。考的仍是 COOKIE 和 SESSION 的基礎知識。服務端經過 set-cookie 命令來通知客戶端保存 cookie。

只要按照 domain path 過時時間等規則 用 header 函數就能夠實現。

分佈式系統 session,集中處理。按咱們公司的架構,爲了實現高可用和高容災,提供一個分佈式的驗籤服務。具體的能夠看下 redis 的分佈式服務架構。

4三、請用 SHELL 統計 5 分鐘內,nginx 日誌裏訪問最多的 URL 地址,對應的 IP 是哪些?

4四、寫一段 shell 腳本實現備份 mysql 指定庫(如 test) 到指定文件夾並打包,並刪除 30 天前的備份,而後將新的備份推送到遠端服務器,完成後送郵件通知。

4五、mysql 數據庫中 innodb 和 myisam 引擎的區別
區別主要在數據和索引的存儲結構和存儲方式上,以及對於事務的支持。

4六、從用戶在瀏覽器中輸入網址並回車,到看到完整的見面,中間都經歷了哪些過程。
入門問題。這個問題有一個很大的坑,面試官可能會從這個問題下手問你一大堆問題。

以 PHP 爲例:一般最簡單的回答,從用戶的電腦找到最近的 DNS 服務,而後解析到對應的 IP 而後雙方開始 HTTP 鏈接,而後發送請求信息,服務器拿到請求信息就開始準備迴應的信息,中間要通過 nginx 轉發到 frstCGI (PHP-FPM), 而後 PHP 開始解析框架,解析請求頭部,找到對應的 API,該查數據庫查數據,該組裝 HTML 組裝 HTML,完事了就從新返回給用戶。用戶拿到返回數據,瀏覽器開始渲染頁面,JS 開始加載。

4七、如何分析一條 sql 語句的性能。
explain,具體的請百度。(基本不多用性能分析語句。MYSQL 的表設計上儘可能冗餘一部分字段,避免在 MYSQL 裏處理大量的邏輯運算。咱們是作 PHP 服務開發的,mysql 語句能簡單儘可能簡單。邏輯運算的地方能夠在 PHP 裏作。)

4八、ping 一個服務器 ping 不通,用哪一個命令跟蹤路由包?

linux:traceroute,windows:tracert

4九、

$a=[0,1,2,3]; $b=[1,2,3,4,5]; $a+=$b; var_dump ($a) 等於多少?
基礎問題。本質仍是考 PHP 數組的結構和特色。

結果是 01235。PHP 用數字索引和 STRING 索引差異仍是很大的

50.

$a=[1,2,3]; foreach ($a as &$v){} foreach ($a as $v){} var_dump ($a) 等於多少;
122
此處有一坑。foreach 完以後,$index , $value 並不會消失保留最後一次賦值。
這裏的第一次 foreach 以後,數組中最後一個元素變成引用,引用變量 $v 繼續存在且指向數組的最後一個元素。第二次遍歷,由於遍歷變量名是 $v , 因此等於說每次遍歷都將這次遍歷的值修改爲最後元素的值,直至到遍歷最後一個元素(引用元素),由於此時數組的最後一個元素已被修改爲上一個元素的值,最後一次賦值就是 本身 == 本身。 故最後一個等於倒數第二個

博客:【PHP - 雷】foreach 與 reference 的雷

5一、數據庫中的存放了用戶 ID, 扣費不少行,redis 中存放的是用戶的錢包,如今要寫一個腳本,將數據庫中的扣費記錄同步到 redis 中,每 5 分鐘執行一次。請問要考慮哪些問題?
思路:生產者和消費者模式。這個問題也沒有說其餘的狀態,好比數據庫的數據會實時增長麼?redis 中每一個錢包是否有其餘服務在讀取或者寫入啊。什麼的。數據庫和 REDIS 放一塊兒,要麼考數據一致性,要麼考出現鎖,致使效率下降。

5二、MYSQL 主從服務器,若是主服務器是 innodb 引擎,從服務器是 myisam 引擎,在實際應用中,會遇到什麼問題?
不知道,沒用過,爲何這麼設計?故意給本身找不愉快?

5三、linux 中進程信號有哪些?
kill -l 不多用

5四、redis 的底層實現
面試官這麼樣問你,你就反問他,你要的底層實現是字段的設計?內存分配管理?網絡模型?數據同步?仍是分佈式的實現?(TIPS: 面試就是兩我的的博弈。面試官給出一個描述不清晰的問題,咱們不必回答。讓他把問題講清楚再思考怎麼回覆)

這篇文章 要多讀幾遍。

5五、異步模型
問清楚是 IO 異步模型。仍是 AJAX 這類的異步請求模型。差異很是大的。

狗東某風控研發必考題。

5六、10g 文件,用 php 查看它的行數
粗暴一點的方法 ini_set ('memory_limit','-1'); 先把當前內存限制解除了 而後直接逐行統計。時間會很是的久。

有更好的方法請留言。

5七、有 10 億條訂單數據,屬於 1000 個司機的,請取出訂單量前 20 的司機
(TIPS)不要中招。不要用經常使用思路來處理,10 億數據 你再怎麼優化,全表求和,都是要死人的。

咱們從設計上解決這個問題。只有一千個司機。咱們能夠作個簡單哈希,分庫分表,% 求餘數。保證這一千個司機分在一千個表裏,每一個人有每一個人的單獨表。引擎用 MYSAIM,求表中數據的總數,效率飛快,遍歷一千張表,求最大前二十便可。

5八、設計一個微信紅包的功能
沒作過。其實題目表達不清楚。若是作過微信公衆號開發,知道微信事件模型的 XML 數據結構,應該會好作一點。

5九、根據 access.log 文件統計最近 5 秒的 qps,並以以下格式顯示,01 1000(難點在 01 序號)

tail -f access.log | awk -F '[' '{print $2}' | awk '{print $1}' | uniq -c

60、php7 性能爲何提高這麼高
不逼逼,直接參考:

鳥哥的文章要多讀,多讀。

6一、遍歷一個多維數組
遞歸。array_map 傳入一個回調函數。

6二、有這樣一個字符串 abcdefgkbcdefab…… 隨機長度,寫一個函數來求 bcde 在這個字符串中出現的次數
substr_count();

6三、有一個 1G 大小的一個文件,裏面每一行是一個詞,詞的大小不超過 16 個字節,內存限制大小是 1M。返回頻數最高的 100 個詞
方法太多了,可是實現起來 各有各的問題。

我可能只會用 HASH 映射作。其餘的,不會。

參考:第 64 題。

6四、十道海量數據處理面試題與十個方法大總結

https://blog.csdn.net/v_JULY_v/article/details/6279498

6五、php 進程模型,php 怎麼支持多個併發
守護進程模型(須要知道 php-fpm 的各類配置了)

參考:

6六、nginx 的進程模型,怎麼支持多個併發
這個三言兩語說不清楚。

參考:

6七、php-fpm 各配置含義,fpm 的 daemonize 模式

php-fpm 的配置並很少,經常使用的就更少了。

參考:http://www.4wei.cn/archives/1002061

static - 子進程的數量是固定的(pm.max_children)
ondemand - 進程在有需求時才產生(當請求時,與 dynamic 相反,pm.start_servers 在服務啓動時即啓動
dynamic - 子進程的數量在下面配置的基礎上動態設置:pm.max_children,pm.start_servers,pm.min_spare_servers,pm.max_spare_servers

6八、讓你實現一個簡單的架構,並保持高可用,兩個接口,一個上傳一條文本,一個獲取上傳的內容,你怎麼來設計?要避免單機房故障,同時要讓代碼層面無感。
參考:分佈式架構設計必備 CAP 原理。

6九、兩臺 mysql 服務器,其中一臺掛了,怎麼讓業務端無感切換,並保證正常狀況下講臺服務器的數據是一致的
不是核心業務的話,先停寫,把備機拉起來,查看兩臺機器的日誌,進行數據補償,開寫。

若是是核心業務的話,如今全部的寫操做都在正常的狀態機器上。把好的這臺機器的備機拉起來,當主機。

以上全是應急操做。實際上數據庫的容災設計要複雜的多。

面試官要是問你,備機的數據不一致怎麼辦,你要勇敢懟回去,大家每秒多少寫入操做。按照百萬級表,每秒 1000 的寫入效率,正常的設計是,分佈在 2 臺機器上每臺 500。這個級別的數據同步,出現差別的機率 能夠忽略不計的。有一臺出現問題,另外一臺也能夠抗住。

(正常的操做,仍是先停寫,等數據一致,切換,開寫。咱們公司搞這些切換都是在凌晨 4.00 左右,核心業務的每秒寫操做,只有十幾個。先後耽擱不到 20 秒)。

70、http 協議具體的定義
這種題 有是很難回答的。太寬泛了,咱們面試早就不問這種問題了。

參考:日本人寫的《圖解 HTTP》

7一、什麼是鎖,怎麼解決鎖的問題
計算機原理學的,生產者消費者模型,銀行家模型,均可以解決鎖的問題。

7二、rand 與 mt_rand 的區別
我實習的時候遇到這個坑。

說是 mt_rand 比 rand 快 4 倍。

在隨機數區間不大的狀況下並無很大的效率差距。可是出現重複數的概率,rand 要比 mt_rand 高不少。

7三、mysql 事務隔離是怎麼實現的
經過各類行鎖表鎖,各類樂觀鎖悲觀鎖,排他鎖實現的呀。

7四、mysql 的鎖怎麼實現的

7五、對稱加密和非對稱加密的方式
對稱加密:咱們倆共用一個祕鑰,你加密,我解密。

非對稱加密:我給你一個公鑰,你加密完了,我還能有個人私鑰把密文解開。可是你沒有個人私鑰。

擴展:橢圓加密算法。

7六、10 瓶水,其中一瓶有毒,小白鼠喝完有毒的水以後,會在 24 小時後死亡,問:最少用幾隻小白鼠能夠在 24 小時後找到具體是哪一瓶水有毒。
四隻

二進制問題。薛定諤的老鼠。

一隻老鼠有兩個狀態,死活,對應 01。假設老鼠的個數爲 A,則有 2^A>=10; A=4;

思路很簡單,十瓶藥編號:0,1,10,11….1001;

0 不喝。第一隻老鼠喝全部個位是 1 的:13579,第二隻喝十位是 1 的,第三隻和百位是 1 的,第四隻喝千位是 1 的。

24 小時後,看下死了的是 1,活着的是 0。按老鼠的順序乖乖站好…… 假如第一隻和第三隻死了,那就是 0101,就是 5 有問題。

7七、redis 是如何進行同步的,同步的方式,同步回滾怎麼辦,數據異常怎麼辦,同時會問 MYSQL 的同步方式和相關異常狀況
redis 集羣主從同步的簡單原理

  Redis 的複製功能是基於內存快照的持久化策略基礎上的,也就是說不管你的持久化策略選擇的是什麼,只要用到了 Redis 的複製功能,就必定會有內存快照發生。

  當 Slave 啓動並鏈接到 Master 以後,它將主動發送一個 SYNC 命令 (首先 Master 會啓動一個後臺進程,將數據快照保存到文件中 [rdb 文件] Master 會給 Slave 發送一個

Ping 命令來判斷 Slave 的存活狀態 當存活時 Master 會將數據文件發送給 Slave 並將全部寫命令發送到 Slave )。

  Slave 首先會將數據文件保存到本地 以後再將 數據 加載到內存中。

  當第一次連接 或者是 故障後 從新鏈接 都會先判斷 Slave 的存活狀態 在作所有數據的同步 , 以後只會同步 Master 的寫操做 (將命令發送給 Slave)

問題:

  當 Master 同步數據時 若數據量較大 而 Master 自己只會啓用一個後臺進程 來對多個 Slave 進行同步 , 這樣 Master 就會壓力過大 , 並且 Slave 恢復的時間也會很慢!

redis 主從複製的優勢:

(1)在一個Redis集羣中,master負責寫請求,slave負責讀請求,這麼作一方面經過將讀請求分散到其餘機器從而大大減小了master服務器的壓力,另外一方面slave專一於提供
讀服務從而提升了響應和讀取速度。

  (2) 在一個 Redis 集羣中,若是 master 宕機,slave 能夠介入並取代 master 的位置,所以對於整個 Redis 服務來講不至於提供不了服務,這樣使得整個 Redis 服務足夠安全。

  (3) 水平增長 Slave 機器能夠提升性能

7八、怎麼解決跨域
JSONP
添加響應頭,容許跨域
代理的方式

7九、json 和 xml 區別,各有什麼優缺點
(1)可讀性方面:基本相同,XML 的可讀性比較好;

(2)可擴展性方面:都具備良好的擴展性;

(3)編碼難度方面:相對而言,JSON 的編碼比較容易;

(4)解碼難度:JSON 的解碼難度基本爲零,XML 須要考慮子節點和父節點;

(5)數據體積方面:JSON 相對於 XML 來說,數據體積小,傳遞的速度比較快;

(6)數據交互方面:JSON 與 javascript 的交互更加方便,更容易解析處理,更好的數據交互;

(7)數據描述方面:XML 對數據描述性比較好;

(8)傳輸速度方面:JSON 的速度遠遠快於 XML。

80、Trait 優先級
在 trait 繼承中,優先順序依次是:來自當前類的成員覆蓋了 trait 的方法,而 trait 則覆蓋了被繼承的方法

8一、a 引用 b,報錯 c 裏面類重複定義,循環引用會出現什麼問題

8二、下面員工 3 的薪水大於其主管的薪水,一條 SQL 找到薪水比下屬低的主管

id    username    salary  pid
1    a   3000    null
2    b   8000    null
3    c   5000    1
4    d   6000    3
SELECT a.*, b.*
FROM `user` as a
LEFT JOIN `user` as b ON a.pid = b.id AND a.salary > b.salary
WHERE b.id > 0;

8二、在一個座標系內有一個 N 個點組成的多邊形,如今有一個座標點,寫代碼或思路來判斷這個點是否處於多邊形內

8三、數據庫若是出現了死鎖,你怎麼排查,怎麼判斷出現了死鎖?

8四、寫一個一個程序來查找最長子串

8五、分析一個問題:php-fpm 的日誌正常,但客戶端卻超時了,你認爲多是哪裏出了問題,怎麼排查?
檢查 nginx log,請求是否達到 nginx 和是否正常轉發給 php-fpm

8六、nginx 的工做流程是什麼樣的,能夠畫圖描述

8七、進程間通訊方式有哪些
1) 管道
管道分爲有名管道和無名管道
無名管道是一種半雙工的通訊方式,數據只能單向流動,並且只能在具備親緣關係的進程間使用。進程的親緣關係通常指的是父子關係。無明管道通常用於兩個不一樣進程之間的通訊。當一個進程建立了一個管道,並調用 fork 建立本身的一個子進程後,父進程關閉讀管道端,子進程關閉寫管道端,這樣提供了兩個進程之間數據流動的一種方式。
有名管道也是一種半雙工的通訊方式,可是它容許無親緣關係進程間的通訊。

2) 信號量
信號量是一個計數器,能夠用來控制多個線程對共享資源的訪問., 它不是用於交換大批數據,而用於多線程之間的同步。它常做爲一種鎖機制,防止某進程在訪問資源時其它進程也訪問該資源。所以,主要做爲進程間以及同一個進程內不一樣線程之間的同步手段.

3) 信號
信號是一種比較複雜的通訊方式,用於通知接收進程某個事件已經發生.

4) 消息隊列
消息隊列是消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少,管道只能承載無格式字節流以及緩衝區大小受限等特色。消息隊列是 UNIX 下不一樣進程之間可實現共享資源的一種機制,UNIX 容許不一樣進程將格式化的數據流以消息隊列形式發送給任意進程。對消息隊列具備操做權限的進程均可以使用 msget 完成對消息隊列的操做控制。經過使用消息類型,進程能夠按任何順序讀信息,或爲消息安排優先級順序.

5) 共享內存
共享內存就是映射一段能被其餘進程所訪問的內存,這段共享內存由一個進程建立,但多個進程均可以訪問。共享內存是最快的 IPC (進程間通訊) 方式,它是針對其它進程間通訊方式運行效率低而專門設計的。它每每與其餘通訊機制,如信號量,配合使用,來實現進程間的同步與通訊.

6) 套接字:可用於不一樣及其間的進程通訊

8八、主從複製,從服務器會讀取到主服務器正在回滾的數據嗎?主數據庫寫成功,從服務器由於一些緣由寫失敗,最後會出現什麼狀況?主從複製若是鍵衝突怎麼辦?
不會;主從數據不一致;正常是不會出現這種情景,具體看狀況,是否能夠修復,恢復到以前的時間點,而後追回同步。

8九、事務有幾種隔離級別?事務的隔離級別是怎麼實現的?

讀未提交(read-uncommitted)
不可重複讀(read-committed)
可重複讀(repeatable-read)
串行化(serializable)

90、什麼是 B + 樹,請畫 b + 樹的結構

9一、mysql 中的字符集,客戶端與數據庫不一致,怎麼辦?MYSQL 中字符串到顯示到界面,字符轉換的過程是怎樣的?數據庫中的字符集是 latin1, 你如今將 utf8 的字符串存到 latin1 字符集的數據庫表,你能將 utf8 的字符串存進去嗎?假如你說能存,追問:可否恢復?假如能,那怎麼恢復?

9二、

寫一段代碼,找到全部子集合,如 [a,b,c] 的子集合有 {},{a},{b},{c},{ab},{ac},{abc}

9三、

['a'=>200,'b'=>100,'c'=>100], 寫一個自定義排序函數,按值降序,若是值同樣,按鍵排序
冒泡排序

9四、設計一個緩存系統,能夠按期或空間佔滿以後自動刪除長期不用的數據,不能使用用遍歷。
我當時的答案是用鏈表來存,緩存命中就將該緩存移到鏈表頭,而後鏈表尾就都是冷數據了。
我記得以前是在哪裏看過這個設計,但我忘記在鏈接了,請知道朋友的把鏈接貼上來。

9五、

== 和 === 的區別,寫出如下輸出:"aa"==1,"bb"==0,1=="1"
== 等於,不須要對比數據類型
=== 全等,須要對比類型
false, true, true

9六、一個排序好的數組,將它從中間任意一個位置切分紅兩個數組,而後交換它們的位置併合並,合併後新數組元素如:20,21,22,25,30,1,2,3,5,6,7,8,15,18,19, 寫一個查詢函數來查找某個值是否存在。

9七、設計一個樹形結構,再寫一個函數對它進行層序遍歷

9八、

'$var' 和 "$var" 的區別
雙引號串中的內容能夠被解釋並且替換,而單引號串中的內容總被認爲是普通字符。

在單引號串中甚至反斜槓也失去了他的擴展含義(除了插入反斜槓 \ 和插入單引號 \')。因此,當你想在字串中進行變量代換和包 含 \n(換行符)等轉義序列時,你應該使用雙引號。單引號串能夠用在其餘任何地方,腳本中使用單引號串處理速度會更快些。

9九、self 和 static 的區別
static:若是在子類中重寫了父類中的 static 方法、屬性,父類就會去訪問了子類的 static 方法

self: 是類內指針,無論子類有沒有重寫過父類中的方法、屬性都指向本類的靜態方法、屬性
100、PHP 的協程以及用途

10一、描述 autoload 的機制

10二、mysql 中字段類型各佔幾個字節:smallint、int、bigint、datetime、varchar (8)

smallint 2 字節
int 4 字節
bigint 8 字節
datetime 8 字節
varchar (8) 8*3 字節

10三、哪些屬性惟一肯定一條 TCP 鏈接

10四、myisam 和 innodb 的區別,爲何 myisam 比 innodb 快,myisam 和 innodb 的索引數據結構是什麼樣的?innodb 主鍵索引和非主鍵索引的區別?其索引上存放的數據是什麼樣的?
區別主要在數據和索引的存儲結構和存儲方式上,以及對於事務的支持。

10五、斷開 TCP 鏈接時,timewait 狀態會出如今發起分手的一端仍是被分手的一端
爲何創建 TCP 鏈接須要三次握手?
緣由:爲了應對網絡中存在的延遲的重複數組的問題
例子:
假設 client 發起鏈接的鏈接請求報文段在網絡中沒有丟失,而是在某個網絡節點長時間滯留了,致使延遲到達 server。原本這是一個已經失效的鏈接報文,可是 server 接收到這個鏈接報文以後,誤認爲 client 發起了新的鏈接,因而向 client 發送確認報文段。此時由於沒有了鏈接的 3 次握手,client 不會對 server 的確認報文做出迴應,也不會向 server 發送數據,server 就覺得鏈接已經創建,一直在空等 client 的數據,這樣 server 的這一部分網絡資源就被浪費了。

爲何斷開 TCP 鏈接須要進行四次握手 ?
由於 TCP 鏈接是全雙工的網絡協議,容許同時通訊的雙方同時進行數據的收發,一樣也容許收發兩個方向的鏈接被獨立關閉,以免 client 數據發送完畢,向 server 發送 FIN 關閉鏈接,而 server 還有發送到 client 的數據沒有發送完畢的狀況。因此關閉 TCP 鏈接須要進行四次握手,每次關閉一個方向上的鏈接須要 FIN 和 ACK 兩次握手。

TIME_WAIT 狀態的意義

在 TCP 鏈接中,當被動關閉鏈接的一方 (圖中 client) 發送的 FIN 報文到達時,被動關閉鏈接的一方會發送 ACK 確認報文,而且進入 TIME_WAIT 狀態,而且等待 2MSL 時間段 (MSL:maximum segment life)。這麼作有下述兩個緣由:

被動關閉鏈接的一方 (圖中的 server) 在一段時間內沒有收到對方的 ACK 確認數據包,會從新發送 FIN 數據包,於是主動關閉鏈接的一方須要停留在等待狀態以處理對方從新發送的 FIN 數據包。不然他會迴應一個 RST 數據包給被動關閉鏈接的一方,使得對方莫名其妙。

在 TIME_WAIT 狀態下,不容許應用程序在當前 ip 和端口上和以前通訊的 client (這個 client 的 ip 和端口號不變) 創建一個新的鏈接。這樣就能避免新的鏈接收到以前的 ip 和端口一致的鏈接殘存在網絡中的數據包。這也是 TIME_WAIT 狀態的等待時間被設置爲 2MSL 的緣由,以確保網絡上當前鏈接兩個方向上還沒有接收的 TCP 報文已經所有消失。

10六、AWK 各類數據分析考得很是多,要多練習,題目再也不一一寫了

10七、redis 中集合、有序集合、hyperLog、hash 的數據結構是啥樣的
key value

10八、描述一下:一個請求到達 nginx 的所有處理過程(nginx 自身會調用哪些邏輯)、而後怎麼與 php 通訊,中間的流程是什麼樣的等等?

10九、nginx 和 php-fpm 的相關配置,隨便問裏面各類參數啥意思
php-fpm 能夠經過 tcp socket 和 unix socket 兩種方式實現。

1十、假若有一張地圖,以下圖,"-" 表明海洋、"+" 表明陸地,用你最擅長的方式,取出陸地的座標。

--++----++--+++---
-++++----+++++++--
-+++----++++------
-----++------++++-
---++++++-----+++-
-----+++------+++-
好比上圖在數組中表示成,1 表示成陸地,0 表示海洋:

[
    [0,0,1,1,0,0,0,1,1....],
    [0,1,1,1.....],
]
寫個算法取出全部陸地的座標,並按塊放到一塊兒,如地圖上左上角第一個陸地的座標是:

[
    [0,2],[0,3],
    [1,1],[1,2],[1,3],[1,4],
    [2,1],[2,2],[2,3]
]

1十一、Jsonp 的實現原理,你還知道哪些跨域方式?
JSONP
添加響應頭,容許跨域
代理的方式

1十二、若是某個博客經過判斷 referer 方式來進行圖片防盜鏈,如何破解?
curl 設置來源地址來欺騙對方服務器驗證

11三、簡述 mysql 查詢優化的本質,並舉 2 個例子
11四、設計一個秒殺系統,如何保證商品不超賣?

11五、單例模式的優勢是什麼?抽象類是什麼?還了解哪些設計模式?
單例模式又稱爲職責模式,它用來在程序中建立一個單一功能的訪問點,通俗地說就是實例化出來的對象是惟一的。
全部的單例模式至少擁有如下三種公共元素:

它們必須擁有一個構造函數,而且必須被標記爲 private它們擁有一個保存類的實例的靜態成員變量它們擁有一個訪問這個實例的公共的靜態方法單例類不能再其它類中直接實例化,只能被其自身實例化。它不會建立實例副本,而是會向單例類內部存儲的實例返回一個引用。抽象的類不能被實例化。任何一個類,若是它裏面至少有一個方法是被聲明爲抽象的,那麼這個類就必須被聲明爲抽象的。被定義爲抽象的方法只是聲明瞭其調用方式(參數),不能定義其具體的功能實現。

相關文章
相關標籤/搜索