博主信息
笑的很甜丶
博文
5
粉絲
0
評論
0
訪問量
1504
積分:0
P豆:10

2019(初級)PHP最全常見面試題集合(附答案)!

2019年10月27日 03:09:34閱讀數:490博客 / 笑的很甜丶 / 后端技術

PHP 是一種創建動態交互性站點的強有力的服務器端腳本語言。

1、常見狀態碼

1xx (臨時響應)表示臨時響應并需要請求者繼續執行操作的狀態代碼。

100 (繼續) 請求者應當繼續提出請求。 服務器返回此代碼表示已收到請求的第一部分,正在等待其余部分。
101 (切換協議) 請求者已要求服務器切換協議,服務器已確認并準備切換。
102   由WebDAV(RFC 2518)擴展的狀態碼,代表處理將被繼續執行。

2xx (成功)表示成功處理了請求的狀態代碼。

200 (成功) 服務器已成功處理了請求。 通常,這表示服務器提供了請求的網頁。
201 (已創建) 請求成功并且服務器創建了新的資源。
202 (已接受) 服務器已接受請求,但尚未處理。
203 (非授權信息) 服務器已成功處理了請求,但返回的信息可能來自另一來源。
204 (無內容) 服務器成功處理了請求,但沒有返回任何內容。
205 (重置內容) 服務器成功處理了請求,但沒有返回任何內容。
206 (部分內容) 服務器成功處理了部分 GET 請求。
207    由WebDAV(RFC 2518)擴展的狀態碼,代表之后的消息體將是一個XML消息,并且可能依照之前子請求數量的不同,包含一系列獨立的響應代碼。

3xx (重定向) 表示要完成請求,需要進一步操作。 通常,這些狀態代碼用來重定向。

300 (多種選擇) 針對請求,服務器可執行多種操作。 服務器可根據請求者 (useragent)選擇一項操作,或提供操作列表供請求者選擇。
301 (永久移動) 請求的網頁已永久移動到新位置。 服務器返回此響應(對 GET 或HEAD請求的響應)時,會自動將請求者轉到新位置。
302 (臨時移動) 服務器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以后的請求。
303 (查看其他位置) 請求者應當對不同的位置使用單獨的 GET 請求來檢索響應時,服務器返回此代碼。
304 (未修改) 自從上次請求后,請求的網頁未修改過。 服務器返回此響應時,不會返回網頁內容。
305 (使用代理) 請求者只能使用代理訪問請求的網頁。 如果服務器返回此響應,還表示請求者應使用代理。
307 (臨時重定向) 服務器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以后的請求。

4xx (請求錯誤) 這些狀態代碼表示請求可能出錯,妨礙了服務器的處理。

400 (錯誤請求) 服務器不理解請求的語法。
401 (未授權) 請求要求身份驗證。 對于需要登錄的網頁,服務器可能返回此響應。
402   該狀態碼是為了將來可能的需求而預留的。
403 (禁止) 服務器拒絕請求。
404 (未找到) 服務器找不到請求的網頁。
405 (方法禁用) 禁用請求中指定的方法。
406 (不接受) 無法使用請求的內容特性響應請求的網頁。
407 (需要代理授權) 此狀態代碼與 401(未授權)類似,但指定請求者應當授權使用代理。
408 (請求超時)服務器等候請求時發生超時。
409 (沖突) 服務器在完成請求時發生沖突。 服務器必須在響應中包含有關沖突的信息。
410 (已刪除) 如果請求的資源已永久刪除,服務器就會返回此響應。
411 (需要有效長度) 服務器不接受不含有效內容長度標頭字段的請求。
412 (未滿足前提條件) 服務器未滿足請求者在請求中設置的其中一個前提條件。
413 (請求實體過大) 服務器無法處理請求,因為請求實體過大,超出服務器的處理能力。
414 (請求的 URI 過長) 請求的 URI(通常為網址)過長,服務器無法處理。這比較少見,通常的情況包括:本應使用POST方法的表單提交變成了GET方法,導致查詢字符串(Query String)過長。
415 (不支持的媒體類型) 請求的格式不受請求頁面的支持。
416 (請求范圍不符合要求) 如果頁面無法提供請求的范圍,則服務器會返回此狀態代碼。
417 (未滿足期望值) 服務器未滿足”期望”請求標頭字段的要求。

5xx (服務器錯誤)這些狀態代碼表示服務器在嘗試處理請求時發生內部錯誤。這些錯誤可能是服務器本身的錯誤,而不是請求出錯。

500 (服務器內部錯誤) 服務器遇到錯誤,無法完成請求。
501 (尚未實施) 服務器不具備完成請求的功能。 例如,服務器無法識別請求方法時可能會返回此代碼。
502 (錯誤網關) 服務器作為網關或代理,從上游服務器收到無效響應。
503 (服務不可用) 服務器目前無法使用(由于超載或停機維護)。 通常,這只是暫時狀態。
504 (網關超時) 服務器作為網關或代理,但是沒有及時從上游服務器收到請求。
505 (HTTP 版本不受支持)服務器不支持請求中所用的 HTTP 協議版本。

600 源站沒有返回響應頭部,只返回實體內容

延伸:OSI七層模型,物理層,數據鏈路層,網絡層(IP),傳輸層(TCP),會話層,表示層,應用層(HTTP、FTP、TFTP、SMTP)
說明: 以上狀態碼不會都問,記住你所常見的,有時間盡量都記住。

2、get和post區別

1、get,url參數可見,post,url參數不可見。
2、get通過url拼接傳遞參數,post通過請求body體傳遞。
3、get請求是可以緩存的,post請求不可以緩存。
4、get請求頁面后退不產生影響,post請求頁面后退會重新提交。
5、get一般傳輸數據大小不超過2K~4K,post請求傳輸數據的大小根據php.ini 配置文件設定。
6、get請求將header和data一起發送,服務器響應200則返回數據。post請求瀏覽器先發送header,服務器響應100,瀏覽器再發送data,服務器響應200則返回數據。

3、cookie和session的區別

1、cookie存儲在客戶端,不會浪費服務器資源,不建議將敏感重要信息保存在cookie,而且用戶可以禁止cookie。
2、session存儲在服務器上,信息比較安全,但比較占用服務器資源,session是基于cookie的,sessionID存儲在cookie中。
3、如果客戶端cookie被禁用掉可以將sessionID添加到url鏈接中進行傳遞。

4、reqiure的include的作用及區別?

兩者都用于包含文件,require如果包含文件出錯會報致命錯誤并且停止運行,而include會報Notice錯誤,程序繼續運行。require_once會檢查是否重復包含,如果已經包含則不再執行,include同理。

5、PHP中常量定義的方式有哪些?有什么區別?

const和define()。const更快,是語言結構,define是函數。define不能用于類常量定義,const可以。

6、客戶端IP地址和服務器端IP地址。

$_SERVER['REMOTE_ADDR']
$_SERVER['SERVER_ADDR']

7、print()、echo、print_r()、var_dump()等區別。

print()、echo  都是語言結構,不同的是前者打印只能接受一個變量,后者可以輸出多個。

print_r()和var_dump()都是函數。
前者格式化打印變量。但print_r()輸出布爾值和NULL的結果沒有意義,打印true返回1,null則不顯示。
后者也是格式化打印變量。但會詳細的打印出變量的類型,長度,數值,如果包含多層將遞歸打印。更適合調試。

8、常用字符串函數。

serialize()、unserialize()   序列化是將變量轉換為可保存或傳輸的字符串的過程。strlen()    返回字符串長度。strrev()    反轉字符串。strpos(原字符串,待查找字符串) 存在返回第一個字符下標,不存在返回false。strstr(原字符串,待查找字符串) 返回待查找字符串及其后剩余部分,不存在返回false。str_replace("world", "Kitty", "Hello world!")    將某個字符串替換為另一個字符串。explode(" ",原字符串)   將原字符串按分割字符串轉成數組。implode(" ",原數組)        將原數組中的元素連接分割字符組合成字符串。trim()      移除字符串兩側的空白字符和其他字符。ltrim()移除左邊、rtrim()移除右邊。substr("Hello world",6) 返回字符串的一部分。substr_replace(string,replacement,start,length) 函數把字符串的一部分替換為另一個字符串。htmlspecialchars()  把一些預定義的字符轉換為 HTML 實體。str_repeat("Shanghai",5)    字符串重復指定次數。str_split("Shanghai",3)     將字符串分割成數組,可以指定每個數組元素長度。

9、常用數組函數

array_keys()    返回數組中所有的鍵名。array_values()  返回數組中所有的值。array_shift()   刪除數組中首個元素,并返回被刪除元素的值。array_unshift() 在數組開頭插入一個或多個元素,并返回數組元素個數。array_diff()    比較數組,返回差集(只比較鍵值)。array_intersect()   比較數組,返回交集(只比較鍵值)。array_diff_assoc()  比較數組,返回差集(比較鍵名和鍵值)。array_merge()   把一個或多個數組合并為一個數組。array_pop() 刪除數組的最后一個元素(出棧)。array_push()    將一個或多個元素插入數組的末尾(入棧)。sort()  對數組進行升序排序。rsort() 對數組進行降序(逆向)排序。asort() 對關聯數組按照鍵值進行升序排序。ksort() 對數組按照鍵名進行升序排序。array_rand()    返回數組中一個或多個隨機的鍵。array_combine() 通過合并兩個數組來創建一個新數組。array_unique()  刪除數組中的重復值。

10、常用文件操作函數。

fopen() 打開一個文件或 URL。
fread() 讀取打開的文件。
fwrite()    寫入文件。
fclose()    關閉打開的文件。
file_get_contents() 將文件讀入字符串。
file_put_contents() 將字符串寫入文件。file_put_contents("test.txt","test!",FILE_APPEND);
filesize()  返回文件大小。
filetype()  返回文件類型。
file_exists()   檢查文件或目錄是否存在。

真題:打開文件,將文件內容讀取出來,在開頭加入Hello World,將拼接好的字符串寫回到文件當中

$file = './hello.txt';
$handle = fopen($file,'r');
$content = fread($handle,filesize($file));
$content = 'Hello World'.$content;
fclose($handle);
$handle = fopen($file,'w');
fwrite($handle,$content);
fclose($handle);

真題:PHP遍歷文件夾

$dir = './test';function loopDir($dir){
   $handle = opendir($dir);
   //目錄/文件/子目錄/子文件名稱為0或者空這種情況不全等于false不跳出循環,目錄里指針全讀取完則為false,跳出循環
   while(false!==($file = readdir($handle)))
   {
       //$file只顯示名稱,并不顯示完整路徑
       if($file != '.' && $file != '..')
       {
           echo $file."\n";
           if(filetype($dir.'/'.$file) == 'dir')
           {
               loopDir($dir.'/'.$file);
           }
       }
   }}loopDir($dir);

11、PHP***回收機制

php中的變量存儲在變量容器zval中,zval中除了存儲變量類型和值外,還有is_ref和refcount字段。refcount表示指向變量的元素個數,is_ref表示變量表示是否是引用變量。如果refcount為0時,就回收該變量容器。

12、PHP常見的設計模式

工廠模式、單例模式、注冊模式、適配器模式、觀察者模式、策略模式、原型模式、裝飾器模式

工廠模式:用工廠方法代替new操作的一種模式,如果需要更改所實例化的類名,只需在工廠方法內修改,不需逐一尋找代碼中具體實例化的地方。
單例模式:防止重復實例化,避免大量的new操作,減少消耗系統和內存的資源,使得有且僅有一個實例對象。
參考鏈接:
https://www.cnblogs.com/legendheng/p/9082266.html
https://blog.csdn.net/Merlin_feng/article/details/42390737
https://blog.csdn.net/flitrue/article/details/52614599

13、棧和堆、棧和隊列的區別?

棧是編譯期間就分配好的內存空間, 存取數據較快,代碼中必須就棧的大小有明確的定義,缺乏靈活性。
堆是程序運行期間動態分配的內存空間,可以根據程序的運行情況確定要分配的堆內存的大小。

隊列先進先出,棧先進后出。
棧是只能在表的一端進行插入和刪除操作的線性表。 隊列是只能在表的一端進行插入和在另一端進行刪除操作的線性表。

14、數據庫事物及其特性?

事務:是一系列的數據庫操作,是數據庫應用的基本邏輯單位。

事務特性:

(1)原子性:即不可分割性,事務要么全部被執行,要么就全部不被執行。

(2)一致性。事務的執行使得數據庫從一種正確狀態轉換成另一種正確狀態

(3)隔離性。在事務正確提交之前,不允許把該事務對數據的任何改變提供給任何其他事務,

(4) 持久性。事務正確提交后,其結果將永久保存在數據庫中,即使在事務提交后有了其他故障,事務的處理結果也會得到保存。

15、數據庫三范式

第一范式(1NF)無重復的列(原子性)
第二范式(2NF)屬性完全依賴于主鍵
第三范式(3NF)屬性不依賴于其它非主屬性

參考鏈接:
https://blog.csdn.net/zhan_zehong/article/details/21411883

16、數據庫索引作用、類型及其區別?

大大減少服務器需要掃描的數據量
幫助服務器避免排序和臨時表
將隨機I/O變順序/O
大大提高查詢速度,降低寫的速度、占用磁盤

索引就一種特殊的查詢表,數據庫的搜索引擎可以利用它加速對數據的檢索。
普通索引:最基本的索引,沒有任何約束限制。
唯一索引:與普通索引類似,但是具有唯一性約束。
主鍵索引:特殊的唯一索引,不允許有空值。
組合索引:將多個列組合在一起創建索引,可以覆蓋多個列。
外鍵 全文基本不用,一般用業務邏輯實現。
外鍵索引:只有 InnoDB類型的表才可以使用外鍵索引,保證數據的一致性、完整性和實現級聯操作。
全文索引: MySQLI自帶的全文索引只能用于 MyISAM,并且只能對英文進行全文檢索。

真題: 2019新浪PHP實習生原題
慕課網360大牛PHP面試視頻關注公眾號【蛋叔】回復“PHP面試”
復合索引前綴原則(向左原則)考點

KEY(a, b, c)WHERE a land b=2 and c= 3WHERE a =1 and b =2WHERE a =1WhERE b=2 and c= 3(不生效)WHERE a =1 and c=3(不生效)

17、表存儲引擎 InnoDB和MyISAM的區別

InnoDB支持行鎖,MyISAM支持表鎖
InnoDB支持事務處理,MyISAM不支持
InnoDB默認使用共享表空間,MyISAM不使用
InnoDB數據存儲在共享表空間,MyISAM存儲在后綴為MYD和MY
InnoDB支持外鍵、崩潰后的安全恢復,MyISAM不支持崩潰后的安全恢復

18、數據庫中join和left join的區別

left join 左連接 意思是包含左邊表所有記錄,右邊所有的匹配的記錄,如果沒有則用空補齊JOIN: 如果表中有至少一個匹配,則返回行LEFT JOIN: 即使右表中沒有匹配,也從左表返回所有的行

19、SQL查詢的安全方案

1使用預處理語句防SQL注入
delete from user where id= 1 or 1=1delete from user where id=?2寫入數據庫的數據要進行特殊字符的轉義3查詢錯誤信息不要返回給用戶,將錯誤記錄到日志//MySQL的其他安全設置//1.定期做數據備份//2.不給查詢用戶root權限,合理分配權限//3.關閉遠程訪問數據庫權限//4.修改root口令,不用默認口令,使用較復雜的口令//5.刪除多余的用戶//6.改變root用戶的名稱//7.限制一般用戶瀏覽其他庫//8.限制用戶對數據文件的訪問權限

20、定位SQL慢查詢

//分析SQL查詢慢的方法//記錄慢查詢日志,分析查詢日志,不要直接打開慢查詢日志進行分析,這樣比較浪費時間和精力,//可以使用 pt-query-digest工具進行分析//使用 show profile//set profiling=1;開啟,服務器上執行的所有語句會檢測消耗的時間,存到臨時表中//show profiles//show profile for query臨時表ID//使用 show status//show status會返回一些計數器, show global status查看服務器//級別的所有計數//有時根據這些計數,可以猜測出哪些操作代價較高或者消耗時間多//使用 show processlist//觀察是否有大量線程處于不正常的狀態或者特征//使用 explain(desc) 分析單條SQL語句

21、SQL優化

a. 設計良好的數據庫結構,允許部分數據冗余,盡量避免join查詢,提高效率。

b. 選擇合適的表字段數據類型和存儲引擎,適當的添加索引。

c. mysql庫主從讀寫分離。

d. 找規律分表,減少單表中的數據量提高查詢速度。

e。添加緩存機制,比如memcached,apc等。

f. 不經常改動的頁面,生成靜態頁面。

g. 書寫高效率的SQL。比如 SELECT * FROM TABEL 改為 SELECT field_1, field_2, field_3 FROM TABLE.

22、PDO連接MySQL實例

<?php$dbms='mysql';     //數據庫類型$host='localhost'; //數據庫主機名$dbName='test';    //使用的數據庫$user='root';      //數據庫連接用戶名$pass='';          //對應的密碼$dsn="$dbms:host=$host;dbname=$dbName";try {
   $dbh = new PDO($dsn, $user, $pass); //初始化一個PDO對象
   echo "連接成功<br/>";
   /*你還可以進行一次搜索操作
   foreach ($dbh->query('SELECT * from FOO') as $row) {
       print_r($row); //你可以用 echo($GLOBAL); 來看到這些值
   }
   */
   $dbh = null;} catch (PDOException $e) {
   die ("Error!: " . $e->getMessage() . "<br/>");}//默認這個不是長連接,如果需要數據庫長連接,需要最后加一個參數:array(PDO::ATTR_PERSISTENT => true) 變成這樣:$db = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));?>

23、數據結構和數據類型

數組,最簡單而且應用最廣泛的數據結構之一特性:使用連續的內存來存儲、數組中的所有元素必須是相同的類型或類型的衍生(同質數據結構)、元素可以通過下標直接訪問
鏈表,線性表的一種,最基本、最簡單,也是最常用的數據結構特性:元素之間的關系是一對一的關系(除了第一個和最后一個元素,其他元素都是首尾相接)、順序存儲結構和鏈式存儲結構兩種存儲方式。
棧,和隊列相似,一個帶有數據存儲特性的數據結構特性:存儲數據是先進后出的、棧只有一個出口,只能從棧頂部增加和移除元素
堆,一般情況下,堆叫二叉堆,近似完全二叉樹的數據結構特性:子節點的鍵值或者索引總是小于它的父節點、每個節點的左右子樹又是一個二叉堆、根節點最大的堆叫最大堆或者大根堆、最小的叫最小堆或者小根
線性表,由零個或多個數據元素組成的有限序列特性:線性表是一個序列、0個元素構成的線性表是空表、第一個元素無先驅、最后一個元素無后繼、其他元素都只有一個先驅和后繼、有長度,長度是元素個數,長度有限
雙向鏈表
特性:每個元素都是一個對象,每個對象有一個關鍵字key和兩個指針(next和prev)
隊列
特性:先進先出(FIFO)、并發中使用、可以安全將對象從一個任務傳給另一個任務
字典特性:關聯數組、也被叫做字典或者鍵值對
圖特性:通常使用鄰接矩陣和鄰接表表示、前者易實現但是對于稀疏
矩陣會浪費較多空間、后者使用鏈表的方式存儲信息但是對于圖搜
索時間復雜度較高

三大數據類型(標量(浮點、整型、字符串、布爾)、復合(數組、對象)、特殊(resource、null))
算法特性:有窮性,確定性、可行性、輸入、輸出

24、MVC

MVC是一種架構模式,M(model)、V(view)、C(controller),model是模型層處理數據,view是視圖層展示交互界面,controller是控制器層處理業務邏輯。

用戶在視圖層提交數據到控制器層,控制器層調用模型層的方法進行數據處理然后根據返回結果再進行不同的業務處理最后返回到視圖層。

25、AOP思想

AOP面試切面編程,提取各個模塊中可能重復操作的部分,權限認證,異常處理,日志記錄等。

26、RESTful

restful api是rest在web接口的應用和延伸。輕量級、通常用json描述數據。請求是無狀態的,一個請求不需要依賴于另一個請求。統一的錯誤返回處理。

所有的接口都是基于資源的,增刪改查都只是對資源狀態的改變。
get:查詢
post:創建
put:更新
delete:刪除
url只表示資源路徑
GET:/movie/:mid

27、數據結構和算法

常見的排序算法和查找算法以及相應的時間復雜度和空間復雜度要掌握,冒泡排序、快速排序、選擇排序、二分查找等要能手寫出來,還有一點常問的就是讓你寫某個算法并且改進該算法以及改進前后相應的時間復雜度。

這里我就不貼了,網上隨手一搜太多了

28、項目

以上都是對你相應技術棧的能力考查,面試另外一個重點就是問你的項目。

簡歷上最好寫兩到三個項目,一個主項目,你最熟悉的,面試官可能會基于你的項目問你一些問題,也可能會讓你自己闡述你的主要項目,在這個過程中一定要提前想好你主項目中的亮點,難點,這個是對于項目這一塊最重要的。

29、其他建議

1、面試狀態要調整好,當你看到這篇文章的時候應該是處于正在找工作或者將要找工作的狀態,你很可能會收到多次的邀約,會有各種各樣的事情,但無論怎樣,請一定要以一個比較好的狀態參加面試。
2、如果是電話面試,HR問你時間最好不要立馬就同意面試,如果可以的話約在次日或者其他時間,以便你做好各方面準備。
3、每一次面試都要總結得失。
4、學會寫博客,技術/生活都可以,它會記錄下很多有意義的時刻。
5、待更新。



作者:蛋叔_
鏈接:https://www.jianshu.com/p/4c558b927510
來源:簡書
著作權歸作者所有。商業轉載***作者獲得授權,非商業轉載請注明出處。


全部評論

文明上網理性發言,請遵守新聞評論服務協議

條評論
暫無評論暫無評論!
  • 第十期線上培訓班 白小姐救世民彩图2019