蒐集這些題目是想在學習PHP方面知識有更感性的認識,單純看書的話會很容易看後就忘記。php
曾經看過數據結構、設計模式、HTTP等方面的書籍,可是基本看完後就是看完了,沒有而後了,隨着時間的推移,也就漸漸忘記了。html
因此經過此次蒐集題目,能夠複習複習一些知識點。並且本身動手寫寫,動腦思考,能更好的記住這些知識點。mysql
留份記錄也方便之後本身查看。題目基本都來自網絡,若是有不正確的地方歡迎指出或補充。linux
1.一、PHP裏面是區分大小寫的嗎?nginx
PHP對於系統函數、用戶自定義函數、類名稱等是不區分大小寫的git
PHP中的變量和常量是區分大小寫的程序員
對於文件名又因服務器操做系統而定,linux中區分,Win不區分github
1.二、$_POST,$HTTP_RAW_POST_DATA 和 php://input 的區別?web
$_POST:面試
是獲取表單POST過來數據,MIME類型是「application/x-www-form-urlencoded」。可參考《什麼是 MIME TYPE?》
意思就是字段名和值都編碼了,每一個 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.三、沒有經過static定義的方法,可否經過」對象名::方法名「這樣的形式來調用?
會產生一個strict錯誤,但在會繼續執行代碼。參考《PHP靜態調用非靜態方法》。這篇文章裏面還講到了一個概念「calling scope」。
靜態調用並非說有::就是靜態調用,而是看calling scope。$this指針指向的對象就是這個方法被調用時刻的calling scope。
1.四、請簡單闡述您最得意的開發之做
1.五、對於大流量的網站,您採用什麼樣的方法來解決各頁面訪問量統計問題
a. 確認服務器是否能支撐當前訪問量。
b. 優化數據庫訪問。(參考3.5)
c. 禁止外部訪問連接(盜鏈), 好比圖片盜鏈。
d. 控制文件下載。
e. 使用不一樣主機分流。
f. 使用瀏覽統計軟件,瞭解訪問量,有針對性的進行優化。
1.六、請介紹Session的原理
由於HTTP是無狀態的,因此一次請求完成後客戶端和服務端就再也不有任何關係了,誰也不認識誰。
但因爲一些須要(如保持登陸狀態等),必須讓服務端和客戶端保持聯繫,session ID就成了這種聯繫的媒介了。
當用戶第一次訪問站點時,PHP會用session_start()函數爲用戶建立一個session ID,這就是針對這個用戶的惟一標識,
每個訪問的用戶都會獲得一個本身獨有的session ID,這個session ID會存放在響應頭裏的cookie中,以後發送給客戶端。
這樣客戶端就會擁有一個該站點給他的session ID。
當用戶第二次訪問該站點時,瀏覽器會帶着本地存放的cookie(裏面存有上次獲得的session ID)隨着請求一塊兒發送到服務器,
服務端接到請求後會檢測是否有session ID,若是有就會找到響應的session文件,把其中的信息讀取出來;若是沒有就跟第一次同樣再建立個新的。
參考《Session原理簡述》
1.七、session共享問題解決方案
a. 客戶端Cookie保存,以cookie加密的方式保存在客戶端,每次session信息被寫在客服端,而後經瀏覽器再次提交到服務器。
b. 服務器間Session同步,使用主-從服務器的架構,當用戶在主服務器上登陸後,經過腳本或者守護進程的方式,將session信息傳遞到各個從服務器中
c. 使用集羣統一管理Session,當應用系統須要session信息的時候直接到session羣集服務器上讀取,目前大多都是使用Memcache來對Session進行存儲。
d. 把Session持久化到數據庫,目前採用這種方案時所使用的數據庫通常爲mysql。
參考《Session共享實現方案調研》
1.八、測試php性能性能的工具,和找出瓶頸的方法。
XHProf(windows安裝方法參照這裏)是一個分層PHP性能分析工具。它報告函數級別的請求次數和各類指標,包括阻塞時間,CPU時間和內存使用狀況。
它有一個簡單的HTML的用戶界面,基於瀏覽器的性能分析用戶界面能更容易查看,也能繪製調用關係圖。參數值查看。
1.九、介紹一下常見的SSO(單點登錄)的原理。
SSO是一種統一認證和受權機制,經過一個應用中的安全驗證後,再訪問其餘應用中的受保護資源時,再也不須要從新登陸驗證。
解決了用戶只須要登陸一次就能夠訪問全部相互信任的應用系統,而不用重複登陸。
統一的認證系統是SSO的前提之一。認證系統的主要功能是將用戶的登陸信息和用戶信息庫相比較,對用戶進行登陸認證;
認證成功後,認證系統應該生成統一的認證標誌(ticket),返還給用戶。另外,認證系統還應該對ticket進行效驗,判斷其有效性。
參考《單點登陸SSO》
1.十、您研究過的PHP框架的特色,主要解決什麼問題,與其餘框架的不一樣點。
1.十一、禁掉cookie的session使用方案
a. 經過 url 傳值,把session id附加到url上(缺點:整個站點中不能有純靜態頁面,由於純靜態頁面session id 將沒法繼續傳到下一頁面)
b. 經過隱藏表單,把session id 放到表單的隱藏文本框中同表單一塊提交過去(缺點:不適用<a>標籤這種直接跳轉的非表單的狀況)
c. 直接配置php.ini文件,將php.ini文件裏的session.use_trans_sid= 0設爲1(好像在win上不支持)
d. 用文件、數據庫等形式保存Session ID,在跨頁過程當中手動調用
1.十二、PHP緩存技術有哪些?
1. 全頁面靜態化緩存:也就是將頁面所有生成html靜態頁面,用戶訪問時直接訪問的靜態頁面,而不會去走php服務器解析的流程
2. 頁面部分緩存:將一個頁面中不常常變的部分進行靜態緩存,而常常變化的塊不緩存,最後組裝在一塊兒顯示
3. 數據緩存:經過一個id進行請求的數據,將數據緩存到一個php文件中,id和文件是對應的,下次經過這個id進行請求時直接讀php文件
4. 查詢緩存:和數據緩存差很少,根據查詢語句進行緩存;
5. 內存式緩存:redis和memcache
參考《PHP中9大緩存技術總結》
1.1三、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.1四、isset() 、empty()與is_null的區別
isset():僅當null和未定義,返回true
empty():""、0、"0"、NULL、FALSE、array(),未定義,均返回true
is_null():僅判斷是否爲null,未定義 報警告
1.1五、MVC的優缺點
優勢:
分散關注、鬆散耦合、邏輯複用、標準定義
a. 開發人員能夠只關注整個結構中的其中某一層,方便多開發人員間的分工
b. 能夠很容易的用新的實現來替換原有層次的實現
c. 下降層與層之間的依賴
d. 利於各層邏輯的複用,有利於標準化
e. 對單元測試的支持更加出色
缺點:
a. 清晰的構架以代碼的複雜性爲代價, 對小項目優可能反而下降開發效率
b. 下降了系統的性能,例如業務造訪數據庫如今必須經過中間層來完成
c. 控制層和表現層有時會過於緊密,致使沒有真正分離和重用
d. 有時會致使級聯的修改,若是在表示層中增長一個功能,爲保證符合分層式結構,可能須要在相應的控制層和模型層中都增長相應的代碼
1.1六、PHP中單引號和雙引號有什麼區別?哪一個速度更快?
單引號更快
單引號內的數據不會被解析(任何變量和特殊轉義字符),因此速度更快
雙引號要先查找語句中是否有變量,雙引號內的數據會被解析,如變量($var)值會代入字符串中,特殊轉義字符也會被解析成特定的單個字
這裏順便說個定界符(heredoc syntax)「<<<」,
其做用就是按照原樣,包括換行格式什麼的,輸出在其內部的東西,任何特殊字符都不須要轉義,變量會被正常的用其值來替換
1.1七、簡述GBK,GBK2312,BIG5,GB18030
GB2312支持的漢字較少,GBK是相比GB2312漢字更爲豐富,包括所有的中日韓漢字
GB18030相比GBK增長了一些少數民族漢字漢字庫更爲多樣,常人不多用
通常簡體中文使用GBK而繁體中文使用BIG5
1.1八、接口與抽象類的區別是什麼?
抽象類:
抽象類是不能被實例化的類,只能做爲其餘類的父類來使用,抽象類是經過關鍵字abstract來聲明
抽象類與普通類相似,都包含成員變量和成員方法,二者的區別在於,抽象類中至少包含一個抽象方法
抽象方法沒有方法體,該方法天生就是要被子類重寫的
抽象方法的格式爲:abstract function abstractMethod()
子類繼承抽象類使用extends
接口:
接口是經過interface關鍵字來聲明,接口中的成員常量和方法都是public的,方法能夠不寫關鍵字public
接口中的方法也是沒有方法體的,接口中的方法也是天生要被子類實現的
接口能實現多繼承
子類實現接口使用implements
1.1九、談談對mvc的認識
MVC(Model/View/Controller)模式包括三類對象。
Model是應用對象,View是它在屏幕上的表示,Controller定義用戶界面對用戶輸入的響應方式
模型(Model)模型是應用程序的主體部分。模型表示業務數據,或者業務邏輯
視圖(View) 視圖是應用程序中用戶界面相關的部分,是用戶看到並與之交互的界面
控制器(controller) 控制器工做就是根據用戶的輸入,控制用戶界面數據顯示和更新model對象狀態
1.20、php中傳值與傳引用的區別
按值傳遞:函數範圍內對值的任何改變在函數外部都會被忽略
引用傳遞:函數範圍內對值的任何改變在函數外部也能反映出這些修改
1.2一、php5的構造函數和析構函數
__construct:這個函數將被當成是一個構造函數並在創建一個對象實例時被執行
__destruct:PHP將在對象被銷燬前調用這個函數. 它稱爲析構函數
1.2二、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.2三、說幾個你知道的設計模式?
單例模式:保證一個類僅有一個實例,並提供一個訪問他的全局訪問點例如框架中的數據庫鏈接
簡單工廠模式:它具備建立對象的某些方法,可使用工廠類建立對象,而不直接使用 new。例如初始化數據庫的時候會用到,好比MySQL,MSSQL
策略模式:針對一組算法,將每個算法封裝到具備共同接口的獨立的類中,例如進入我的主頁時,根據瀏覽者的不一樣,給予不一樣的顯示與操做
註冊模式:提供了在程序中有條理的存放並管理一組全局對象 (object),例如ZF框架中的Zend_Registry::set
適配器模式:將不一樣接口適配成統一的API接口,例如數據操做有mysql、mysqli、pdo等,可利用適配器模式統一接口
觀察者模式:一個對象經過添加一個方法使自己變得可觀察。當可觀察的對象更改時,它會將消息發送到已註冊的觀察者。例如實現實現消息推送
裝飾器模式:不修改原類代碼和繼承的狀況下動態擴展類的功能,例如框架的每一個Controller文件會提供before和after方法
迭代器模式:提供一個方法順序訪問一個聚合對象中各個元素,在PHP中將繼承Iterator類
原型模式:實現了一個原型接口,該接口用於建立當前對象的克隆。當直接建立對象的代價比較大時,則採用這種模式。例如,一個對象須要在一個高代價的數據庫操做以後被建立。
1.2四、請說說你對PHP中引用類型和值類型的理解
值類型:大部分變量類型,如字符串,整型,浮點,數組等都是的,賦值時會建立不一樣的變量
引用類型:對象,賦值時不會建立新的變量
PHP在內核中是經過zval這個結構體來存儲變量的
struct _zval_struct { zvalue_value value; /* 變量的值 */ zend_uint refcount__gc;/* 變量被引用的次數 */ zend_uchar type; /* 變量當前的數據類型 */ zend_uchar is_ref__gc;/* 是不是引用類型*/ };
參考《變量的類型》、《深刻理解PHP變量的值類型和引用類型》
1.2五、靜態變量有哪幾種
a. 靜態全局變量:PHP中的全局變量也能夠理解爲靜態全局變量,由於除非明確unset釋放,在程序運行過程當中始終存在。
b. 靜態局部變量:也就是在函數內定義的靜態變量,函數在執行時對變量的操做會保持到下一次函數被調用。
c. 靜態成員變量:這是在類中定義的靜態變量,和實例變量相對應,靜態成員變量能夠在全部實例中共享。
參考《靜態變量》
1.2六、PHP中變量的生命週期
局部變量:爲其所在函數被調用的整個過程。當局部變量所在的函數結構結束時,局部變量的生命週期也隨之結束。
全局變量:爲其所在「.php」腳本文件被調用的整個過程。當全局變量所在腳本文件結束調用時,全局變量的生命週期結束
有時某個定義函數結束後,咱們但願該函數內的變量仍然存在,就須要將這個變量聲明爲靜態變量(static)。
2.一、mysqli_real_connect()和mysqli_connect()有啥區別?
a. mysqli_real_connect() 要求一個由 mysqli_init() 建立的有效的對象
b. mysqli_real_connect() 能夠與 mysqli_options() 一同使用來設置鏈接的不一樣選項
c. mysqli_real_connect() 有一個flag參數
2.二、遍歷目錄及子目錄中的文件
這裏能夠用scandir(),或者glob()函數,這裏有篇文章介紹了《四種方法》,在線代碼中有兩種方法。
2.三、 給任意一段URL,取出該URL中包含的擴展名。如「http://www.pwstrick.com/test.php?somevar」,返回.php或php
使用了5種方法,pathinfo(),explode(),basename()、strpos()跟substr()的組合,
使用正則(能夠參考我之前的一篇文章《JavaScript與PHP中正則》)以及parse_url()。查看在線代碼。
2.四、PHP怎樣防止SQL注入?
使用預處理語句和參數化查詢。預處理語句和參數分別發送到數據庫服務器進行解析,參數將會被看成普通字符處理。
這種方式使得攻擊者沒法注入惡意的SQL。 你有兩種選擇來實現該方法:PDO和MySQLI,查看在線代碼。參考《PHP中該怎樣防止SQL注入》
2.五、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.六、寫出一些php魔術方法
PHP 將全部以 __(兩個下劃線)開頭的類方法保留爲魔術方法。因此在定義類方法時,建議不要以 __ 爲前綴,查看PHP手冊。
2.七、shell命令方式向PHP傳入參數的三種方式
使用$argc $argv;使用getopt函數();提示用戶輸入,而後獲取輸入的參數。參考《PHP傳入參數》
2.八、寫一個函數,算出兩個文件的相對路徑,如 $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.九、用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.十、error_reporting(2047)什麼做用
error_reporting,設置應該報告何種 PHP 錯誤,這裏是指顯示全部的錯誤 E_ALL
2.十一、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.十二、$a = 1; $x =&$a; $b=$a++; 求$b和$x的值
$b=1,$x=2
2.1三、php中對數組序列化和反序列化的函數,把utf-8轉換成gbk的函數
serialize,unserialize,iconv("utf-8","gbk",$strs)
2.1四、strlen()與mb_strlen的做用分別是什麼?
strlen()沒法正確處理中文字符串的佔位,對於gb2312獲得的是漢字個數的2倍,utf8獲得的是漢字個數的3倍
mb_strlen()就很好的解決了這個問題,它的第二個參數就是設置字符編碼的
2.1五、用PHP能建立多級目錄
mkdir($path, 0777, true);
2.1六、mysql_num_rows()和mysql_affected_rows()的做用和區別
二者都是返回結果集中的行數,不一樣的是前者只對select操做有效,後者對update,insert,delete所影響的行數有效
2.1七、請列舉、你能想到的全部的字符串查找算法,並加註釋簡單說明
順序查找,二分查找,分塊查找,哈希表查找
2.1八、根據下面的代碼寫出結果
$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.1九、寫個函數來解決多線程同時讀寫一個文件的問題
首先用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.2一、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.2二、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.2三、寫一段上傳文件的代碼
POST方法上傳,可使用戶上傳文本和二進制文件。用 PHP 的認證和文件操做函數,能夠徹底控制容許哪些人上傳以及文件上傳後怎樣處理。
經過$_FILES接收經過HTTP上傳到服務器的文件,上傳的內容存儲在$_FILES['xx']['tmp_name']中,而後再經過move_uploaded_file,將上傳的文件移動到新位置。
在看些封裝的上傳類的時候,看到個函數strrchr,查找指定字符在字符串中的最後一次出現,用這函數獲取後綴。
2.2四、寫出一個正則表達式,過慮網頁上的全部JS/VBS腳本(即把標記及其內容都去掉)
/<[^>].*?>.*?<\/>/si。查看正則在線工具,有現成正則說明。
2.2五、用PHP打印出前一天的時間格式是2006-5-10 22:21:21
echo date('Y-m-d H:i:s', strtotime('-1 day'));查看更多Date/Time函數。
2.2六、foo()和@foo()之間有什麼區別?
foo()會執行這個函數,任何解釋錯誤,語法錯誤,執行錯誤都會在頁面上顯示出來
@foo()在執行這個函數時,會隱藏上述的錯誤信息
2.2七、sort(),asort(),ksort(),arsort(),rsort()各有什麼區別
sort:對數組進行排序,當函數結束時數組單元將被從最低到最高從新安排
rsort:對數組進行逆向排序
asort:對數組進行排序並保持索引關係
arsort:對數組進行逆向排序並保持索引關係
ksort:對數組進行按照鍵名排序,保留鍵名到數據的關聯,主要用於關聯數組
2.2八、什麼是可變變量?如下程序的輸入值是什麼?
可變變量就是獲取一個普通變量的值做爲這個可變變量的變量名。輸出值爲「ok」。
$str = 'cd'; $$str = 'hotdog'; $$str = 'ok'; echo $cd;
2.2九、echo count("abc")將會輸出什麼?
count()函數計算數組中的單元數目或者對象中的屬性個數,一般是一個array()
對於對象,若是安裝了 SPL,能夠經過實現 Countable 接口來調用 count()。該接口只有一個方法count(),此方法返回count()函數的返回值。
若是參數不是數組型或者實現了countable接口的對象,將返回 1,只有一個例外,若是參數是NULL,則結果是 0。
2.30、GD庫有什麼做用?
GD庫提供了一系列用來處理圖片的API,使用GD庫能夠處理圖片,或者生成圖片。
在網站上GD庫一般用來生成縮略圖或者用來對圖片加水印或者對網站數據生成報表。
3.一、設一數據量爲千萬級的數據庫,經過監控發現,有90%的查詢請求都是指向同一部分數據的,而這部分數據只佔整個數據庫容量的1%。
a. 這種1%數據支撐了90%的查詢工做,建義獨立起來,這個方便數據在數據的buffer裏,提升查詢效率。
b. 分庫:性能快速提高,若是效率仍是上不去,能夠考慮在那1%的數據上作一些nosql緩存。
c. 分表:可以在數據庫缺乏集羣解決方案的狀況下得到必定的橫向擴展能力,同時負載也能分擔到多臺物理設備,從這個角度上講也能解決一些性能瓶頸。
d. 若是有條件的話,此應用也能夠經過緩存方案來解決,好比經過memcached,redis緩存1%結果集。
參考《ChinaUnix問答的討論》與《德問的討論》
3.二、MySQL如何分庫分表?
參考《MySQL分庫分表環境下全局ID生成方案》,《第一次操刀數據庫分表的教訓與經驗》,《mysql分庫分表的一些技巧》
3.三、MySQL數據庫存儲引擎有哪些?
MyISAM、InnoDB、HEAP、BOB、ARCHIVE、CSV等
3.四、 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表。
3.五、MySQL數據類型有哪些?
參考《SQL 數據類型》
3.六、MySQL數據庫做發佈系統的存儲,一天五萬條以上的增量,預計運維三年,怎麼優化?
a. 設計良好的數據庫結構,容許部分數據冗餘,儘可能避免join查詢,提升效率。
b. 選擇合適的表字段數據類型和存儲引擎,適當的添加索引。
c. mysql庫主從讀寫分離。
d. 找規律分表,減小單表中的數據量提升查詢速度。
e. 添加緩存機制,好比memcached,apc等。
f. 不常常改動的頁面,生成靜態頁面。
g. 書寫高效率的SQL
3.七、sql語句應該考慮哪些安全性?
主要是防止注入,作好 ' " / \ 等特殊字符的轉義,數據提交時注意html過濾,注意--,#這樣的註釋,注意子查詢和一些mysql函數sleep,load_file等等
3.八、MYSQL取得當前時間的函數是?格式化日期的函數?
now(); date_format();查看更多MySQL內置函數。
3.九、關係數據庫的瓶頸
Memcached+MySQL
隨着訪問量的上升,幾乎大部分使用MySQL架構的網站在數據庫上都開始出現了性能問題,程序員們開始大量的使用緩存技術來緩解數據庫的壓力,優化數據庫的結構和索引。Memcached做爲一個獨立的分佈式的緩存服務器,爲多個web服務器提供了一個共享的高性能緩存服務,在Memcached服務器上,又發展了根據hash算法來進行多臺Memcached緩存服務的擴展,而後又出現了一致性hash來解決增長或減小緩存服務器致使從新hash帶來的大量緩存失效的弊端。
MySQL主從讀寫分離
Memcached只能緩解數據庫的讀取壓力。讀寫集中在一個數據庫上讓數據庫不堪重負,大部分網站開始使用主從複製技術來達到讀寫分離,以提升讀寫性能和讀庫的可擴展性。
分表分庫
隨着web2.0的繼續高速發展,MySQL主庫的寫壓力開始出現瓶頸,而數據量的持續猛增,因爲MyISAM使用表鎖,在高併發下會出現嚴重的鎖問題,大量的高併發MySQL應用開始使用InnoDB引擎代替MyISAM。同時,開始流行使用分表分庫來緩解寫壓力和數據增加的擴展問題。
MySQL的擴展性瓶頸
大數據量高併發環境下的MySQL應用開發愈來愈複雜,也愈來愈具備技術挑戰性。分表分庫的規則把握都是須要經驗的。分庫分表的子庫到必定階段又面臨擴展問題。還有就是需求的變動,可能又須要一種新的分庫方式。MySQL數據庫也常常存儲一些大文本字段,致使數據庫表很是的大,在作數據庫恢復的時候就致使很是的慢,不容易快速恢復數據庫。大數據下IO壓力大,表結構更改困難,正是當前使用MySQL的開發人員面臨的問題。
3.十、什麼叫關係型數據庫?
關係型數據庫是支持採用了關係模型的數據庫,簡單來講,關係模型就是指二維表模型。
關係型數據庫以行和列的形式存儲數據,以便於用戶理解。這一系列的行和列被稱爲表,一組表組成了數據庫。
4.一、linux下查看當前系統負載信息的一些方法
4.二、vim的基本快捷鍵
4.三、請解釋下列10個shell命令的用途 top、ps、mv、find、df、cat、chmod、chgrp、grep、wc
top 查看系統進程佔用資源的狀況。ps 顯示詳細的進程信息。
mv是爲文件或目錄更名,或將文件從一個目錄中移植到另外一個目錄中。
find 查找文件或目錄。
df 檢查文件系統的磁盤空間佔用狀況。
cat 顯示文件內容,建立文件一個新的文件,合併文件內容。
chmod 改變文件或目錄的訪問權限。
chgrp 改變文件或目錄所屬的組。
grep是一個強大的文本搜索工具。
wc 統計指定文件的數據信息,例如行數,字節數
4.四、core文件是什麼,有什麼用?
core是unix系統的內核。當你的程序出現內存越界的時候,操做系統會停止你的進程,並將當前內存狀態倒出到core文件中,以便進一步分析。
程序員能夠經過core文件來找出問題所在。它記錄了程序掛掉時詳細的狀態描述。
5.一、寫出下列服務的用途和默認端口ftp、ssh、http、telnet、https
ftp文件傳輸協議是一種常見的文件拷貝方式,默認的是20用於數據鏈接,21用於控制鏈接端口。
ssh鏈接服務器執行操做,默認的是22端口號。
HTTP超文本傳輸協議,提供一種發佈和接收HTML頁面的方法,端口號爲80
Telnet協議是TCP/IP協議族中的一員,是Internet遠程登錄服務的標準協議和主要方式,默認端口爲23
HTTPS是以安全爲目標的HTTP通道,簡單講是HTTP的安全版,默認端口爲443
5.二、寫出你能想到的全部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.三、POST和GET有什麼區別?
a. GET是從服務器上獲取數據,POST是向服務器傳送數據
b. GET是經過發送HTTP協議經過URl參數傳遞進行接收,而POST是實體數據,經過表單提交
c. GET傳送的數據量較小,不能大於2KB。POST傳送的數據量較大,通常被默認爲不受限制。但理論上,IIS4中最大量爲80KB,IIS5中爲100KB
d. GET安全性很是低,POST安全性較高
5.四、請寫出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.一、Apache與Nginx的優缺點比較
nginx相對於apache的優勢:
輕量級,比apache 佔用更少的內存及資源。高度模塊化的設計,編寫模塊相對簡單
抗併發,nginx 處理請求是異步非阻塞,多個鏈接(萬級別)能夠對應一個進程,而apache 則是阻塞型的,是同步多進程模型,一個鏈接對應一個進程,在高併發下nginx 能保持低資源低消耗高性能
nginx處理靜態文件好,Nginx 靜態處理性能比 Apache 高 3倍以上
apache 相對於nginx 的優勢:
apache 的rewrite 比nginx 的rewrite 強大 ,模塊很是多,基本想到的均可以找到 ,比較穩定,少bug ,nginx 的bug 相對較多
緣由:
得益於Nginx使用了最新的epoll(Linux 2.6內核)和kqueue(freebsd)網絡I/O模型,而Apache則使用的是傳統的select模型。
目前Linux下可以承受高併發訪問的 Squid、Memcached都採用的是epoll網絡I/O模型。
處理大量的鏈接的讀寫,Apache所採用的select網絡I/O模型很是低效。
6.二、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服務器,最後本身接着等待下一個請求的到來,而不是退出。
6.三、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更強。
6.四、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一種生存期
參考資料:
http://www.cnblogs.com/Excellent/archive/2011/12/15/2288733.html PHP常見面試問題
http://www.cnblogs.com/xuechao/archive/2011/07/14/2106828.html 應聘新浪PHP開發筆試答題總結
http://www.cnblogs.com/bluespot/p/4223056.html 高級php面試題
http://www.jiancool.com/article/10391979797/;jsessionid=300759BA4B790D0C0640B2B37EE338BD 試卷2
http://www.cnblogs.com/jacko/p/4836731.html PHP面試出場率較高的題目
http://www.cnblogs.com/tuozi001/p/3328216.html 面試題目: PHP 有哪些優缺點?
http://www.cnblogs.com/echohao/p/4722398.html php常見的面試題目
http://www.cnblogs.com/coderchuanyu/p/3993820.html 整理的一些PHP面試題目
http://www.cnblogs.com/davidhhuan/archive/2010/04/21/1716960.html php面試題目
http://www.cnblogs.com/511mr/articles/2269517.html 經典php面試題目
http://www.cnblogs.com/ccw5510/archive/2010/06/03/1751051.html 騰訊PHP程序員面試題目
https://www.ibm.com/developerworks/cn/opensource/os-php-designptrns/ 五種常見的 PHP 設計模式
http://www.phpddt.com/php/registry-pattern.html PHP設計模式之註冊模式