今天有空和你們談談遇到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是個考點)
緩存技術是將動態內容緩存到文件中,在必定時間內訪問動態頁面直接調用緩存文件,而沒必要從新訪問數據庫。
使用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 安全性攻擊
防止:
使用mysql_real_escape_string()過濾數據
手動檢查每一數據是否爲正確的數據類型
使用預處理語句並綁定變量
參數化SQL:是指在設計與數據庫連接並訪問數據時,在須要填入數值或數據的地方,使用參數 (Parameter) 來給值,用@或?來表示參數。
XSS攻擊 :跨站點腳本攻擊,由用戶輸入一些數據到你的網站,其中包括客戶端腳本(一般JavaScript)。若是你沒有過濾就輸出數據到另外一個web頁面,這個腳本將被執行。
防止:爲了防止XSS攻擊,使用PHP的htmlentities()函數過濾再輸出到瀏覽器。
防止:通常來講,確保用戶來自你的表單,而且匹配每個你發送出去的表單。有兩點必定要記住:
對用戶會話採用適當的安全措施,例如:給每個會話更新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技術交流羣