1. 程式人生 > >高階PHP面試總結

高階PHP面試總結

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

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

 

2、寫一段程式碼判斷單向連結串列中有沒有形成環,如果形成環,請找出環的入口處,即P點

/*
 *單鏈表的結點類
 */
class LNode{
    //為了簡化訪問單鏈表,結點中的資料項的訪問許可權都設為public
    public int data;
    public LNode next;
}


class LinkListUtli {
    //當單鏈表中沒有環時返回null,有環時返回環的入口結點
    public static LNode searchEntranceNode(LNode L)
    {
        LNode slow=L;//p表示從頭結點開始每次往後走一步的指標
        LNode fast=L;//q表示從頭結點開始每次往後走兩步的指標
        while(fast !=null && fast.next !=null) 
        {
            if(slow==fast) break;//p與q相等,單鏈表有環
            slow=slow.next;
            fast=fast.next.next;
        }
        if(fast==null || fast.next==null) return null;

        // 重新遍歷,尋找環的入口點
        slow=L;
        while(slow!=fast)
        {
            slow=slow.next;
            fast=fast.next;
        }

        return slow;
    }
}

 

3、寫一個函式,獲取一篇文章內容中的全部圖片,並下載

function download_images($article_url = '', $image_path = 'tmp'){

    // 獲取文章類容
    $content = file_get_contents($article_url);

    // 利用正則表示式得到圖片連結
    $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){
        // 獲取檔案資訊
        $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'];

參考文章

https://www.cnblogs.com/rendd/p/6183094.html

 

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;

參考文章:

https://www.cnblogs.com/riasky/p/3367558.html

http://www.jb51.net/article/48801.htm

 

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。

參考文獻:

https://blog.csdn.net/wcyoot/article/details/6426436

https://blog.csdn.net/Lieacui/article/details/52046548

 

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

 

11、linux的記憶體分配和多執行緒原理

 

12、MYSQL中主鍵與唯一索引的區別

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

參考:https://www.cnblogs.com/lonelyxmas/p/4594624.html

 

13、http與https的主要區別

關鍵是S上。簡而言之,https建立連線後要先把SSL的證書發下去,有了公鑰和私鑰,就可以解密了。

參考:https://www.cnblogs.com/zyl-Tara/p/7079696.html

 

14、http狀態碼及其含意

  • 200 請求已成功,請求所希望的響應頭或資料體將隨此響應返回。
  • 301 被請求的資源已永久移動到新位置。
  • 302 請求的資源現在臨時從不同的 URI 響應請求。
  • 400 1、語義有誤,當前請求無法被伺服器理解。2、請求引數有誤。
  • 401 當前請求需要使用者驗證。
  • 403 伺服器已經理解請求,但是拒絕執行它。
  • 404 請求失敗,請求所希望得到的資源未被在伺服器上發現。
  • 500 伺服器遇到了一個未曾預料的狀況,無法完成對請求的處理,會在程式碼出錯時出現。
  • 501 伺服器不支援當前請求所需要的某個功能。無法識別請求的方法。
  • 502 作為閘道器或者代理工作的伺服器嘗試執行請求時,從上游伺服器接收到無效的響應。
  • 503 由於臨時的伺服器維護或者過載,伺服器當前無法處理請求。

參考:http://tool.oschina.net/commons?type=5

 

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實現。

參考:https://cloud.tencent.com/developer/article/1004367

 

19、資料庫中的事務是什麼?

事務(transaction)是作為一個單元的一組有序的資料庫操作。如果組中的所有操作都成功,則認為事務成功,即使只有一個操作失敗,事務也不成功。如果所有操作完成,

事務則提交,其修改將作用於所有其他資料庫程序。如果一個操作失敗,則事務將回滾,該事務所有操作的影響都將取消。

 

20、寫一個函式,儘可能高效的從一個標準URL中取出檔案的副檔名

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

 

21、引數為多個日期時間的陣列,返回離當前時間最近的那個時間

遍歷陣列,求當前時間差,和第一個進行對比,小於第一個交換位置。最後取第一個即可。

 

22、echo、print、print_r的區別

這三個放在一起,回答的點在於,print_r是函式,echo、print是結構語言。

至於他們具體的區別參考:https://www.cnblogs.com/xiaotaoing/p/6687368.html

 

23、http協議的header中有哪些key及含義

這個問題,很難。一會半會說不清楚。如果做過PHP restful 介面開發,也踩過這裡面的坑,那應該是可以答出來常用的幾個KEY的。

參考:https://blog.csdn.net/u014175572/article/details/54861813

 

24、二叉樹前中後遍歷程式碼

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

參考:https://blog.csdn.net/wk199351/article/details/65936001

 

25、PHP的陣列和C語言的陣列結構上有何區別?

但從PHP來講,考的是PHP陣列的實現。可以簡單的認為,PHP的陣列是hash桶+十字連結串列(實際上是數列Array,列表List,散列表/關聯陣列/字典Hashtable的聚合體)。優點是查詢效率很高,遍歷很方便,缺點是,佔記憶體較多。(還是空間換時間的思路,畢竟現在記憶體又不值錢)

C語言的陣列,就是定長定型別的數列。

 

26、Redis的跳躍表怎麼實現的

跳躍表(skiplist)是一種有序資料結構,它通過在每個節點中維持多個指向其他節點的指標,從而達到快速訪問節點的目的。

參考:https://blog.csdn.net/universe_ant/article/details/51134020

 

27、雜湊是什麼?hash衝突後,資料怎麼存?

 

28、聚簇索引,聚集索引的區別?

 

29、B+Tree是怎麼進行搜尋的

 

30、陣列和hash的區別是什麼?

 

31、寫個函式,判斷下面擴號是否閉合,左右對稱即為閉合: ((())),)(()),(()))),(((((()),(()()),()()

 

32、 找出陣列中不重複的值[1,2,3,3,2,1,5]

用普通方法,肯定很容易的。

 

33、32題你的時間複雜度是多少?有的情況下,你寫了個演算法,然後面試官會讓你把你的演算法的時間複雜度表示式寫出來

 

34、PHP的的這種弱型別變數是怎麼實現的?

考zval的,PHP的八種類型,本質只有一個結構。

參考:https://blog.csdn.net/ohmygirl/article/details/41542445

 

35、在HTTP通訊過程中,是客戶端還是服務端主動斷開連線?

三次握手和四次揮手,以及他們每步的狀態。

這個問題最好能一步到位回答的全面的。一般都是有客戶端告訴服務端,我這邊東西發完了,可以斷連線了麼。但是如果客戶端發完FIN服務端沒有回覆,就會重試,直到超過超時時間,就斷了。服務端也一樣,超過時間,服務端就斷了。

 

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

  1. GET
  2. POST
  3. HEAD
  4. PUT
  5. DELETE
  6. OPTIONS
  7. TRACE
  8. CONNECT

 

37、有一顆二叉樹,寫程式碼找出來從根節點到flag節點的最短路徑並打印出來,flag節點有多個。比如下圖這個樹中的6和14是flag節點,請寫程式碼列印8、3、6 和 8、10、14兩個路徑

典型的二叉搜尋樹。大學資料結構的基礎題。

參考:https://blog.csdn.net/BaiHuaXiu123/article/details/52488443

 

38、有兩個檔案檔案,大小都超過了1G,一行一條資料,每行資料不超過500位元組,兩檔案中有一部分內容是完全相同的,請寫程式碼找到相同的行,並寫到新檔案中。PHP最大允許內內為255M。

將檔案拆分成若干個小檔案,根據內容計算hash值,分散到不同檔案。

 

39、請寫出自少兩個支援回撥處理的PHP函式,並自己實現一個支援回撥的PHP函式

array_map,array_filter, array_walk

 

40、請寫出自少兩個獲取指定資料夾下所有檔案的方法(程式碼或思路)。

核心方法是scandir,核心思想是遞迴。

 

41、請寫出自少三種擷取檔名字尾的方法或函式(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);

 

42、PHP如何實現不用自帶的cookie函式為客戶端下發cookie。對於分散式系統,如何來儲存session值。

這個題有點繞。考的還是COOKIE和SESSION的基礎知識。服務端通過set-cookie命令來通知客戶端儲存cookie。

只要按照domain path 過期時間等規則 用header函式就可以實現。

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

 

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

 

44、寫一段shell指令碼實現備份mysql指定庫(如test)到指定資料夾並打包,並刪除30天前的備份,然後將新的備份推送到遠端伺服器,完成後送郵件通知。

 

45、mysql資料庫中innodb和myisam引擎的區別

區別主要在資料和索引的儲存結構和儲存方式上,以及對於事務的支援。

參考:https://blog.csdn.net/chajinglong/article/details/56666771

 

46、從使用者在瀏覽器中輸入網址並回車,到看到完整的見面,中間都經歷了哪些過程。

入門問題。這個問題有一個很大的坑,面試官可能會從這個問題下手問你一大堆問題。

以PHP為例:通常最簡單的回答,從使用者的電腦找到最近的DNS服務,然後解析到對應的IP 然後雙方開始HTTP連線,然後傳送請求資訊,伺服器拿到請求資訊就開始準備迴應的資訊,中間要經過nginx轉發到frstCGI(PHP-FPM),然後PHP開始解析框架,解析請求頭部,找到對應的API,該查資料庫查資料,該組裝HTML組裝HTML,完事了就重新返回給使用者。使用者拿到返回資料,瀏覽器開始渲染頁面,JS開始載入。

 

47、如何分析一條sql語句的效能。

explain,具體的請百度。(基本很少用效能分析語句。MYSQL的表設計上儘量冗餘一部分欄位,避免在MYSQL裡處理大量的邏輯運算。我們是做PHP服務開發的,mysql語句能簡單儘量簡單。邏輯運算的地方可以在PHP裡做。)

 

48、ping一個伺服器ping不通,用哪個命令跟蹤路由包?

linux:traceroute,windows:tracert

 

49、$a=[0,1,2,3]; $b=[1,2,3,4,5]; $a+=$b; var_dump($a)等於多少?

基礎問題。本質還是考PHP陣列的結構和特點。

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

參考:http://www.jb51.net/article/38593.htm

 

50、$a=[1,2,3]; foreach($a as &$v){} foreach($a as $v){} var_dump($a)等於多少;

122 此處有一坑。foreach 完之後,$index , $value 並不會消失保留最後一次賦值。 這裡的第一次foreach之後,陣列中最後一個元素變成引用,引用變數 $v 繼續存在且指向陣列的最後一個元素。第二次遍歷,因為遍歷變數名是 $v , 所以等於說每次遍歷都將此次遍歷的值修改成最後元素的值,直至到遍歷最後一個元素(引用元素),因為此時陣列的最後一個元素已被修改成上一個元素的值,最後一次賦值就是 自己==自己。 故最後一個等於倒數第二個

https://laravel-china.org/articles/7001/php-ray-foreach-and-references-thunder

 

51、資料庫中的存放了使用者ID,扣費很多行,redis中存放的是使用者的錢包,現在要寫一個指令碼,將資料庫中的扣費記錄同步到redis中,每5分鐘執行一次。請問要考慮哪些問題?

思路:生產者和消費者模式。這個問題也沒有說其他的狀態,比如資料庫的資料會實時增加麼?redis中每個錢包是否有其他服務在讀取或者寫入啊。什麼的。資料庫和REDIS放一起,要麼考資料一致性,要麼考出現鎖,導致效率降低。

 

52、MYSQL主從伺服器,如果主伺服器是innodb引擎,從伺服器是myisam引擎,在實際應用中,會遇到什麼問題?

不知道,沒用過,為什麼這麼設計?故意給自己找不愉快?

 

53、linux中程序訊號有哪些?

kill -l 很少用

 

54、redis的底層實現

面試官這麼樣問你,你就反問他,你要的底層實現是欄位的設計?記憶體分配管理?網路模型?資料同步?還是分散式的實現?(TIPS:面試就是兩個人的博弈。面試官給出一個描述不清晰的問題,我們沒必要回答。讓他把問題講清楚再思考怎麼回覆)

參考:https://cloud.tencent.com/developer/article/1004377

這篇文章 要多讀幾遍。

 

55、非同步模型

問清楚是IO非同步模型。還是AJAX這類的非同步請求模型。差別非常大的。

參考:https://cloud.tencent.com/developer/article/1005481

狗東某風控研發必考題。

 

56、10g檔案,用php檢視它的行數

粗暴一點的方法 ini_set('memory_limit','-1'); 先把當前記憶體限制解除了 然後直接逐行統計。時間會非常的久。

有更好的方法請留言。

 

57、有10億條訂單資料,屬於1000個司機的,請取出訂單量前20的司機

(TIPS)不要中招。不要用常用思路來處理,10億資料 你再怎麼優化,全表求和,都是要死人的。

我們從設計上解決這個問題。只有一千個司機。我們可以做個簡單雜湊,分庫分表,%求餘數。保證這一千個司機分在一千個表裡,每個人有每個人的單獨表。引擎用MYSAIM,求表中資料的總數,效率飛快,遍歷一千張表,求最大前二十即可。

 

58、設計一個微信紅包的功能

沒做過。其實題目表達不清楚。如果做過微信公眾號開發,知道微信事件模型的XML資料結構,應該會好做一點。

 

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

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

參考:https://blog.csdn.net/dong_007_007/article/details/78330337

 

60、php7效能為什麼提升這麼高

不逼逼,直接參考:http://www.laruence.com/php-internal

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

 

61、遍歷一個多維陣列

遞迴。array_map傳入一個回撥函式。

 

62、有這樣一個字串abcdefgkbcdefab......隨機長度,寫一個函式來求bcde在這個字串中出現的次數

substr_count();

 

63、有一個1G大小的一個檔案,裡面每一行是一個詞,詞的大小不超過16個位元組,記憶體限制大小是1M。返回頻數最高的100個詞

方法太多了,但是實現起來 各有各的問題。

我可能只會用HASH對映做。其他的,不會。

參考:第64題。

 

64、十道海量資料處理面試題與十個方法大總結

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

 

65、php程序模型,php怎麼支援多個併發

守護程序模型(需要知道php-fpm的各種配置了)

參考:https://www.jianshu.com/p/542935a3bfa8

 

66、nginx的程序模型,怎麼支援多個併發

這個三言兩語說不清楚。

參考:https://www.zhihu.com/question/22062795

 

67、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

 

68、讓你實現一個簡單的架構,並保持高可用,兩個介面,一個上傳一條文字,一個獲取上傳的內容,你怎麼來設計?要避免單機房故障,同時要讓程式碼層面無感。

參考:分散式架構設計必備CAP原理。

 

69、兩臺mysql伺服器,其中一臺掛了,怎麼讓業務端無感切換,並保證正常情況下講臺伺服器的資料是一致的

不是核心業務的話,先停寫,把備機拉起來,檢視兩臺機器的日誌,進行資料補償,開寫。

如果是核心業務的話,現在所有的寫操作都在正常的狀態機器上。把好的這臺機器的備機拉起來,當主機。

以上全是應急操作。實際上資料庫的容災設計要複雜的多。

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

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

 

70、http協議具體的定義

這種題 有是很難回答的。太寬泛了,我們面試早就不問這種問題了。

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

 

71、什麼是鎖,怎麼解決鎖的問題

計算機原理學的,生產者消費者模型,銀行家模型,都可以解決鎖的問題。

 

72、rand與mt_rand的區別

我實習的時候遇到這個坑。

說是mt_rand比rand快4倍。

在隨機數區間不大的情況下並沒有很大的效率差距。但是出現重複數的機率,rand要比mt_rand高很多。

 

73、mysql事務隔離是怎麼實現的

通過各種行鎖表鎖,各種樂觀鎖悲觀鎖,排他鎖實現的呀。

 

74、mysql的鎖怎麼實現的

https://blog.csdn.net/alexdamiao/article/details/52049993

https://www.cnblogs.com/luyucheng/p/6297752.html

https://blog.csdn.net/tangkund3218/article/details/47704527

 

75、對稱加密和非對稱加密的方式

對稱加密:我們倆共用一個祕鑰,你加密,我解密。

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

擴充套件:橢圓加密演算法。

 

76、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 有問題。

 

77、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機器可以提高效能

參考:

 

78、怎麼解決跨域

  • JSONP
  • 新增響應頭,允許跨域
  • 代理的方式

 

79、json和xml區別,各有什麼優缺點

(1)可讀性方面:基本相同,XML的可讀性比較好;

(2)可擴充套件性方面:都具有良好的擴充套件性;

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

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

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

(6)資料互動方面:JSON與javascript的互動更加方便,更容易解析處理,更好的資料互動;

(7)資料描述方面:XML對資料描述性比較好;

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

參考:https://blog.csdn.net/java19880223/article/details/20054111

 

80、Trait優先順序

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

 

81、a引用b,報錯c裡面類重複定義,迴圈引用會出現什麼問題

 

82、下面員工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;

 

82、在一個座標系內有一個N個點組成的多邊形,現在有一個座標點,寫程式碼或思路來判斷這個點是否處於多邊形內

 

83、資料庫如果出現了死鎖,你怎麼排查,怎麼判斷出現了死鎖?

https://www.cnblogs.com/huanyou/p/5775965.html

 

84、寫一個一個程式來查詢最長子串

http://www.jb51.net/article/128449.htm

 

85、分析一個問題:php-fpm的日誌正常,但客戶端卻超時了,你認為可能是哪裡出了問題,怎麼排查?

檢查nginx log,請求是否達到nginx 和是否正常轉發給 php-fpm

 

86、nginx的工作流程是什麼樣的,可以畫圖描述

 

87、程序間通訊方式有哪些

1)管道 管道分為有名管道和無名管道 無名管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用.程序的親緣關係一般指的是父子關係。無明管道一般用於兩個不同程序之間的通訊。當一個程序建立了一個管道,並呼叫fork建立自己的一個子程序後,父程序關閉讀管道端,子程序關閉寫管道端,這樣提供了兩個程序之間資料流動的一種方式。 有名管道也是一種半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。

2)訊號量 訊號量是一個計數器,可以用來控制多個執行緒對共享資源的訪問.,它不是用於交換大批資料,而用於多執行緒之間的同步.它常作為一種鎖機制,防止某程序在訪問資源時其它程序也訪問該資源.因此,主要作為程序間以及同一個程序內不同執行緒之間的同步手段.

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

4)訊息佇列 訊息佇列是訊息的連結串列,存放在核心中並由訊息佇列識別符號標識.訊息佇列克服了訊號傳遞資訊少,管道只能承載無格式位元組流以及緩衝區大小受限等特點.訊息佇列是UNIX下不同程序之間可實現共享資源的一種機制,UNIX允許不同程序將格式化的資料流以訊息佇列形式傳送給任意程序.對訊息佇列具有操作許可權的程序都可以使用msget完成對訊息佇列的操作控制.通過使用訊息型別,程序可以按任何順序讀資訊,或為訊息安排優先順序順序.

5)共享記憶體 共享記憶體就是對映一段能被其他程序所訪問的記憶體,這段共享記憶體由一個程序建立,但多個程序都可以訪問.共享記憶體是最快的IPC(程序間通訊)方式,它是針對其它程序間通訊方式執行效率低而專門設計的.它往往與其他通訊機制,如訊號量,配合使用,來實現程序間的同步與通訊.

6)套接字:可用於不同及其間的程序通訊

 

88、主從複製,從伺服器會讀取到主伺服器正在回滾的資料嗎?主資料庫寫成功,從伺服器因為一些原因寫失敗,最後會出現什麼情況?主從複製如果鍵衝突怎麼辦?

不會;主從資料不一致;正常是不會出現這種情景,具體看情況,是否可以修復,恢復到之前的時間點,然後追回同步。

 

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

  • 讀未提交(read-uncommitted)
  • 不可重複讀(read-committed)
  • 可重複讀(repeatable-read)
  • 序列化(serializable)

https://www.cnblogs.com/huanongying/p/7021555.html

 

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

https://blog.csdn.net/qq_23217629/article/details/52510485

 

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

 

92、寫一段程式碼,找到所有子集合,如[a,b,c]的子集合有{},{a},{b},{c},{ab},{ac},{abc}

 

93、['a'=>200,'b'=>100,'c'=>100],寫一個自定義排序函式,按值降序,如果值一樣,按鍵排序

氣泡排序

 

94、設計一個快取系統,可以定期或空間佔滿之後自動刪除長期不用的資料,不能使用用遍歷。

我當時的答案是用連結串列來存,快取命中就將該快取移到連結串列頭,然後連結串列尾就都是冷資料了。 我記得之前是在哪裡看過這個設計,但我忘記在連線了,請知道朋友的把連線貼上來。

 

95、==和===的區別,寫出以下輸出:"aa"==1,"bb"==0,1=="1"

  • == 等於,不需要對比資料型別
  • === 全等,需要對比型別

false, true, true

 

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

 

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

 

98、'$var'和"$var"的區別

雙引號串中的內容可以被解釋而且替換,而單引號串中的內容總被認為是普通字元。

在單引號串中甚至反斜槓也失去了他的擴充套件含義(除了插入反斜槓\和插入單引號')。所以,當你想在字串中進行變數代換和包 含\n(換行符)等轉義序列時,你應該使用雙引號。單引號串可以用在其他任何地方,指令碼中使用單引號串處理速度會更快些。

 

99、self和static的區別

static:如果在子類中重寫了父類中的static方法、屬性,父類就會去訪問了子類的static方法

self: 是類內指標,不管子類有沒有重寫過父類中的方法、屬性都指向本類的靜態方法、屬性

 

100、PHP的協程以及用途

http://www.laruence.com/2015/05/28/3038.html

https://blog.csdn.net/gavin_new/article/details/54603490

 

101、描述autoload的機制

https://blog.csdn.net/zhihua_w/article/details/52723402

 

102、mysql中欄位型別各佔幾個位元組:smallint、int、bigint、datetime、varchar(8)

  • smallint 2位元組
  • int 4位元組
  • bigint 8位元組
  • datetime 8位元組
  • varchar(8) 8*3位元組

http://www.jb51.net/article/55853.htm

 

103、哪些屬性唯一確定一條TCP連線

 

104、myisam和innodb的區別,為什麼myisam比innodb快,myisam和innodb的索引資料結構是什麼樣的?innodb主鍵索引和非主鍵索引的區別?其索引上存放的資料是什麼樣的?

區別主要在資料和索引的儲存結構和儲存方式上,以及對於事務的支援。

參考:https://blog.csdn.net/chajinglong/article/details/56666771

 

105、斷開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報文已經全部消失。

https://www.cnblogs.com/zhoudayang/p/6012257.html

 

106、AWK各種資料分析考得非常多,要多練習,題目不再一一寫了

 

107、redis中集合、有序集合、hyperLog、hash的資料結構是啥樣的

key value

 

108、描述一下:一個請求到達nginx的全部處理過程(nginx自身會呼叫哪些邏輯)、然後怎麼與php通訊,中間的流程是什麼樣的等等?

https://www.jianshu.com/p/df89b530db89

https://blog.csdn.net/xiajun07061225/article/details/9309273

 

109、nginx和php-fpm的相關配置,隨便問裡面各種引數啥意思

php-fpm可以通過tcp socket和unix socket兩種方式實現。

https://blog.csdn.net/koastal/article/details/52303316

 

110、假如有一張地圖,如下圖,"-"代表海洋、"+"代表陸地,用你最擅長的方式,取出陸地的座標。

--++----++--+++---
-++++----+++++++--
-+++----++++------
-----++------++++-
---++++++-----+++-
-----+++------+++-

比如上圖在陣列中表示成,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]
]

 

111、Jsonp的實現原理,你還知道哪些跨域方式?

  • JSONP
  • 新增響應頭,允許跨域
  • 代理的方式

 

112、如果某個部落格通過判斷 referer 方式來進行圖片防盜鏈,如何破解?

curl 設定來源地址來欺騙對方伺服器驗證

 

113、簡述 mysql 查詢優化的本質,並舉2個例子

 

114、設計一個秒殺系統,如何保證商品不超賣?

https://blog.csdn.net/zhoudaxia/article/details/38067003

 

115、單例模式的優點是什麼?抽象類是什麼? 還了解哪些設計模式?

單例模式又稱為職責模式,它用來在程式中建立一個單一功能的訪問點,通俗地說就是例項化出來的物件是唯一的。 所有的單例模式至少擁有以下三種公共元素:

  1. 它們必須擁有一個建構函式,並且必須被標記為private
  2. 它們擁有一個儲存類的例項的靜態成員變數
  3. 它們擁有一個訪問這個例項的公共的靜態方法 單例類不能再其它類中直接例項化,只能被其自身例項化。它不會建立例項副本,而是會向單例類內部儲存的例項返回一個引用。

抽象的類不能被例項化。任何一個類,如果它裡面至少有一個方法是被宣告為抽象的,那麼這個類就必須被宣告為抽象的。被定義為抽象的方法只是聲明瞭其呼叫方式(引數),不能定義其具體的功能實現。

https://www.cnblogs.com/kangxl/p/6347179.html

工廠模式 介面卡模式

 

116、鬥地主中,地主比農民得到王炸