1. 程式人生 > 實用技巧 >【新】常見的PHP面試題型彙總(含答案)

【新】常見的PHP面試題型彙總(含答案)

1、氣泡排序,面試前一定要記住哦!

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]) {
                $tmp = $arr[$j];
                $arr[$j] = $arr[$j + 1];
                $arr[$j + 1] = $tmp;
            }
        }
    }
    return $arr;
}

Github

2、快速排序,面試前一定要記住哦!

function quick_sort($array) {
    if (count($array) <= 1) return $array;
    $key = $array[0];
    $left_arr = array();
    $right_arr = array();
    for ($i=1; $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);

}

3、請說明 PHP 中傳值與傳引用的區別,什麼時候傳值什麼時候傳引用?

按值傳遞:函式範圍內對值的任何改變在函式外部都會被忽略

按引用傳遞:函式範圍內對值的任何改變在函式外部也能反映出這些修改

優缺點:按值傳遞時,php必須複製值。特別是對於大型的字串和物件來說,這將會是一個代價很大的操作。按引用傳遞則不需要複製值,對於效能提高很有好處。(優缺點會考到)

4、MySQL資料庫中的欄位型別varchar和char的主要區別是什麼?

Varchar是變長,節省儲存空間,char是固定長度。查詢效率要char型快,因為varchar是非定長,必須先查詢長度,然後進行資料的提取,比char定長型別多了一個步驟,所以效率低一些。

5、MySQL資料庫的常用儲存引擎以及它們的區別?

MyISAM:不支援事務,表鎖,易產生碎片,要經常優化,讀寫速度較快,支援全文索引。

InnoDB:支援事務,行鎖,有崩潰恢復能力。讀寫速度比MyISAM慢,5.6之後支援全文索引。

儲存引擎是基於表的,而不是資料庫

(這道題還能更詳細點就詳細點)

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

首先,確認伺服器硬體是否足夠支援當前的流量

其次,優化資料庫訪問。

第三,禁止外部的盜鏈。

第四,控制大檔案的下載。

第五,使用不同主機分流主要流量

第六,使用流量分析統計軟體

第七,儘量使用靜態頁,快取

7、什麼是面向物件?主要特徵是什麼?

面向物件是程式的一種設計方式,它利於提高程式的重用性,使程式結構更加清晰。主要特徵:封裝、繼承、多型。

8、SESSION 與 COOKIE的區別是什麼?這是重點

SESSION儲存在伺服器端,COOKIE儲存在客戶端。Session比較安全,cookie用某些手段可以修改,不安全。Session依賴於cookie進行傳遞。禁用cookie後,session還可以使用,在儲存session的檔案中,生成sessionID,通過get傳參的方式將sessionID傳到要實現session共享的頁面,讀取sessionID,從而從session中獲取資料。

建議查詢session與cookie這方面的詳細教程

9、對快取技術的瞭解?redis是個考點

(1)快取技術是將動態內容快取到檔案中,在一定時間內訪問動態頁面直接呼叫快取檔案,而不必重新訪問資料庫。

(2)使用memcache可以做快取。

10、表單中get和post提交方式的區別

get是顯式的,資料從url中可以看到,傳輸的資料量小,安全性低;

post是隱式的,傳送的資料量較大,安全性較高

11、優化資料庫的方法

  • 選取最適用的欄位屬性,儘可能減少定義欄位寬度,儘量把欄位設定NOTNULL
  • 使用連線(JOIN)來代替子查詢
  • 適用聯合(UNION)來代替手動建立的臨時表
  • 事務處理
  • 鎖定表、優化事務處理
  • 使用外來鍵,優化鎖定表
  • 使用索引
  • 優化查詢語句

12、語句include和require的區別是什麼?語句include和require的區別是什麼?

require是無條件包含,也就是如果一個流程里加入require,無論條件成立與否都會先執行require,當檔案不存在或者無法開啟的時候,會提示錯誤,並且會終止程式執行

include有返回值,而require沒有(可能因為如此require的速度比include快),如果被包含的檔案不存在的化,那麼會提示一個錯誤,但是程式會繼續執行下去

13、redis和memcacahe、mongoDB的區別?

都是非關係型資料庫,效能都非常高,但是mongoDB和memcache、redis是不同的兩種型別。後兩者主要用於資料的快取,前者主要用在查詢和儲存大資料方面,是最接近資料庫的文件型的非關係資料庫。

從資料儲存位置上來分,memcache的資料存在記憶體中,而redis既可以儲存在記憶體中,也可以儲存的到磁碟中,達到持久化儲存的功能,memcache一旦斷電,資料全部丟失,redis可以利用快照和AOF把資料存到磁碟中,當恢復時又從磁碟中讀取到記憶體中,當實體記憶體使用完畢後,可以把資料寫入到磁碟中。

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

14、PHP的基本變數型別

四種標量型別:boolean (布林型)、integer (整型)、float (浮點型, 也稱作 double)、string (字串)

兩種複合型別:array (陣列)、object (物件)

最後是兩種特殊型別:resource(資源)、NULL(NULL)

15、靜態化如何實現的?偽靜態如何實現?

(1) 靜態化指的是頁面靜態化,也即生成實實在在的靜態檔案,也即不需要查詢資料庫就可以直接從檔案中獲取資料,指的是真靜態。

實現方式主要有兩種:

一種是我們在新增資訊入庫的時候就生成的靜態檔案,也稱為模板替換技術。

一種是使用者在訪問我們的頁面時先判斷是否有對應的快取檔案存在,如果存在就讀快取,不存在就讀資料庫,同時生成快取檔案。

(2)偽靜態不是真正意義上的靜態化,之所以使用偽靜態,主要是為了SEO推廣,搜尋引擎對動態的檔案獲取難度大,不利於網站的推廣。實習原理是基於Apache或Nginx的rewrite機智

主要有兩種方式:

  1. 一種是直接在配置虛擬機器的位置配置偽靜態,這個每次修改完成後需要重啟web伺服器。
  2. 另一種採用分散式的,可以在網站的根目錄上建立.htaccess的檔案,在裡面配置相應的重寫規則來實現偽靜態,這種每次重寫時不需要重啟web伺服器,且結構上比較清晰。

16、Mysql的讀寫分離?(進階的會遇到)

讀寫分離的實現原理就是在執行SQL語句的時候,判斷到底是讀操作還是寫操作,把讀的操作轉向到讀伺服器上(從伺服器,一般是多臺),寫的操作轉到寫的伺服器上(主伺服器,一般是一臺,視資料量來看)。當然為了保證多臺資料庫資料的一致性,需要主從複製。

17、如何處理負載,高併發?

(1)HTML靜態化

效率最高、消耗最小的就是純靜態化的html頁面,所以我們儘可能使我們的 網站上的頁面採用靜態頁面來實現,這個最簡單的方法其實也是最有效的方法。

(2)圖片伺服器分離

把圖片單獨儲存,儘量減少圖片等大流量的開銷,可以放在一些相關的平臺上,如七牛等

(3)資料庫叢集和庫表雜湊及快取

資料庫的併發連線為100,一臺資料庫遠遠不夠,可以從讀寫分離、主從複製,資料庫叢集方面來著手。另外儘量減少資料庫的訪問,可以使用快取資料庫如memcache、redis。

(4)映象:

儘量減少下載,可以把不同的請求分發到多個映象端。

(5)負載均衡:

Apache的最大併發連線為1500,只能增加伺服器,可以從硬體上著手,如F5伺服器。當然硬體的成本比較高,我們往往從軟體方面著手。

18、說一下單引號雙引號?(基礎考點)

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

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

單引號只能解析部分特殊字元,雙引號可以解析所有特殊字元。

19、PHP7的新特性?重點

  • 標量型別宣告:PHP 7 中的函式的形參型別宣告可以是標量了。在 PHP 5 中只能是類名、介面、array 或者 callable (PHP 5.4,即可以是函式,包括匿名函式),現在也可以使用 string、int、float和 bool 了。
  • 返回值型別宣告:增加了對返回型別宣告的支援。 類似於引數型別宣告,返回型別宣告指明瞭函式返回值的型別。可用的型別與引數宣告中可用的型別相同。
  • NULL 合併運算子:由於日常使用中存在大量同時使用三元表示式和 isset()的情況,NULL 合併運算子使得變數存在且值不為NULL, 它就會返回自身的值,否則返回它的第二個運算元。
  • use 加強:從同一 namespace 匯入的類、函式和常量現在可以通過單個 use 語句 一次性匯入了
  • 匿名類:現在支援通過new class 來例項化一個匿名類

20、PHP 陣列排序

  • sort() - 以升序對陣列排序
  • rsort() - 以降序對陣列排序
  • asort() - 根據值,以升序對關聯陣列進行排序
  • ksort() - 根據鍵,以升序對關聯陣列進行排序
  • arsort() - 根據值,以降序對關聯陣列進行排序
  • krsort() - 根據鍵,以降序對關聯陣列進行排序

21、建立索引

(普通索引)->
建立:CREATE INDEX <索引名> ON tablename (索引欄位)
修改:ALTER TABLE tablename ADD INDEX [索引名] (索引欄位)
創表指定索引:CREATE TABLE tablename([...],INDEX[索引名](索引欄位))
(唯一索引)->
建立:CREATE UNIQUE <索引名> ON tablename (索引欄位)
修改:ALTER TABLE tablename ADD UNIQUE [索引名] (索引欄位)
創表指定索引:CREATE TABLE tablename([...],UNIQUE[索引名](索引欄位))
(主鍵)->
它是唯一索引,一般在建立表是建立,格式為:
CREATA TABLE tablename ([...],PRIMARY KEY[索引欄位])

22、PHP支援多繼承嗎?

不支援。PHP中只允許單繼承,父類可以被一個子類用關鍵字“extends”繼承。

23、使用過Memcache快取嗎,如果使用過,能夠簡單的描述一下它的工作原理嗎?

Memcahce是把所有的資料儲存在記憶體當中,採用hash表的方式,每條資料又key和value組成,每個key是獨一無二的,當要訪問某個值的時候先按照找到值,然後返回結果。

Memcahce採用LRU演算法來逐漸把過期資料清除掉。

24、優化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).使用事務和外來鍵

25、MySQL主從備份的原理?

mysql支援單向、非同步複製,複製過程中一個伺服器充當主伺服器,而一個或多個其它伺服器充當從伺服器。

26、error_reporting() 的作用?

設定 PHP 的報錯級別並返回當前級別。

27、如何修改session的生存時間

在php.ini 中設定 session.gc_maxlifetime = 1440 //預設時

程式碼實現

$lifeTime = 24 * 3600;  // 儲存一天
session_set_cookie_params($lifeTime);
session_start();

28、常見的 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的遠端檔案

點關注,不迷路

好了各位,以上就是這篇文章的全部內容了,能看到這裡的人呀,都是人才。之前說過,PHP方面的技術點很多,也是因為太多了,實在是寫不過來,寫過來了大家也不會看的太多,所以我這裡把它整理成了PDF和文件,如果有需要的可以

點選進入暗號:

更多學習內容可以訪問【對標大廠】精品PHP架構師教程目錄大全,只要你能看完保證薪資上升一個臺階(持續更新)

以上內容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務程式碼寫多了沒有方向感,不知道該從那裡入手去提升,對此我整理了一些資料,包括但不限於:分散式架構、高可擴充套件、高效能、高併發、伺服器效能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell指令碼、Docker、微服務、Nginx等多個知識點高階進階乾貨需要的可以免費分享給大家,需要的可以加入我的PHP技術交流群953224940