2019年PHP面試題附答案(實戰經驗)

 

  出於一些緣由近期作了一次工做變更,在職交接近一個半月時間大概面試了十五家公司,而且獲得了本身比較滿意的offer,最後基本上無縫銜接了新工做。整體來講,雖然準備的很充分,但面試期間仍是暴露了許多問題,因此作下總結,供你們和本身之後參考,主要分四部分講述: 簡歷方面,格式內容包括七個板塊,我的簡介,求職意向,工做經歷,項目經歷,技能描述,學歷背景,自我評價。若是本身或公司沒有其餘特殊要求,這些通常就夠了,具體格式再也不贅述。

總結幾個要素:javascript

       1.我的簡介名字大寫,內容須要詳實,一是能夠給人留下映像,二是減小沒必要要的與面試官交換我的信息的時間。準備一份好的口頭自我介紹是頗有必要的,畢竟準備一次能用好久,時間花在上面很實用,面外企英文版的最好也提早準備下。php

   2.簡歷上不要寫上指望薪資,可以根據面試狀況變化是最好的,若是寫上建議高於自身指望,詳細參考錨定效應。html

   3.簡歷要簡潔,最好不要超過兩頁。項目經歷要突出重點(能夠具體到某次解決線上問題,某次優化效率提高),兩到三個爲宜,不重要的能夠放在工做經歷中一筆帶過。這樣有個好處,即面試官根據項目問的問題就會很集中,在你的預料之中,若是你的項目誇誇    其談寫了不少,那面試官發揮起來,你就容易被帶着走。前端

   4.不少人不重視我的評價欄目,個人技巧是評價最後中帶上本身的博客,我的項目,由於在尾部仍是很容易被看到並當作加分項的。java

 

面試流程,其實每一個公司大同小異,電話面試,筆試,技術面(可能兩面),Hr面,部門經理面,可能不一樣公司有稍微作調整。mysql

這裏須要強調兩點:web

  1.電話面試,不少大公司都會有電話面試,有些朋友接到面試無論當前狀況如何,環境如何都會爭取這個機會,而我想說的是,若是身邊環境尚可接了也就接了,可是若是身處鬧市,或者下班回家地鐵上信號很差,或者本身徹底沒有準備,建議直接回復面試官目前不   合適,改約其餘時間,這麼作好處一是沒有環境影響,二是本身有心理準備。面試

  2.抓住機會問問題,若是對技術有追求必定要向技術官問清楚項目所使用技術,問開發人員上下班時間。向HR問清楚公司的薪酬福利體系,決定本身開價。向管理層問清楚項目目前所處的階段,以及規劃方向。 面試題概覽,基本上彙總了此次面試中遇到的全部問   題,中間也有一些是本身當時沒有答上來的,這裏只作羅列:ajax

不少人在剛接觸這個行業的時候或者是在遇到瓶頸期的時候,總會遇到一些問題,好比學了一段時間感受沒有方向感,不知道該從那裏入手去學習,對此我整理了一些資料,須要的能夠免費分享給你們(點擊此處加入php高級交流羣一塊兒學習交流,11年架構師帶你解讀年薪50萬面試通關祕籍。)redis

若是喜歡個人文章,想與一羣資深開發者一塊兒交流學習的話,獲取更多相關大廠面試諮詢和指導,歡迎加入個人學習交流羣677079770

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

二、SESSION 與 COOKIE的區別是什麼,請從協議,產生的緣由與做用說明?
A、http無狀態協議,不能區分用戶是不是從同一個網站上來的,同一個用戶請求不一樣的頁面不能看作是同一個用戶。
B、SESSION存儲在服務器端,COOKIE保存在客戶端。Session比較安全,cookie用某些手段能夠修改,不安全。Session依賴於cookie進行傳遞。
禁用cookie後,session不能正常使用。Session的缺點:保存在服務器端,每次讀取都從服務器進行讀取,對服務器有資源消耗。Session保存在服務器端的文件或數據庫中,默認保存在文件中,文件路徑由php配置文件的session.save_path指定。Session文件是公有的。

三、HTTP 狀態中30二、40三、 500代碼含義?
一二三四五原則:(即一:消息系列;二:成功系列; 三:重定向系列;四:請求錯誤系列;五:服務器端錯誤系列。)
302:臨時轉移成功,請求的內容已轉移到新位置
403:禁止訪問
500:服務器內部錯誤
401:表明未受權。

四、請寫出數據類型(int char varchar datetime text)的意思;請問 varchar 和 char有什麼區別?
Int 整數char 定長字符 Varchar 變長字符 Datetime 日期時間型Text 文本型 Varchar與char的區別 char是固定長度的字符類型,分配多少空間,就佔用多長空間。Varchar是可變長度的字符類型,內容有多大就佔用多大的空間,能有效節省空間。因爲varchar類型是可變的,因此在數據長度改變的時,服務器要進行額外的操做,因此效率比char類型低。

五、MyISAM和 InnoDB 的基本區別?索引結構如何實現?
A、MyISAM類型不支持事務,表鎖,易產生碎片,要常常優化,讀寫速度較快,適合用於頻繁查詢的應用;
B、InnoDB類型支持事務,行鎖,有崩潰恢復能力,讀寫速度比MyISAM慢,適合於插入和更新操做比較多的應用,空間佔用大,不支持全文索引等。
建立索引:alert table tablename add index 索引名 (`字段名`)

六、isset() 和 empty() 區別
sset判斷變量是否存在,能夠傳入多個變量,若其中一個變量不存在則返回假;empty判斷變量是否爲空爲假,只可傳一個變量,若是爲空爲假則返回真。

 

七、請說明 PHP 中傳值與傳引用的區別。何時傳值何時傳引用?
按值傳遞:函數範圍內對值的任何改變在函數外部都會被忽略
按引用傳遞:函數範圍內對值的任何改變在函數外部也能反映出這些修改
優缺點:按值傳遞時,php必須複製值。特別是對於大型的字符串和對象來講,這將會是一個代價很大的操做。按引用傳遞則不須要複製值,對於性能提升頗有好處。

八、在PHP中error_reporting這個函數有什麼做用?
設置PHP的報錯級別並返回當前級別。

九、說說你對緩存技術的瞭解?
緩存技術是將動態內容緩存到文件中,在必定時間內訪問動態頁面直接調用緩存文件,而沒必要從新訪問數據庫。

十、如今編程中常常採起MVC三層結構,請問MVC分別指哪三層,有什麼優勢?
MVC三層分別指:業務模型、視圖、控制器,由控制器層調用模型處理數據,而後將數據映射到視圖層進行顯示,優勢是:①能夠實現代碼的重用性,避免產生代碼冗餘;②M和V的實現代碼分離,從而使同一個程序可使用不一樣的表現形式

十一、AJAX的優點是什麼?
ajax是異步傳輸技術,能夠經過javascript實現,也能夠經過JQuery框架實現,實現局部刷新,減輕了服務器的壓力,也提升了用戶體驗。

十二、在程序的開發中,如何提升程序的運行效率?
A、優化SQL語句,查詢語句中儘可能不使用select *,用哪一個字段查哪一個字段;少用子查詢可用錶鏈接代替;少用模糊查詢;
B、數據表中建立索引;
C、對程序中常常用到的數據生成緩存。

1三、對於大流量的網站,您採用什麼樣的方法來解決訪問量問題?
A、有效使用緩存,增長緩存命中率
B、使用負載均衡
C、對靜態文件使用cdn進行存儲和加速
D、想法減小數據庫的使用
E、查看出現統計的瓶頸在哪裏
F、反向代理

1四、語句include和require的區別是什麼?爲避免屢次包含同一文件,可用什麼語句代替它們?
區別:
在失敗的時候:
include產生一個warning,而require產生直接產生錯誤中斷
require在運行前載入
include在運行時載入
代替:
require_once
include_once

1五、foo()和@foo()之間有什麼區別?
@表明全部warning忽略

1六、簡述php的垃圾收集機制。
答案:php中的變量存儲在變量容器zval中,zval中除了存儲變量類型和值外,還有is_ref和refcount字段。refcount表示指向變量的元素個數,is_ref表示變量是否有別名。若是refcount爲0時,就回收該變量容器。若是一個zval的refcount減1以後大於0,它就會進入垃圾緩衝區。當緩衝區達到最大值後,回收算法會循環遍歷zval,判斷其是否爲垃圾,並進行釋放處理。

1七、如何實現PHP的安全最大化?怎樣避免SQL注入漏洞和XSS跨站腳本攻擊漏洞?
答:基本原則:不對外界展現服務器或程序設計細節(屏蔽錯誤),不相信任何用戶提交的數據(過濾用戶提交)。

1八、echo、print_r、print、var_dump區別
echo:語句結構;
print:是函數,有返回值
print_r:能打印數組,對象
var_dump:能打印對象數組,而且帶數據類型

1九、寫出smarty模板的特色
速度快,編譯型,緩存技術,插件機制,強大的表現邏輯

20、PHP如何實現頁面跳轉
方法一:php函數跳轉,缺點,header頭以前不能有輸出,跳轉後的程序繼續執行,可用exit中斷執行後面的程序。
header("Location:網址");//直接跳轉
header("refresh:3;url=http://www.jsdaima.com");//三秒後跳轉
方法二:利用meta
echo"";

2一、如何把一個GB2312格式的字符串裝換成UTF-8格式?
iconv('GB2312','UTF-8','js代碼(www.jsdaima.com)是IT資源下載與IT技能學習平臺。');
?>

2二、若是須要原樣輸出用戶輸入的內容,在數據入庫前,要用哪一個函數處理?
htmlspecialchars或者htmlentities

2三、什麼是 CSRF 攻擊 ?XSS 攻擊?如何防範?
CSRF,跨站請求僞造,攻擊方假裝用戶身份發送請求從而竊取信息或者破壞系統。
講述基本原理:用戶訪問A網站登錄並生成了cookie,再訪問B網站,若是A網站存在CSRF漏洞,此時B網站給A網站的請求(此時至關因而用戶訪問),A網站會認爲是用戶發的請求,從而B網站就成功假裝了你的身份,所以叫跨站腳本攻擊。

CSRF防範:
A、合理規範api請求方式,GET,POST
B、對POST請求加token令牌驗證,生成一個隨機碼並存入session,表單中帶上這個隨機碼,提交的時候服務端進行驗證隨機碼是否相同。
XSS,跨站腳本攻擊。
防範:不相信任何輸入,過濾輸入。

2四、安全對一套程序來講相當重要,請說說在開發中應該注意哪些安全機制?
A、防遠程提交;
B、防SQL注入,對特殊代碼進行過濾;
C、防止註冊機灌水,使用驗證碼。

2五、對json數據格式的理解?
JSON(javascript object Notation)是一種輕量級的數據交換格式,json數據格式固定,能夠被多種語言用做數據的傳遞。

2六、什麼是事務?及其特性?
答:事務:是一系列的數據庫操做,是數據庫應用的基本邏輯單位。

事務特性:
A、原子性:即不可分割性,事務要麼所有被執行,要麼就所有不被執行。
B、一致性或可串性。事務的執行使得數據庫從一種正確狀態轉換成另外一種正確狀態
C、隔離性。在事務正確提交以前,不容許把該事務對數據的任何改變提供給任何其餘事務,
D、持久性。事務正確提交後,其結果將永久保存在數據庫中,即便在事務提交後有了其餘故障,事務的處理結果也會獲得保存。

或者這樣理解:
事務就是被綁定在一塊兒做爲一個邏輯工做單元的SQL語句分組,若是任何一個語句操做失敗那麼整個操做就被失敗,之後操做就會回滾到操做前狀態,或者是上有個節點。爲了確保要麼執行,要麼不執行,就可使用事務。要將有組語句做爲事務考慮,就須要經過ACID測試,即原子性,一致性,隔離性和持久性。

2七、什麼是鎖?
答:數據庫是一個多用戶使用的共享資源。當多個用戶併發地存取數據時,在數據庫中就會產生多個事務同時存取同一數據的狀況。若對併發操做不加控制就可能會讀取和存儲不正確的數據,破壞數據庫的一致性。

加鎖是實現數據庫併發控制的一個很是重要的技術。當事務在對某個數據對象進行操做前,先向系統發出請求,對其加鎖。加鎖後事務就對該數據對象有了必定的控制,在該事務釋放鎖以前,其餘的事務不能對此數據對象進行更新操做。

基本鎖類型:鎖包括行級鎖和表級鎖

2八、索引的做用?和它的優勢缺點是什麼?
答:索引就一種特殊的查詢表,數據庫的搜索引擎能夠利用它加速對數據的檢索。它很相似與現實生活中書的目錄,不須要查詢整本書內容就能夠找到想要的數據。索引能夠是惟一的,建立索引容許指定單個列或者是多個列。缺點是它減慢了數據錄入的速度,同時也增長了數據庫的尺寸大小。

2九、如何通俗地理解三個範式?
第一範式:1NF是對屬性的原子性約束,要求屬性具備原子性,不可再分解;
第二範式:2NF是對記錄的唯一性約束,要求記錄有唯一標識,即實體的唯一性;
第三範式:3NF是對字段冗餘性的約束,即任何字段不能由其餘字段派生出來,它要求字段沒有冗餘。

30、主鍵、外鍵和索引的區別?
定義:
主鍵--惟一標識一條記錄,不能有重複的,不容許爲空
外鍵--表的外鍵是另外一表的主鍵, 外鍵能夠有重複的, 能夠是空值
索引--該字段沒有重複值,但能夠有一個空值

做用:
主鍵--用來保證數據完整性
外鍵--用來和其餘表創建聯繫用的
索引--是提升查詢排序的速度

個數:
主鍵--主鍵只能有一個
外鍵--一個表能夠有多個外鍵
索引--一個表能夠有多個惟一索引

3一、簡述 private、 protected、 public修飾符的訪問權限。
private : 私有成員, 在類的內部才能夠訪問。
protected : 保護成員,該類內部和繼承類中能夠訪問。
public : 公共成員,徹底公開,沒有訪問限制。

3二、堆和棧的區別?
A、堆是程序運行期間動態分配的內存空間,你能夠根據程序的運行狀況肯定要分配的堆內存的大小;
B、棧是編譯期間就分配好的內存空間,所以你的代碼中必須就棧的大小有明確的定義。

3三、經常使用的魔術方法有哪些?舉例說明
答:php規定以兩個下劃線(__)開頭的方法都保留爲魔術方法,因此建議你們函數名最好不用__開頭,除非是爲了重載已有的魔術方法。
__construct() 實例化類時自動調用。
__destruct() 類對象使用結束時自動調用。
__set() 在給未定義的屬性賦值的時候調用。
__get() 調用未定義的屬性時候調用。
__isset() 使用isset()或empty()函數時候會調用。
__unset() 使用unset()時候會調用。
__sleep() 使用serialize序列化時候調用。
__wakeup() 使用unserialize反序列化的時候調用。
__call() 調用一個不存在的方法的時候調用。
__callStatic()調用一個不存在的靜態方法是調用。
__toString() 把對象轉換成字符串的時候會調用。好比 echo。
__invoke() 當嘗試把對象當方法調用時調用。
__set_state() 當使用var_export()函數時候調用。接受一個數組參數。
__clone() 當使用clone複製一個對象時候調用。

3四、$this和self、parent這三個關鍵詞分別表明什麼?在哪些場合下使用?
$this 當前對象
self 當前類
parent 當前類的父類

$this在當前類中使用,使用->調用屬性和方法
self也在當前類中使用,不過須要使用::調用
parent在類中使用

3五、做用域操做符::如何使用?都在哪些場合下使用?
調用類常量
調用靜態方法

3六、__autoload()方法的工做原理是什麼?
答:使用這個魔術函數的基本條件是類文件的文件名要和類的名字保持一致。

當程序執行到實例化某個類的時候,若是在實例化前沒有引入這個類文件,那麼就自動執行__autoload()函數。

這個函數會根據實例化的類的名稱來查找這個類文件的路徑,當判斷這個類文件路徑下確實存在這個類文件後

就執行include或者require來載入該類,而後程序繼續執行,若是這個路徑下不存在該文件時就提示錯誤。

使用自動載入的魔術函數能夠沒必要要寫不少個include或者require函數。

3七、簡述高併發網站解決方案。
A、前端優化(CND加速、創建獨立圖片服務器)
B、服務端優化(頁面靜態化、併發處理[異步|多線程]、隊列處理)
C、數據庫優化(數據庫緩存[Memcachaed|Redis]、讀寫分離、分庫分表、分區)
D、Web服務器優化(負載均衡、反向代理)


3八、PHP遍歷文件夾下全部文件

  1. <?php
  2. function read_all($dir){
  3.     if(!is_dir($dir)) return false;
  4.     $handle = opendir($dir);
  5.     if($handle){
  6.         while(($fl = readdir($handle)) !== false){
  7.             $temp = $dir.$fl;
  8.             //$fl !='.' && $fl != '..' 排除當前目錄及父級目錄
  9.             if(is_dir($temp) && $fl!='.' && $fl != '..'){
  10.                 echo '目錄:'.$temp.'<br>';
  11.                 read_all($temp);
  12.             }else{
  13.                 if($fl !='.' && $fl != '..'){
  14.                     echo '文件:'.$temp.'<br>';
  15.                 }
  16.             }
  17.         }
  18.     }
  19. }
  20. read_all("./dir/");
  21. ?>
複製代碼

3九、在命令行中運行php程序
php indx.php
A、從命令行運行php很是簡單。但有些注意事項須要各位瞭解下,諸如$_SESSION之類的服務器變量是沒法在命令行中使用的,其餘代碼的運行則和web服務器中徹底同樣;
B、在命令行中執行php文件的好處之一就是能夠經過腳本實現一些計劃任務(crontab)的執行,而無須經過web服務器。

延伸1:
php -v 顯示當前PHP版本
php -m 顯示當前php加載的有效模塊
php -i 輸出無html格式的phpinfo
php --rf function

延伸2:向php腳本傳遞參數:
提示:命令行下執行php,是不走Apache/Nginx等這類東西的,沒有什麼http協議,因此get,post傳參數根本不起做用,而且還會報錯。有些時候須要在shell命令下把PHP看成腳本執行,好比定時任務。這就涉及到在shell命令下如何給php傳參的問題,一般有三種方式傳參。

A、使用$argv or $argc參數接收
echo "接收到{$argc}個參數";
print_r($argv);
?>

B、使用getopt函數
$param_arr = getopt('a:b:');
print_r($param_arr);
?>

C、提示用戶輸入
fwrite(STDOUT,'Please enter your name:');
echo 'Your name is:'.fgets(STDIN);
?>

40、你用什麼方法檢查PHP腳本的執行效率(一般是腳本執行時間)和數據庫SQL的效率(一般是數據庫Query時間),並定位和分析腳本執行和數據庫查詢的瓶頸所在?
A、PHP腳本的執行效率
a、代碼腳本里計時;
b、xdebug統計函數執行次數和具體時間進行分析,最好使用工具winCacheGrind分析;
c、在線系統用strace跟蹤相關進程的具體系統調用。

B、數據庫SQL的效率
a、sql的explain(mysql),啓用slow query log記錄慢查詢;
b、一般還要看數據庫設計是否合理,需求是否合理等。

4一、對於大流量的網站,您採用什麼樣的方法來解決各頁面訪問量統計問題。
A、確認服務器是否能支撐當前訪問量;
B、優化數據庫訪問;
C、禁止外部訪問連接(盜鏈), 好比圖片防盜鏈;
D、控制文件下載,尤爲是大文件;
E、使用不一樣主機分流(負載均衡);
F、使用瀏覽統計軟件,瞭解訪問量,有針對性的進行優化。

4二、 MySQL數據庫做發佈系統的存儲,一天五萬條以上的增量,預計運維三年,怎麼優化?
A、設計良好的數據庫結構,容許部分數據冗餘,儘可能避免join查詢,提升效率;
B、選擇合適的表字段數據類型和存儲引擎,適當的添加索引;
C、mysql庫主從讀寫分離;
D、找規律分表,減小單表中的數據量提升查詢速度;
E、添加緩存機制,好比memcached,redis等;
F、不常常改動的頁面,生成靜態頁面;
G、書寫高效率的SQL。好比 SELECT * FROM TABEL 改成 SELECT field_1, field_2, field_3 FROM TABLE。

4三、Mysql的存儲引擎,myisam和innodb的區別。
A、MyISAM類型不支持事務處理等高級處理,而InnoDB類型支持;
B、MyISAM類型的表強調的是性能,其執行速度比InnoDB類型更快;
C、InnoDB不支持FULLTEXT類型的索引;
D、InnoDB中不保存表的具體行數,也就是說,執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行,可是MyISAM只要簡單的讀出保存好的行數便可;
E、對於AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,可是在MyISAM表中,能夠和其餘字段一塊兒創建聯合索引;
F、DELETE FROM table時,InnoDB不會從新創建表,而是一行一行的刪除;
G、LOAD TABLE FROM MASTER操做對InnoDB是不起做用的,解決方法是首先把InnoDB表改爲MyISAM表,導入數據後再改爲InnoDB表,可是對於使用的額外的InnoDB特性(例如外鍵)的表不適用;
H、MyISAM支持表鎖,InnoDB支持行鎖。

MyISAM:成熟、穩定、易於管理,快速讀取。一些功能不支持(事務等),表級鎖。
InnoDB:支持事務、外鍵等特性、數據行鎖定。空間佔用大,不支持全文索引等。

 

其餘,主要是一些面試後的我的見解和玄學了:

1.不少在職的同窗以爲請假面試麻煩,其實如今不少公司都有安排晚上面試和週末面試專場的,提早溝通好就好了,請假的話一天面試三家應該不是問題。

2.投遞公司的順序建議,首先是一兩家公司預熱一下,而後比較心儀的頗有把握的公司,而後纔是很是心儀的公司,最後是選擇 性的面試。安排這個順序主要是,雖然可能你業務很厲害,可是進入面試狀態時須要一個過程的,面試預熱頗有必要,這裏順便強調下面試提早準備,好比看下面試題,複習下技術書籍都頗有必要的。提早選擇比較心儀的頗有把握的公司,主要是爲了拿到offer,一是作自我價值驗證,二是心中有底氣。

3.調整好心態,其實有些offer是帶有運氣成分的,畢竟對於有些體量公司來講,面試常有,編制不常有,因此拿不到offer也不要氣餒。

最後,祝全部你們在面試中過關斬將,拿到心儀offer。

 

 

不少人在剛接觸這個行業的時候或者是在遇到瓶頸期的時候,總會遇到一些問題,好比學了一段時間感受沒有方向感,不知道該從那裏入手去學習,對此我整理了一些資料,須要的能夠免費分享給你們(點擊此處加入php高級交流羣一塊兒學習交流,11年架構師帶你解讀年薪50萬面試通關祕籍。)

若是喜歡個人文章,想與一羣資深開發者一塊兒交流學習的話,獲取更多相關大廠面試諮詢和指導,歡迎加入個人學習交流羣677079770

相關文章
相關標籤/搜索