2019年高級程序員面試題收集

1.用正則 寫出以139開頭的手機號碼:
$str = '13812345678';
$pattern = '/^139\d{8}$/';
preg_match($pattern,$str,$macth);
var_dump($macth);php

2.用PHP方式對目錄進行遍歷html

  $dir = './test';mysql

function loopDir($dir){
$handle = opendir($dir);
while(false !==($file =readdir($handle))){
if($file!='.'&&$file!='..'){
echo $file."<br>";
if(filetype($dir.'/'.$file)=='dir'){
loopDir($dir.'/'.$file);
}
}
}
}

loopDir($dir);

3.冒泡排序:
function maopao($arr){
    $len = count($arr);
    $n = count($arr)-1;
    for($i=0;$i<$len;$i++){
        for($j=0;$j<$n;$j++){
            if($arr[$j]<$arr[$j+1]){
                $temp = $arr[$j+1];
                $arr[$j+1] = $arr[$j];
                $arr[$j] =$temp;
            }
        }
    }
    return $arr;
}
 

4.快速排序laravel

function quick_sort($array) {

    if (count($array) <= 1) return $array;

    $key = $array[0];

    $left_arr = array();

    $right_arr = array();

    for ($i=1; $i<count($array); $i++){

        if ($array[$i] <= $key)

            $left_arr[] = $array[$i];

        else

            $right_arr[] = $array[$i];

    }

    $left_arr = quick_sort($left_arr);

    $right_arr = quick_sort($right_arr);

    return array_merge($left_arr, array($key), $right_arr);

}

5.MySQL數據庫中的字段類型varchar和char的主要區別是什麼?web

char和varchar最大的不一樣就是一個是固定長度,一個是可變長度.因爲是可變長度,所以存儲的是實際字符串再加上一個記錄字符串長度的字節。若是分配給char或varchar列的值超過 列的最大長度,則對值進行裁剪.ajax

varchar(M)和char(M),M都表示字符數.varchar的最大長度爲65535個字節,不一樣的編碼所對應的最大可存儲的字符數不一樣.char最多能夠存放255個字符,不一樣的編碼最大可用字節數不一樣redis

6.對於大流量的網站,採用什麼樣的方法來解決訪問量問題?sql

  1. 確認服務器硬件是否足夠支持當前的流量
  2. 優化數據庫訪問。
  3. 禁止外部的盜鏈。
  4. 控制大文件的下載。
  5. 使用不一樣主機分流主要流量
  6. 使用流量分析統計軟件
  7. 儘可能使用靜態頁,緩存

7.什麼是面向對象?主要特徵是什麼?數據庫

面向對象是程序的一種設計方式,它利於提升程序的重用性,使程序結構更加清晰。主要特徵:封裝、繼承、多態。瀏覽器

8.SESSION 與 COOKIE的區別是什麼?

SESSION存儲在服務器端,COOKIE保存在客戶端。Session比較安全,cookie用某些手段能夠修改,不安全。Session依賴於cookie進行傳遞。禁用cookie後,session還可使用,在存儲session的文件中,生成sessionID,經過get傳參的方式將sessionID傳到要實現session共享的頁面,讀取sessionID,從而從session中獲取數據。

9.優化mysql數據庫的方法

              1,數據表中的數據類型的優化  如選擇合適的字段,選擇效率快速的字段 

    2,索引優化

    三、SQL語句的優化

      (1)優化查詢過程當中的數據訪問如使用limit、使用返回列不用*

      (2)優化長難句的查詢語句 變複雜爲簡單、切分查詢、分解關聯查詢

      (3)優化特定類型的查詢語句如優化count()、優化關聯查詢、優化子查詢、優化Group by、優化limit

    四、存儲引擎的優化

      (1)儘可能使用InnoDB存儲引擎,由於它支持事務、外鍵、使用獨立表空間、使用的是行級鎖、

    五、數據表結構的設計優化

      (1)分區操做 如經過特定的策略對數據進行物理拆分、對用戶透明的、partition by

      (2)分庫分表  如水平拆分(以行級進行拆分)、垂直拆分(列及拆分)

    六、數據架構的優化

      (1)主從複製

      (2)讀寫分離

      (3)雙主熱備

      (4)負載均衡  經過LVS的三種模式實現的、Mycat數據庫中間件實現的

9.redis和memcacahe、mongoDB的區別?

 都是非關係型數據庫,性能都很是高,可是mongoDB和memcache、redis是不一樣的兩種類型。後二者主要用於數據的緩存,前者主要用在查詢和儲存大數據方面,是最接近數據庫的文檔型的非關係數據庫。

 從數據存儲位置上來分,memcache的數據存在內存中,而redis既能夠存儲在內存中,也能夠存儲的到磁盤中,達到持久化存儲的功能,memcache一旦斷電,數據所有丟失,redis能夠利用快照和AOF把數據存到磁盤中,當恢復時又從磁盤中讀取到內存中,當物理內存使用完畢後,能夠把數據寫入到磁盤中。

 從存儲數據的類型上來分,memcache和redis存儲的方式都是鍵值對,只不過redis值的類型比較豐富,有string(字符串),hash(哈希),list(列表),set(集合)zset(有序集合),而memcache主要存儲的是字符串。

10.靜態化如何實現的?僞靜態如何實現?

一、 靜態化指的是頁面靜態化,也即生成實實在在的靜態文件,也即不須要查詢數據庫就能夠直接從文件中獲取數據,指的是真靜態。
實現方式主要有兩種:

 一種是咱們在添加信息入庫的時候就生成的靜態文件,也稱爲模板替換技術。

  一種是用戶在訪問咱們的頁面時先判斷是否有對應的緩存文件存在,若是存在就讀緩存,不存在就讀數據庫,同時生成緩存文件。

二、僞靜態不是真正意義上的靜態化,之因此使用僞靜態,主要是爲了SEO推廣,搜索引擎對動態的文件獲取難度大,不利於網站的推廣。實習原理是基於Apache或Nginx的rewrite機智
  主要有兩種方式:

    一種是直接在配置虛擬機的位置配置僞靜態,這個每次修改完成後須要重啓web服務器。

   另外一種採用分佈式的,能夠在網站的根目錄上建立.htaccess的文件,在裏面配置相應的重寫規則來實現僞靜態,這種每次重寫時不須要重啓web服務器,且結構上比較清晰。

11.如何處理負載,高併發

一、HTML靜態化
效率最高、消耗最小的就是純靜態化的html頁面,因此咱們儘量使咱們的 網站上的頁面採用靜態頁面來實現,這個最簡單的方法其實也是最有效的方法。
二、圖片服務器分離
把圖片單獨存儲,儘可能減小圖片等大流量的開銷,能夠放在一些相關的平臺上,如七牛等
三、數據庫集羣和庫表散列及緩存
數據庫的併發鏈接爲100,一臺數據庫遠遠不夠,能夠從讀寫分離、主從複製,數據庫集羣方面來着手。另外儘可能減小數據庫的訪問,可使用緩存數據庫如memcache、redis。
四、鏡像:
儘可能減小下載,能夠把不一樣的請求分發到多個鏡像端。
五、負載均衡:
Apache的最大併發鏈接爲1500,只能增長服務器,能夠從硬件上着手,如F5服務器。固然硬件的成本比較高,咱們每每從軟件方面着手。

12.Mysql的讀寫分離?

讀寫分離的實現原理就是在執行SQL語句的時候,判斷究竟是讀操做仍是寫操做,把讀的操做轉向到讀服務器上(從服務器,通常是多臺),寫的操做轉到寫的服務器上(主服務器,通常是一臺,視數據量來看)。

13.說一下單引號雙引號?

單引號內部的變量不會執行, 雙引號會執行

單引號解析速度比雙引號快。

單引號只能解析部分特殊字符,雙引號能夠解析全部特殊字符。

14.優化MYSQL數據庫的方法

(1)選擇最有效率的表名順序

(2)WHERE子句中的鏈接順序

(3)SELECT子句中避免使用‘*’

(4)用Where子句替換HAVING子句

(5)經過內部函數提升SQL效率

(6)避免在索引列上使用計算。

(7)提升GROUP BY 語句的效率, 能夠經過將不須要的記錄在GROUP BY 以前過濾掉。

  (1).選取最適用的字段屬性,應該儘可能把字段設置爲NOT NULL

  (2).使用鏈接(JOIN)來代替子查詢(Sub-Queries)

  (3).使用聯合(UNION)來代替手動建立的臨時表

  (4).儘可能少使用 LIKE 關鍵字和通配符

  (5).使用事務和外鍵

15.常見的 PHP 安全性攻擊

SQL注入:用戶利用在表單字段輸入SQL語句的方式來影響正常的SQL執行。
防止

使用mysql_real_escape_string()過濾數據

手動檢查每一數據是否爲正確的數據類型

使用預處理語句並綁定變量

參數化SQL:是指在設計與數據庫連接並訪問數據時,在須要填入數值或數據的地方,使用參數 (Parameter) 來給值,用@或?來表示參數。

XSS攻擊 :跨站點腳本攻擊,由用戶輸入一些數據到你的網站,其中包括客戶端腳本(一般JavaScript)。若是你沒有過濾就輸出數據到另外一個web頁面,這個腳本將被執行。
防止:爲了防止XSS攻擊,使用PHP的htmlentities()函數過濾再輸出到瀏覽器。

CSRF:跨站點請求僞造,是指一個頁面發出的請求,看起來就像是網站的信任用戶,可是是僞造的
防止:通常來講,確保用戶來自你的表單,而且匹配每個你發送出去的表單。有兩點必定要記住:

對用戶會話採用適當的安全措施,例如:給每個會話更新id和用戶使用SSL。

生成另外一個一次性的令牌並將其嵌入表單,保存在會話中(一個會話變量),在提交時檢查它。 如laravel中的 _token

代碼注入:代碼注入是利用計算機漏洞經過處理無效數據形成的。問題出在,當你不當心執行任意代碼,一般經過文件包含。寫得很糟糕的代碼能夠容許一個遠程文件包含並執行。如許多PHP函數,如require能夠包含URL或文件名。
防止代碼注入

過濾用戶輸入

在php.ini中設置禁用allow_url_fopen和allow_url_include。這將禁用require/include/fopen的遠程文件

16.請簡述一下數據庫的優化?

數據庫的優化能夠從四個方面來優化:

 

1.從結構層: web服務器採用負載均衡服務器,mysql服務器採用主從複製,讀寫分離

 

2.從儲存層: 採用合適的存儲引擎,採用三範式

 

3.從設計層: 採用分區分表,索引,表的字段採用合適的字段屬性,適當的採用逆範式,開啓mysql緩存

 

4.sql語句層:結果同樣的狀況下,採用效率高,速度快節省資源的sql語句執行

17.怎麼保證促銷商品不會超賣?

使用redis的隊列來實現。將要促銷的商品數量以隊列的方式存入redis中,每當用戶搶到一件促銷商品則從隊列中刪除一個數據,確保商品不會超賣。這個操做起來很方便,並且效率極高。

18.商城秒殺的實現?

搶購、秒殺是現在很常見的一個應用場景,主要須要解決的問題有兩個:

1 高併發對數據庫產生的壓力

2 競爭狀態下如何解決庫存的正確減小("超賣"問題)

對於第一個問題,已經很容易想到用緩存來處理搶購,避免直接操做數據庫,例如使用Redis。第二個問題,咱們可使用redis隊列來完成,把要秒殺的商品放入到隊列中,由於pop操做是原子的,即便有不少用戶同時到達,也是依次執行,文件鎖和事務在高併發下性能降低很快,固然還要考慮其餘方面的東西,好比搶購頁面作成靜態的,經過ajax調用接口,其中也可能會出現一個用戶搶屢次的狀況,這時候須要再加上一個排隊隊列和搶購結果隊列及庫存隊列。高併發狀況下,將用戶進入排隊隊列,用一個線程循環處理從排隊隊列取出一個用戶,判斷用戶是否已在搶購結果隊列,若是在,則已搶購,不然未搶購,庫存減1,寫數據庫,將用戶入結果隊列。

19.購物車的原理?

相關文章
相關標籤/搜索