PHP高級工程面試題彙總(2018.05)

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

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

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

/*
 *單鏈表的結點類
 */
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;
    }
}

三、寫一個函數,獲取一篇文章內容中的所有圖片,並下載java

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

}

四、獲取當前客戶端的IP地址,並判斷是否在(111.111.111.111,222.222.222.222)mysql

若是沒有使用代理服務器:linux

$ip = $_SERVER['REMOTE_ADDR'];nginx

使用透明代理laravel

$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];git

參考文章github

http://www.noobyard.com/article/p-tsaaveew-cs.html

五、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地址?

六、什麼是CSRF攻擊?XSS攻擊?如何防範?

CSRF:跨站請求僞造,能夠經過經過判斷來源和加 Token 的方式來防範。

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

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

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

參考文章:

http://www.noobyard.com/article/p-btvntswn-cd.html

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

八、從撲克牌中隨機抽5張牌,判斷是否是一個順子,即這5張牌是連續的

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

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

思想:

  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

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

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

十二、MYSQL中主鍵與惟一索引的區別

主鍵:絕對不能有空值。惟一索引:能夠有空值

參考:http://www.noobyard.com/article/p-qeezgoib-bp.html

1三、http與https的主要區別

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

參考:http://www.noobyard.com/article/p-rwlfpnpb-bg.html

1四、http狀態碼及其含意

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

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

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

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

1九、數據庫中的事務是什麼?

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

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

20、寫一個函數,儘量高效的從一個標準URL中取出文件的擴展名

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

2一、參數爲多個日期時間的數組,返回離當前時間最近的那個時間

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

2二、echo、print、print_r的區別

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

至於他們具體的區別參考:http://www.noobyard.com/article/p-yysimklw-bb.html

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

這個問題,很難。一會半會說不清楚。若是作過PHP restful 接口開發,也踩過這裏面的坑,那應該是能夠答出來經常使用的幾個KEY的。

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

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

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

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

2五、PHP的數組和C語言的數組結構上有何區別?

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

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

2六、Redis的跳躍表怎麼實現的

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

參考:http://www.noobyard.com/article/p-ovzxrfeo-hn.html

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

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

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

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

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

3二、 找出數組中不重複的值[1,2,3,3,2,1,5]

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

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

3四、PHP的的這種弱類型變量是怎麼實現的?

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

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

3五、在HTTP通信過程當中,是客戶端仍是服務端主動斷開鏈接?

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

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

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

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

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

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

參考:http://www.noobyard.com/article/p-guunuxkt-gd.html

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引擎的區別

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

參考:http://www.noobyard.com/article/p-ompqekod-do.html

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索引差異仍是很大的

參考: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

5一、數據庫中的存放了用戶ID,扣費不少行,redis中存放的是用戶的錢包,如今要寫一個腳本,將數據庫中的扣費記錄同步到redis中,每5分鐘執行一次。請問要考慮哪些問題?

思路:生產者和消費者模式。這個問題也沒有說其餘的狀態,好比數據庫的數據會實時增長麼?redis中每一個錢包是否有其餘服務在讀取或者寫入啊。什麼的。數據庫和REDIS放一塊兒,要麼考數據一致性,要麼考出現鎖,致使效率下降。

5二、MYSQL主從服務器,若是主服務器是innodb引擎,從服務器是myisam引擎,在實際應用中,會遇到什麼問題?

不知道,沒用過,爲何這麼設計?故意給本身找不愉快?

5三、linux中進程信號有哪些?

kill -l 不多用

5四、redis的底層實現

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

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

這篇文章 要多讀幾遍。

5五、異步模型

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

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

狗東某風控研發必考題。

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

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

60、php7性能爲何提高這麼高

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

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

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的各類配置了)

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

6六、nginx的進程模型,怎麼支持多個併發

這個三言兩語說不清楚。

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

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的鎖怎麼實現的

http://www.noobyard.com/article/p-qlrvrvnl-u.html

http://www.noobyard.com/article/p-tbwjwyms-k.html

http://www.noobyard.com/article/p-xlndzfmw-dy.html

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。

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

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三、數據庫若是出現了死鎖,你怎麼排查,怎麼判斷出現了死鎖?

http://www.noobyard.com/article/p-ehwilgat-bb.html

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

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

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)

http://www.noobyard.com/article/p-mkytlkgs-bp.html

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

http://www.noobyard.com/article/p-eogmpgdm-km.html

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的協程以及用途

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

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

10一、描述autoload的機制

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

10二、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

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

10四、myisam和innodb的區別,爲何myisam比innodb快,myisam和innodb的索引數據結構是什麼樣的?innodb主鍵索引和非主鍵索引的區別?其索引上存放的數據是什麼樣的?

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

參考:http://www.noobyard.com/article/p-ompqekod-do.html

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報文已經所有消失。

http://www.noobyard.com/article/p-besqnvlu-cd.html

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

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

key value

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

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

http://www.noobyard.com/article/p-vtvqisbn-kx.html

10九、nginx和php-fpm的相關配置,隨便問裏面各類參數啥意思

php-fpm能夠經過tcp socket和unix socket兩種方式實現。

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

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四、設計一個秒殺系統,如何保證商品不超賣?

http://www.noobyard.com/article/p-wlpavahf-mg.html

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

單例模式又稱爲職責模式,它用來在程序中建立一個單一功能的訪問點,通俗地說就是實例化出來的對象是惟一的。 全部的單例模式至少擁有如下三種公共元素:

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

抽象的類不能被實例化。任何一個類,若是它裏面至少有一個方法是被聲明爲抽象的,那麼這個類就必須被聲明爲抽象的。被定義爲抽象的方法只是聲明瞭其調用方式(參數),不能定義其具體的功能實現。

http://www.noobyard.com/article/p-rjihmivj-dc.html

工廠模式 適配器模式

11六、鬥地主中,地主比農民獲得王炸的機率多多少?