首頁  >  文章  >  後端開發  >  PHP重點面試題小結分享(二)

PHP重點面試題小結分享(二)

小云云
小云云原創
2018-03-22 13:41:293802瀏覽

前面我們跟大家分享了php重點面試題(一),本文主要跟大家分享PHP重點面試題小結分享(二),希望能幫助大家。

一、理論知識

1.1、PHP裡面是區分大小寫的嗎?

PHP對於系統函數、使用者自訂函數、類別名稱等是不區分大小寫的

PHP中的變數和常數是區分大小寫的

對於檔案名稱又因伺服器作業系統而定,linux中區分,Win不區分

1.2、$_POST ,$HTTP_RAW_POST_DATA和 php://input的差別?

$_POST:

是取得表單POST過來數據,media type是「application/x-www-form-urlencoded」。

意思是欄位名稱和值都編碼了,每個 key-value對使用 '&' 字元分隔開,key 和 value 使用 '=' 分開,其他特殊字元都會被使用 urlencode方式進行編碼。

$HTTP_RAW_POST_DATA:

#可以取得原始的POST數據,但需要在php.ini 中設定開啟,且不支援enctype=" multipart/form-data"方式傳遞的資料

php://input:

可以取得原始的 POST數據,且比$ HTTP_RAW_POST_DATA較少消耗內存,也不支援"multipart/form-data",

可以使用 file_get_contents() 函數去取得它的內容

#1.3、沒有透過static定義的方法,能否透過」物件名稱::方法名稱「這樣的形式來呼叫?

會產生一個strict錯誤,但在會繼續執行程式碼。參考《PHP靜態呼叫非靜態方法》。這篇文章裡面還講到了一個概念「calling scope」。
靜態調用並不是說有::就是靜態調用,而是看calling scope。 $this指標指向的物件就是這個方法被呼叫時刻的calling scope。

詳細看這篇文章解說:http://www.cnblogs.com/whoamme/p/3728052.html

#1.4、請簡單闡述您最得意的開發之作

#1.5、對於大流量的網站,您採用什麼樣的方法來解決各頁面訪問量統計問題

a. 確認伺服器是否能支援目前存取量。

b. 最佳化資料庫存取。 (參考3.5)

c. 禁止外部存取連結(盜鏈),例如圖片盜鏈。

d. 控制檔下載。

e. 使用不同主機分流。

f. 使用瀏覽統計軟體,了解訪問量,有針對性的進行最佳化。

1.6、請介紹Session的原理

#因為HTTP是無狀態的,所以一次請求完成後客戶端和服務端就不再有任何關係了,誰也不認識誰。

但由於一些需要(如保持登入狀態等),必須讓服務端和用戶端保持聯繫,session ID就成了這種聯繫的媒介了。

當使用者第一次造訪網站時,PHP會用session_start()函數為使用者建立一個session ID,這是針對這個使用者的唯一標識,

每個存取的使用者都會得到一個自己獨有的session ID,這個session ID會存放在回應頭裡的cookie中,之後傳送給客戶端。

這樣客戶端就會擁有一個該網站給他的session ID。

當使用者第二次造訪該網站時,瀏覽器會帶著本機存放的cookie(裡面存有上次得到的session ID)隨著請求一起傳送到伺服器,

服務端接到請求後會偵測是否有session ID,如果有就會找到回應的session文件,把其中的資訊讀取出來;如果沒有就跟第一次一樣再創建個新的。

1.7、session共享問題解決方案

#a. 客戶端Cookie保存,以cookie加密的方式保存在客戶端,每次session資訊寫在客戶端,然後經瀏覽器再次提交到伺服器。

b. 伺服器間Session同步,使用主-從伺服器的架構,當使用者在主伺服器上登入後,透過腳本或守護進程的方式,將session訊息傳遞到各個從伺服器中

c. 使用叢集統一管理Session,當應用系統需要session資訊的時候直接到session群集伺服器上讀取,目前大多都是使用Memcache來對Session進行儲存。

d. 把Session持久化到資料庫,目前採用此方案時所使用的資料庫一般為mysql。

參考《Session共享實作方案研究》

#1.8、測試php效能的工具,並找出瓶頸的方法。

XHProf(windows安裝方法參考這裡)是一個分層PHP效能分析工具。它會報告函數層級的請求次數和各種指標,包括阻塞時間,CPU時間和記憶體使用量。

它有一個簡單的HTML的使用者介面,基於瀏覽器的效能分析使用者介面能更容易查看,也能繪製呼叫關係圖。參數值查看。

1.9、介紹常見的SSO(單點登陸)的原理。

SSO是一種統一認證和授權機制,經過一個應用程式中的安全性驗證後,再存取其他應用程式中的受保護資源時,不再需要重新登入驗證。

解決了使用者只需要登入一次就可以存取所有互信的應用系統,而不用重複登入。

統一的認證系統是SSO的前提之一。認證系統的主要功能是將使用者的登入資訊和使用者資訊庫進行比較,對使用者進行登入認證;

認證成功後,認證系統應該會產生統一的認證標誌(ticket ),返還給用戶。另外,認證系統也應該對ticket進行效驗,判斷其有效性。

參考《單一登入SSO》

#1.10、您研究過的PHP框架的特點,主要解決什麼問題,與其他框架的不同點。

1.11、禁掉cookie的session使用方案

a. 透過 url傳值,把session id附加到url上(缺點:整個網站中不能有純靜態頁面,因為純靜態頁面session id 將無法繼續傳到下一頁面)

b. 透過隱藏表單,把session id放到表單的隱藏文字方塊中同表單一塊提交過去(缺點:不適用標籤這種直接跳轉的非表單的情況)

c. 直接設定php.ini檔案,將php.ini檔案裡的session.use_trans_sid= 0設為1(好像在win上不支援)

d. 用檔案、資料庫等形式保存Session ID,在跨頁過程中手動呼叫

1.12、PHP快取技術有哪些?

1. 全頁面靜態化緩存,也就是將頁面全部產生html靜態頁面,使用者造訪時直接造訪的靜態頁面,而不會去走php伺服器解析的流程

#2. 頁面部分緩存,將一個頁面中不常變的部分進行靜態緩存,而經常變化的塊不緩存,最後組裝在一起顯示

3 . 資料緩存,透過一個id進行請求的資料,將資料快取到一個php檔案,id和檔案是對應的,下次透過這個id進行請求時直接讀php檔案

4. 查詢緩存,和資料快取差不多,根據查詢語句進行快取;

#5. 記憶體式緩存,redis和memcache

#參考《PHP中9大快取技術總結》

1.13、JSON格式資料有哪些特點

a. JSON一種輕量級的資料交換格式。它是基於ECMAScript的一個子集。

b. JSON採用完全獨立於語言的文字格式,但也使用了類似C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等等)

c. 這些特性使JSON成為理想的資料交換語言。易於人閱讀和編寫,同時也易於機器解析和生成(網路傳輸速率)。

d. "名稱/值"對的集合,不同語言中,它被理解為物件(object),記錄(record),結構(struct),字典(dictionary) ,哈希表(hash table),鍵列表(keyed list)等

#e. 值的有序列表,多數語言中被理解為數組(array)

#參考《介紹JSON》

1.14、isset()、empty()與is_null的差異

isset():僅當null和未定義,返回false

empty():""、0、"0"、NULL、FALSE、array(),未定義,均傳回true

is_null():僅判斷是否為null,未定義封包警告

1.15、MVC的優缺點

優點:

分散關注、鬆散耦合、邏輯重複使用、標準定義

a. 開發人員可以只關注整個結構中的其中某一層,方便多開發人員間的分工

#b. 可以很容易的用新的實作來取代原有層次的實作

c. 降低層與層之間的依賴

d. 利於各層邏輯的複用,有利於標準化

e. 對單元測試的支援更加出色

缺點:

a. 清晰的架構以程式碼的複雜性為代價,對小型專案優可能反而降低開發效率

b. 降低了系統的效能,例如業務造訪資料庫現在必須透過中間層來完成

c. 控制層和表現層有時會過於緊密,導致沒有真正分離和重複使用

d. 有時會導致級聯的修改,如果在表示層中增加一個功能,為確保符合分層式結構,可能需要在對應的控制層和模型層中都增加對應的程式碼

##MVC的理解:

MVC是一個開發專案的思想,一個專案可以分成3個部分:資料部分(Model模型),業務邏輯部分(Controller控制器),資料的外在表現(檢視視圖),

客戶端請求專案的控制器,如果執行過程中需要用到數據,控制器就會到模型中獲取數據,再將獲取到的數據透過視圖顯示出來。

1.16、PHP中單引號和雙引號有什麼差別?哪個速度更快?

單引號更快

單引號內的資料不會被解析(任何變數和特殊轉義字元),所以速度更快

雙引號要先找出語句中是否有變量,雙引號內的資料會被解析,如變數($var)值會代入字串中,特殊轉義字符也會被解析成特定的單字

這裡順便說個定界符(heredoc syntax)“<<<”,

#其作用就是按照原樣,包括換行格式什麼的,輸出在其內部的東西,任何特殊字元都不需要轉義,變數會被正常的用其值來替換

1.17、簡述GBK,GBK2312,BIG5,GB18030

GB2312支援的漢字較少,GBK是相比GB2312漢字更為豐富,包括全部的中日韓漢字

GB18030相比GBK增加了一些少數民族漢字漢字庫更為多樣化,常人很少用

一般簡體中文使用GBK而繁體中文使用BIG5

1.18、介面與抽象類別的差別是什麼?

抽象類別:

抽象類別是不能被實例化的類,只能作為其他類別的父類來使用,抽象類是透過關鍵字abstract來宣告

抽象類別與普通類別類似,都包含成員變數與成員方法,兩者的差異在於,抽象類別中至少包含一個抽象方法

抽象方法沒有方法體,此方法天生就是要被子類別重寫的

抽象方法的格式為:abstract function abstractMethod()

子類別繼承抽象類別使用extends

#介面:

介面是透過interface關鍵字來聲明,介面中的成員常數和方法都是public的,方法可以不寫關鍵字public

介面中的方法也是沒有方法體的,介面中的方法也是天生要被子類別實作的

介面能實作多重繼承

#子類別實作介面使用implements

1.20、php中傳值與傳引用的區別

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

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

1.21、php5的建構子和析構函數

__construct:這個函數將會被當成是建構子並且在建立一個物件實例時被執行

__destruct:PHP將在物件被銷毀前呼叫這個函數.它稱為析構函數

1.22、PHP的垃圾收集機制是怎麼樣的?

PHP是一門託管型語言,在PHP程式設計中程式設計師不需要手動處理記憶體資源的分配與釋放,這意味著PHP本身實現了垃圾回收機制(Garbage Collection)

PHP使用的回收演算法是引用計數法,每個php變數存在一個叫做"zval"的變數容器中。

一個zval變數容器,除了包含變數的型別和值,還包含兩個位元組的額外資訊。第一個是"is_ref",是個bool值,用來識別這個變數是否是屬於引用集合(reference set)。

第二個額外位元組是"refcount",用以表示指向這個zval變數容器的變數(也稱為符號即symbol)個數。

把一個變數賦值給另一個變數會增加引用次數(refcount)

當任何關聯到某個變數容器的變數離開它的作用域(例如:函數執行結束),或是對變數呼叫了函數unset()時,"refcount"就會減1

變數容器在"refcount"變成0時就被銷毀

1.23、說幾個你知道的設計模式?

單例模式:保證一個類別只有一個實例,並提供一個存取他的全域存取點例如框架中的資料庫連線

簡單工廠模式:它具有創建對象的某些方法,可以使用工廠類別創建對象,而不直接使用 new。例如初始化資料庫的時候會用到,例如MySQL,MSSQL

策略模式:針對一組演算法,將每一個演算法封裝到具有共同介面的獨立的類別中,例如進入個人主頁時,根據瀏覽者的不同,給予不同的顯示與操作

註冊模式:提供了在程式中有條理的存放並管理一組全域物件 (object),例如ZF框架中的Zend_Registry::set

適配器模式:將不同介面適配器為統一的API接口,例如資料操作有mysql、mysqli、pdo等,可利用適配器模式統一介面

觀察者模式:一個物件透過新增一個方法使本身變得可觀察。當可觀察的物件變更時,它會將訊息傳送到已註冊的觀察者。例如實作實作訊息推送

裝飾模式:在不修改原始程式碼和繼承的情況下動態擴充類別的功能,例如框架的每個Controller檔案會提供before和after方法

迭代器模式:提供一個方法順序存取一個聚合物件中各個元素,在PHP中將繼承Iterator類別

原型模式:實作了一個原型接口,該接口用於創建當前物件的克隆。當直接建立物件的代價比較大時,則採用這種模式。例如,一個物件需要在一個高代價的資料庫操作之後被建立。

二、PHP編碼

2.1、mysqli_real_connect()和mysqli_connect()有啥差別?

a. mysqli_real_connect() 要求一個由 mysqli_init() 所建立的有效的物件

b. mysqli_real_connect() 可以與 my

b. mysqli_real_connect() 可以與 my

b.一同使用來設定連線的不同選項

c. mysqli_real_connect() 有一個flag參數

2.2、遍歷目錄及子目錄中的檔案

這裡可以用scandir(),或是glob()函數,這裡有篇文章介紹了《四種方法》,線上程式碼中有兩種方法。

2.3、 給任一段URL,取出該URL中包含的副檔名。如“http://www.pwstrick.com/test.php?somevar”,回傳.php或php

#使用了5種方法,pathinfo(),explode(), basename()、strpos()跟substr()的組合,

使用正規(可以參考我先前的一篇文章《JavaScript與PHP中正規》)以及parse_url()。查看線上代碼。

######2.4、PHP怎麼防止SQL注入? ######

使用預處理語句和參數化查詢。預處理語句和參數分別傳送到資料庫伺服器進行解析,參數將會被當作普通字元處理。

這種方式使得攻擊者無法注入惡意的SQL。 你有兩種選擇來實現該方法:PDO和MySQLI,查看線上程式碼。參考《PHP中該如何防止SQL注入》

2.5、include、require、include_once與require_once的差異

#a. include與require都是引入指定的文件。 _once表示只引入一次,即先前已經引入過的不再引入。

b. 載入失敗的處理方式不同:

#include在引入不儲存檔案時產生警告且腳本還會繼續執行,包含進來。通俗點兒講就是:帶上她!

require則會導致一個致命性錯誤且腳本停止執行,有賴於這個檔案。通俗點兒講就是:我要她!

c. include是有條件包含函數,而require則是無條件包含函數。

d. include()執行時需要引用的檔案每次都要進行讀取和評估,require()執行時需要引用的檔案只處理一次(實際上執行時需要引用的檔案內容取代了require()語句)

e. include有回傳值,而require沒有。參考《PHP中include require include_once require_once 的差異》

2.6、寫出一些php魔術方法

#PHP 將所有以 __(兩個底線)開頭的類別方法保留為魔術方法。所以定義類別方法時,建議不要以__ 為前綴,請查看PHP手冊。

2.7、shell指令方式三種向PHP傳入參數的方式

#使用$argc $argv;使用getopt函數();提示使用者輸入,然後取得輸入的參數。參考《PHP傳入參數》

2.8、寫一個函數,算出兩個檔案的相對路徑,如$a = "/a/b/c/d/e.php "; $b = "/a/b/12/34/c.php";

#計算 $a相對於$b 的相對路徑應該是 "../. ./12/34/c.php"

先將兩個字串用「/」分割成數組,再用array_diff_assoc先檢查$a與$b數組的差集。再$b與$a做差集。查看線上代碼。

2.9、用php寫出顯示客戶端IP、伺服器端IP的程式碼和網頁位址

客戶端IP:$_SERVER[ "REMOTE_ADDR"]

伺服器端IP:$_SERVER["SERVER_ADDR"]

網頁位址:$_SERVER["REQUEST_URI"]

目前腳本的執行路徑:$_SERVER["SCRIPT_FILENAME"]或__FILE__

目前腳本的名稱:$_SERVER["PHP_SELF" ]或$_SERVER["SERIPT_NAME"]

連結到前一頁的URL位址:$_SERVER["HTTP_REFERER"]

#2.10 、error_reporting(2047)什麼作用

error_reporting,設定應該報告何種 PHP錯誤,這裡是指顯示所有的錯誤 E_ALL

#2.11 、echo,print(),print_r(),printf(),sprintf(),var_dump()有什麼差別

echo:是語句不是函數,沒有回傳值,可輸出多個變數值,不需要圓括號。不能輸出數組和對象,只能列印簡單型別(如int,string)

#

print:是語句不是函數,有回傳值 1,只能輸出一個變量,不需要圓括號。不能輸出數組和對象,只能列印簡單型別(如int,string)。

print_r:是函數,可以列印複合型別,例如:stirng、int、float、array、object等,輸出array時會用結構表示,

#而且可以透過print_r($str,true)來讓print_r不輸出而回傳print_r處理後的值

printf:是函數,把文字格式化以後輸出(參考C語言)

sprintf:是函數,跟printf相似,但不列印,而是回傳格式化後的文字,其他的與printf一樣。

var_dump:函數,輸出變數的內容、型別或字串的內容、型別、長度。常用來調試。

2.12、$a = 1; $x =&$a; $b=$a++;求$b和$x的值

$b=1,$x=2

2.13、php中對陣列序列化和反序列化的函數,把utf-8轉換成gbk的函數

serialize,unserialize,iconv("utf-8","gbk",$strs)

##2.14、strlen()與mb_strlen的功能分別是什麼?

strlen()無法正確處理中文字串的佔位,對於gb2312得到的是漢字個數的2倍,utf8得到的是漢字個數的3倍

mb_strlen()就很好的解決了這個問題,它的第二個參數就是設定字元編碼的

2.15、用PHP能創建多層目錄

mkdir($path, 0777, true);

2.16、mysql_num_rows()和mysql_affected_rows()的作用與差異

兩者都是傳回結果集中的行數,不同的是前者只對select運算有效,後者對update,insert,delete所影響的行數有效

2.17、請列舉、你能想到的所有的字串查找演算法,並加註解簡單說明

順序查找,二分查找,分塊查找,哈希表查找

2.18、根據下面的程式碼寫出結果

$a = 2;$b = &$a ;unset($a);echo$b;

雖然使用了unset,釋放給定的變量,只是斷開了變數名稱和變數內容之間的綁定,並不意味著變數內容被銷毀了。所以輸出結果為“2”。

$a = 2;$b = 3;$c = &$a;$c = 2;if(($a=5)>0 || ($b=$a)>0) {
$a++;$b++;

#}echo$a.'-'.$b.'- '.$c;

這裡注意「||」這個符號,$a=5這裡已經滿足條件了,那麼$b=$a就不用去執行了,那麼$ b還是3。

經過$a++和$b++後,兩個變數都加1,變成6和4。而$c已經引用了$a,那麼值也變成6。最後輸出結果為“6-4-6”。參考《PHP引用(&)使用詳解》

2.19、寫個函數來解決多執行緒同時讀寫一個檔案的問題

先用fopen開啟某個文件,然後flock加鎖,再用fwrite寫內容,接著flock釋放鎖,最後fclose關閉文檔。查看線上代碼。

2.20、 設定session過期的方法,對應函數

a. setcookie()直接設定session_id的生命週期。

b. 使用session_set_cookie_params(),且session_regenerate_id(true),當為true時則改變session_id的值,並清空目前session陣列。

查看線上程式碼。

2.21、php取得檔案內容的方法,對應的函數

a. file_get_contents得到檔案的內容(可以以get和post的方式取得),整個檔案讀入一個字串中

b. 用fopen開啟url,以get方式取得內容(借助fgets()函數)

c. 用fsockopen函數開啟url(可以以get和post的方式取得),以get方式取得完整的數據,包括header和body

d. 使用curl函式庫取得內容,使用curl函式庫之前,需要先查看php.ini,看看是否已經開啟了curl擴充

2.22、php陣列函數常見的哪些?

a. 數組操作的基本函數(array_values、array_keys、array_flip、array_search、array_reverse、in_array、array_key_exists、array_count_values)

b.數組的分段和填充(array_slice、array_splice、array_chunk)

c. 數組與棧,列隊(array_push、array_pop、array_shift、array_unshift)

d. 數組的排序(sort、asort、ksort)

e. 數組的計算(array_sum、array_merge、array_diff、array_intersect)

f. 其他的陣列函數(array_unique、shuffle)

#2.23、寫一段上傳檔案的程式碼

POST方法上傳,可以使用戶上傳文字和二進位。用 PHP的認證和檔案操作函數,可以完全控制允許哪些人上傳以及檔案上傳後怎麼處理。

透過$_FILES接收透過HTTP上傳到伺服器的文件,上傳的內容儲存在$_FILES['xx']['tmp_name']中,然後再透過move_uploaded_file,將上傳的檔案移動到新位置。

在看些封裝的上傳類別的時候,看到個函數strrchr,找出指定字元在字串中的最後一次出現,用這函數取得後綴。 ############2.24、寫出一個正規表示式,過慮網頁上的所有JS/VBS腳本(即把標記及其內容都去掉)########## ##/<[^>].*?>.*?<\/>/si。查看正規線上工具,有現成正規說明。 ############2.25、用PHP印出前一天的時間格式是2006-5-10 22:21:21#############echo date('Y-m-d H:i:s', strtotime('-1 day'));查看更多Date/Time函數。 ############2.26、foo()和@foo()之間有什麼不同? ############foo()會執行這個函數,任何解釋錯誤,語法錯誤,執行錯誤都會在頁面上顯示出來############@foo( )執行這個函數時,會隱藏上述的錯誤訊息############2.27、sort(),asort(),ksort(),arsort(),rsort()各有什麼差別############sort:對陣列進行排序,當函數結束時陣列單元將被從最低到最高重新安排############rsort:對陣列進行逆向排序############asort:對陣列進行排序並保持索引關係############arsort:對陣列進行逆向排序並保持索引關係### ###

ksort:對陣列進行依照鍵名排序,保留鍵名到資料的關聯,主要用於關聯數組

2.28、什麼是可變變數?以下程式的輸入值是什麼?

可變變數就是要取得一個普通變數的值作為這個可變變數的變數名稱。輸出值為“ok”。

$str = 'cd';

#$$str = 'hotdog';

$$str = 'ok';echo$cd;

2.29、echo count("abc")會輸出什麼?

count()函數計算數組中的單元數目或物件中的屬性個數,通常是一個array()

對於對象,如果安裝了 SPL,可以透過實作 Countable 介面來呼叫count()。此介面只有一個方法count(),此方法傳回count()函數的回傳值。

如果參數不是數組型或實作了countable介面的對象,將傳回1,只有一個例外,如果參數是NULL,則結果是0。

2.30、GD庫有什麼作用?

GD庫提供了一系列用來處理圖片的API,使用GD庫可以處理圖片,或是產生圖片。

在網站上GD庫通常用來產生縮圖或用來為圖片加浮水印或對網站資料產生報表。

三、資料庫

3.1、設一資料量為千萬級的資料庫,透過監控發現,有90%的查詢請求都是指向同一部​​分資料的,而這部分資料只佔整個資料庫容量的1%。

a.這種1%資料支撐了90%的查詢工作,建義獨立起來,這個方便資料在資料的buffer裡,提高查詢效率。

b.分庫:後效能快速提升,如果效率還是上不去,可以考慮在那1%的資料上做一些nosql快取。

c.分錶:能夠在資料庫缺少叢集解決方案的情況下獲得一定的橫向擴展能力,同時負載也能分擔到多台實體設備,從這個角度上講也能解決一些效能瓶頸。

d.如果有條件的話,此應用程式也可以透過快取方案來解決,例如透過memcached,redis快取1%結果集。

參考《ChinaUnix問答的討論》與《德問的討論》

3.2、MySQL如何分庫分錶?

參考《MySQL分庫分錶環境下全域ID生成方案》,《第一次操刀資料庫分錶的教訓與經驗》,《mysql分庫分錶的一些技巧》

3.3、MySQL資料庫儲存引擎有哪些?

MyISAM、InnoDB、HEAP、BOB、ARCHIVE、CSV等

3.4、 MyISAM與InnoDB的差異

#a. 儲存結構:MyISAM在磁碟上儲存成三個檔案。而InnoDB所有的表都保存在同一個資料檔案中,一般為2GB

#b. 儲存空間:MyISAM可被壓縮,儲存空間較小。 InnoDB需要更多的記憶體和存儲,它會在主記憶體中建立其專用的緩衝池用於高速緩衝資料和索引。

c. 事務支援:MyISAM不提供交易支援。 InnoDB提供事務支援事務,外部鍵等高階資料庫功能。

d. AUTO_INCREMENT: MyISAM可以和其他欄位一起建立聯合索引。 InnoDB中必須包含只有該欄位的索引。

e. 表鎖差異:MyISAM只支援表級鎖定。 InnoDB支援事務和行級鎖定。

f. 全文索引:MyISAM支援FULLTEXT類型的全文索引。 InnoDB不支援。

g. 表主鍵:MyISAM允許沒有任何索引和主鍵的表存在,索引都是保存資料列的位址。 InnoDB如果沒有設定主鍵或非空唯一索引,就會自動產生一個6位元組的主鍵(使用者不可見),資料是主索引的一部分,附加索引保存的是主索引的值。

h. 表的特定行數:MyISAM保存有表格的總行數。 InnoDB沒有保存表格的總行數。但是加了wehre條件後,myisam和innodb處理的方式都一樣。

i. 外鍵:MyISAM不支援。 InnoDB支援

j. CURD操作:MyISAM如果執行大量的SELECT,MyISAM是更好的選擇。如果你的資料執行大量的INSERT或UPDATE,出於效能方面的考慮,應該使用InnoDB表。

參考《MySQL儲存引擎中的MyISAM和InnoDB》

3.5、MySQL資料型別有哪些?

參考《SQL資料類型》

3.6、MySQL資料庫作發布系統的存儲,一天五萬條以上的增量,預計維運三年,怎麼優化?

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

b.選擇合適的表格欄位資料類型和儲存引擎,適當的添加索引。

c. mysql庫主從讀寫分開。

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

e。增加緩存機制,例如memcached,apc等。

f. 不常改變的頁面,產生靜態頁面。

g. 書寫高效率的SQL

#3.7、sql語句該考慮哪些安全性?

主要是防止注入,做好 ' " / \等特殊字元的轉義,資料提交時注意html過濾,注意--,#這樣的註釋,注意子查詢和一些mysql函數sleep,load_file等等

3.8、MYSQL取得目前時間的函數是?格式化日期的函數? ); date_format();查看更多MySQL內建函數。

##隨著訪問量的上升,幾乎大部分使用MySQL架構的網站在資料庫上都開始出現了效能問題,程式設計師開始大量的使用快取技術來緩解資料庫的壓力,優化資料庫的結構和索引。擴展,然後又出現了一致性hash來解決增加或減少快取伺服器導致重新hash帶來的大量快取失效的弊端。

##Memcached只能緩解資料庫的讀取壓力。和讀庫的可擴展性。

隨著web2.0的持續高速發展,MySQL主函式庫的寫入壓力開始出現瓶頸,而資料量的持續激增,由於MyISAM使用表鎖,在高並發下會出現嚴重的鎖問題,大量的高並發MySQL應用程式開始使用InnoDB引擎取代MyISAM。同時,開始流行使用分錶分庫來緩解寫入壓力和資料成長的擴展問題。

MySQL的擴展性瓶頸

大數據量高並發環境下的MySQL應用程式開發越來越複雜,也越來越具有技術挑戰性。分錶分庫的規則把握都是需要經驗的。分庫分錶的子庫到一定階段又面臨擴充問題。還有就是需求的變更,可能又需要一種新的分庫方式。 MySQL資料庫也常儲存一些大文字字段,導致資料庫表非常的大,在做資料庫復原的時候就導致非常的慢,不容易快速恢復資料庫。大數據下IO壓力大,表結構改變困難,正是目前使用MySQL的開發人員面臨的問題。

3.10、什麼叫關係型資料庫?

關係型資料庫是支援採用了關係模型的資料庫,簡單來說,關係模型就是指二維表模型。

關係型資料庫以行和列的形式儲存數據,以便於使用者理解。這一系列的行和列稱為表,一組表組成了資料庫。

四、linux基礎

4.1、linux下查看目前系統負載資訊的一些方法

參考《linux下查看系統資源與負載,以及效能監控》

4.2、vim的基本快速鍵

  參考《史上最全Vim快捷鍵鍵鍵位圖-- 入門到進階》

4.3、請說明下列10個shell指令的用途top、ps、mv、find、df、cat、 chmod、chgrp、grep、wc

top 查看系統行程佔用資源的情況。 ps顯示詳細的進程資訊。

mv是為檔案或目錄改名,或將檔案從一個目錄移植到另一個目錄。

find 尋找檔案或目錄。

df 檢查檔案系統的磁碟空間佔用情況。

cat 顯示文件內容,建立文件一個新的文件,合併文件內容。

chmod 改變檔案或目錄的存取權限。

chgrp 改變檔案或目錄所屬的群組。

grep是一個強大的文字搜尋工具。

wc 統計指定檔案的資料訊息,例如行數,位元組數

4.4、core檔案是什麼,有什麼用?

core是unix系統的核心。當你的程式出現記憶體越界的時候,作業系統會中止你的進程,並將目前記憶體狀態倒出到core檔中,以便進一步分析。

程式設計師可以透過core檔案找出問題所在。它記錄了程式掛掉時詳細的狀態描述。

五、網路基礎

5.1、寫出下列服務的用途與預設連接埠ftp、ssh、http、telnet、https

ftp檔案傳輸協定是常見的檔案拷貝方式,預設的是20用於資料連接,21用於控制連接埠。

ssh連線伺服器執行操作,預設的是22連接埠號碼。

HTTP超文本傳輸協議,提供一種發布和接收HTML頁面的方法,連接埠號碼為80

#

Telnet協定是TCP/IP協定族中的一員,是Internet遠端登陸服務的標準協定和主要方式,預設連接埠為23

HTTPS是以安全為目標的HTTP通道,簡單講是HTTP的安全版,預設連接埠為443

5.2、寫出你能想到的所有HTTP回傳狀態值,並說明用途(例如:返回404表示找不到頁面)

200 OK 請求成功(其後是對GET和POST請求的應答文檔)

## 301 Moved Permanently 所請求的頁面已經轉移至新的url

#302 Found 所請求的頁面已經暫時轉移至新的url

# 304 Not Modified,伺服器告訴客戶,原來緩衝的文件還可以繼續使用

#401 Unauthorized 被要求的頁面需要使用者名稱和密碼

# 403 Forbidden 對被要求頁面的存取被禁止

500 Internal Server Error,請求未完成。伺服器遇到不可預測的情況

502 Bad Gateway,請求未完成。伺服器從上游伺服器收到一個無效的回應

503 Service Unavailable 請求未完成。伺服器暫時過載或當機

更多狀態碼參考《HTTP狀態訊息》

5.3、POST和GET有什麼差別?

a. GET是從伺服器上取得數據,POST是傳送資料給伺服器

b. GET是透過發送HTTP協定透過URl參數傳遞進行接收,而POST是實體數據,透過表單提交

c. GET傳送的資料量較小,不能大於2KB。 POST傳送的資料量較大,一般被預設為不受限制。但理論上,IIS4中最大量為80KB,IIS5中為100KB

#d. GET安全性非常低,POST安全性較高

#5.4、請寫出HTTP頭,並符合下列要求:

1)這是一個post請求

2)目標: http://www.example.com:8080/test

3)POST變數:username: test pwd: test2 intro: Hello world!

#4)包含以下COOKIE資訊:cur_query: you&me

#POST http://www.example.com:8080/test HTTP/1.1

#Cookie:cur_query=you&me

username=test&pwd:=test2&intro=Hello world!

#更多屬性查看《HTTP Header詳解》

六、伺服器基礎

6.1、Apache與Nginx的優缺點比較

####a. nginx相對於apache的優點:############輕量級,比apache佔用更少的記憶體及資源。高度模組化的設計,編寫模組相對簡單############抗並發,nginx處理請求是異步非阻塞,多個連接(萬級別)可以對應一個進程,而apache則是阻塞型的,是同步多進程模型,一個連接對應一個進程,在高並發下nginx能保持低資源低消耗高性能############nginx處理靜態文件好,Nginx靜態處理性能比 Apache高 3倍以上############b. apache 相對於nginx 的優點:#######

apache 的rewrite比nginx的rewrite強大,模組非常多,基本上想到的都可以找到,比較穩定,少bug,nginx的bug相對較多

c. 原因:

得益於Nginx使用了最新的epoll(Linux 2.6核心)和kqueue(freebsd)網路I/O模型,而Apache則使用的是傳統的select模型。

目前Linux下能夠承受高並發存取的Squid、Memcached都採用的是epoll網路I/O模型。

處理大量的連接的讀寫,Apache所採用的select網路I/O模型非常低效。

參考《Apache與Nginx的優缺點比較》

6.2、cgi與fastcgi的差異

#CGI:在2000年或更早的時候用得比較多, 以前web伺服器一般只處理靜態的請求,web伺服器會根據這次請求的內容,然後會fork一個新進程來運行外部c程序(或perl腳本...), 這個進程會把處理完的資料回傳給web伺服器,最後web伺服器把內容傳送給用戶,剛才fork的進程也隨之退出。 如果下次用戶還要求改動態腳本,那麼web伺服器又再次fork一個新進程,周而復始的進行。

web內建模組:後來出現了更進階的方式是, web伺服器可以內建perl解釋器或php解釋器。 也就是說這些解釋器做成模組的方式,web伺服器會在啟動的時候就啟動這些解釋器。 當有新的動態請求進來時,web伺服器就是自己解析這些perl或php腳本,省得重新fork一個進程,效率提高了。

fastcgi:是web伺服器收到一個請求時,他不會重新fork一個進程(因為這個進程在web伺服器啟動時就開啟了,而且不會退出),web伺服器直接把內容傳遞給這個進程(進程間通信,但fastcgi使用了別的方式,tcp方式通信),這個進程收到請求後進行處理,把結果返回給web伺服器,最後自己接著等待下一個請求的到來,而不是退出。


參考《fastcgi與cgi有什麼不同》

6.3、Memcached與Redis差異

#a. Redis中,並不是所有的資料都一直儲存在記憶體中的,這是和Memcached相比一個最大的差異。

b. Redis在許多方面具備資料庫的特徵,或者說就是一個資料庫系統,而Memcached只是簡單的K/V快取。

c. 在100k以上的資料中,Memcached效能要高於Redis。

d. 如果要說記憶體使用效率,使用簡單的key-value儲存的話,Memcached的記憶體利用率更高,而如果Redis採用hash結構來做key-value存儲,由於其組合式的壓縮,其記憶體利用率會高於Memcached。當然,這和你的應用場景和資料特性有關。

e. 如果你對資料持久化和資料同步有所要求,那麼推薦你選擇Redis,因為這兩個特性Memcached都不具備。即使你只是希望在升級或重新啟動系統後快取資料不會遺失,選擇Redis也是明智的。

f. Redis和Memcache在寫入效能上面差別不大,讀取效能上面尤其是批次讀取效能上面Memcache更強。

參考《Redis與Memcached的區別》

#6.4、PHP有哪些優缺點?

優點:

a. 文法簡單的,上手很快,而且還有很多很方便的開發工具,比如說Zend Studio ,EclipsePHP Studio等

b. 跨平台,而且還都是免費的,可以快速的在搭建LAMP(Linux Apache MYSQL, PHP),支援許多主流的資料庫系統,例如MYSQL,Oracle, PostgreSQL等等

c. 支援目前主流的技術,例如WebService ,XML, AJAX 等等

d. PHP已經有很成熟的物件導向體系,可以支援物件導向的開發(PHP5)

e. 有許多很好現有的框架,開源的論壇,以及部落格等

##f. 持續的更新與維護,以及社群的支撐,許多技術愛好者的共同努力,使PHP得到很廣泛的應用,許多知名的網站也在使用PHP作為開發語言

缺點:

a. 對多執行緒支援不是很好,只能做一些簡單的類比執行緒

b. 語法不夠嚴謹,如果以前做C++,Java的就會很有感覺了,例如變數還沒定義,就可能直接使用

#c. 也許有經驗的PHP程式設計師最感到痛苦的地方是PHP的解釋運作機制。這種運作機制使得每個PHP頁面被解釋執行後,所有的相關資源都會被回收。也就是說,PHP在語言層級上沒有辦法讓某個物件常駐記憶體。在PHP中,所有的變數都是頁面層級的,無論是全域變量,或是類別的靜態成員,都會在頁面執行完畢後被清空。以JSP為例,在JSP中,Java Bean的scope有四種有效值:Page、Application、Session、Request,分別對應頁面、程式、會話、請求四種生存期。但在PHP中,只有Page一種存活期。

相關推薦:

PHP面試重點題目分享(一)#

以上是PHP重點面試題小結分享(二)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn