遇到PHP面試常見的題型,你是如何作的呢

學習方法與經驗交流

今天有空和你們談談遇到PHP面試常見的題型,你是如何作的呢?php

記得我第一次面試PHP這個崗位的時候,哪一個時候剛從學校出來混,不知道啥行情啊,又是零經驗的(這裏插一句,零經驗的,若是你歷來都沒接觸過開發一個完整的,或者半成品的項目,公司通常是不會要的,由於公司招你進去,是要你會幫忙作東西,實現公司的業務與業績的提高的)。那個時候我就直接說試用期800元了,固然,好多年前的了哈!也是一個至關低的價位的,因此公司直接就要了!!!道理很簡單,你們都懂的!html

在公司裏作項目,成長是一個過程,提高你本身的學習技能更是一個關鍵所在的。進入公司以前,你會有一兩輪的面試與筆試,作咱們這個行業的都是這樣,因此除了口語表達能力(能吹)以外,還有一點就是實力能力的,這個也是你的面試題所要體現的。面試題的題型不少,可是都是離不開PHP基礎的。一些剛出來的可能不懂試題的。告訴你一個方法,那個時候我真的用了!就是把全部題型都背下來了!方法很老套又不切合實際。可是頗有用,由於常見的題型都遇到了~~多是幸運吧!mysql

可能學習各有各的方法!我之前就是那樣子過來的!如今呢,仍是要繼續的學習與提高技能,活到老學到老!一旦進坑了,很難出來!laravel

如下推薦一些面試常見的試題,但願對你有用,還有就是不少之前發過的面試題,學習方法,學習流程,視頻教程都整理在PHP自學中心公衆號的導航欄裏咯,但願對你們有一些幫助吧!今天吹本身的學習方法與交流,能夠借鑑!!web

一、冒泡排序(面試前必定要記住哦!)面試

function bubble_sort($array){
    $count = count($array);
    if ($count <= 0) return false;
    for($i=0; $i<$count; $i++){
        for($j=$i; $j<$count-1; $j++){
            if ($array[$i] > $array[$j]){
                $tmp = $array[$i];
                $array[$i] = $array[$j];
                $array[$j] = $tmp;
            }
        }
    }
    return $array;
}

二、快速排序(面試前必定要記住哦!)redis

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

三、請說明 PHP 中傳值與傳引用的區別,何時傳值何時傳引用?算法

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

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

  • 優缺點:按值傳遞時,php必須複製值。特別是對於大型的字符串和對象來講,這將會是一個代價很大的操做。按引用傳遞則不須要複製值,對於性能提升頗有好處。(優缺點會考到)

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

Varchar是變長,節省存儲空間,char是固定長度。查找效率要char型快,由於varchar是非定長,必須先查找長度,而後進行數據的提取,比char定長類型多了一個步驟,因此效率低一些。

五、MySQL數據庫的經常使用存儲引擎以及它們的區別?

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

  • InnoDB:支持事務,行鎖,有崩潰恢復能力。讀寫速度比MyISAM慢,5.6以後支持全文索引。
    存儲引擎是基於表的,而不是數據庫

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

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

  • 首先,確認服務器硬件是否足夠支持當前的流量

  • 其次,優化數據庫訪問。

  • 第三,禁止外部的盜鏈。

  • 第四,控制大文件的下載。

  • 第五,使用不一樣主機分流主要流量

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

  • 第七,儘可能使用靜態頁,緩存

七、什麼是面向對象?主要特徵是什麼?

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

八、SESSION 與 COOKIE的區別是什麼?(這是重點)

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

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

九、對緩存技術的瞭解?(redis是個考點)

  1. 緩存技術是將動態內容緩存到文件中,在必定時間內訪問動態頁面直接調用緩存文件,而沒必要從新訪問數據庫。

  2. 使用memcache能夠作緩存。

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

  • get是顯式的,數據從url中能夠看到,傳輸的數據量小,安全性低;

  • post是隱式的,傳送的數據量較大,安全性較高

十一、優化數據庫的方法

  • 選取最適用的字段屬性,儘量減小定義字段寬度,儘可能把字段設置NOTNULL

  • 使用鏈接(JOIN)來代替子查詢

  • 適用聯合(UNION)來代替手動建立的臨時表

  • 事務處理

  • 鎖定表、優化事務處理

  • 使用外鍵,優化鎖定表

  • 使用索引

  • 優化查詢語句

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

  • require是無條件包含,也就是若是一個流程里加入require,不管條件成立與否都會先執行require,當文件不存在或者沒法打開的時候,會提示錯誤,而且會終止程序執行

  • include有返回值,而require沒有(可能由於如此require的速度比include快),若是被包含的文件不存在的化,那麼會提示一個錯誤,可是程序會繼續執行下去

1三、redis和memcacahe、mongoDB的區別?

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

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

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

1四、PHP的基本變量類型

四種標量類型:boolean (布爾型)、integer (整型)、float (浮點型, 也稱做 double)、string (字符串)

兩種複合類型:array (數組)、object (對象)

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

1五、靜態化如何實現的?僞靜態如何實現?

① 靜態化指的是頁面靜態化,也即生成實實在在的靜態文件,也即不須要查詢數據庫就能夠直接從文件中獲取數據,指的是真靜態。

實現方式主要有兩種:

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

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

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

主要有兩種方式:

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

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

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

讀寫分離的實現原理就是在執行SQL語句的時候,判斷究竟是讀操做仍是寫操做,把讀的操做轉向到讀服務器上(從服務器,通常是多臺),寫的操做轉到寫的服務器上(主服務器,通常是一臺,視數據量來看)。固然爲了保證多臺數據庫數據的一致性,須要主從複製。

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

① HTML靜態化

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

② 圖片服務器分離

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

③ 數據庫集羣和庫表散列及緩存

數據庫的併發鏈接爲100,一臺數據庫遠遠不夠,能夠從讀寫分離、主從複製,數據庫集羣方面來着手。另外儘可能減小數據庫的訪問,可使用緩存數據庫如memcache、redis。

④ 鏡像:

儘可能減小下載,能夠把不一樣的請求分發到多個鏡像端。

⑤ 負載均衡:

Apache的最大併發鏈接爲1500,只能增長服務器,能夠從硬件上着手,如F5服務器。固然硬件的成本比較高,咱們每每從軟件方面着手。

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

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

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

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

1九、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() - 根據鍵,以降序對關聯數組進行排序

2一、創建索引

- (普通索引)->

  - 建立: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[索引字段])

2二、PHP支持多繼承嗎?

不支持。PHP中只容許單繼承,父類能夠被一個子類用關鍵字「extends」繼承。

2三、使用過Memcache緩存嗎,若是使用過,可以簡單的描述一下它的工做原理嗎?

Memcahce是把全部的數據保存在內存當中,採用hash表的方式,每條數據又key和value組成,每一個key是獨一無二的,當要訪問某個值的時候先按照找到值,而後返回結果。

Memcahce採用LRU算法來逐漸把過時數據清除掉。

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

2五、MySQL主從備份的原理?

mysql支持單向、異步複製,複製過程當中一個服務器充當主服務器,而一個或多個其它服務器充當從服務器。

2六、error_reporting() 的做用?

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

2七、如何修改session的生存時間

  • 在php.ini 中設置 session.gc_maxlifetime = 1440 //默認時間

  • 代碼實現

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

2八、常見的 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+「平臺」

在這裏插入圖片描述

在這裏插入圖片描述


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

以上內容但願幫助到你們,不少PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那裏入手去提高,對此我整理了一些資料,包括但不限於:分佈式架構、高可擴展、高性能、高併發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階乾貨須要的能夠免費分享給你們,須要的能夠加入個人 PHP技術交流羣

相關文章
相關標籤/搜索