如果你正在尋找PHP開發的工作,那么提前掌握最新的PHP面試題技巧,必然能使你在求職過程中事半功倍。博主還整理了最全面的PHP面試題,包括PHP基礎面試題、PHP高級面試題以及PHP常見面試題!
博主已將php相關面試題匯總整理成了一個PDF版的PHP面試寶典,關注微 信 公 眾 號 “PHP大神” 回復“面試題”即可獲取!
1、__FILE__表示什么意思?
文件的完整路徑和文件名。如果用在包含文件中,則返回包含文件名。自 PHP 4.0.2 起,__FILE__ 總是包含一個絕對路徑,而在此之前的版本有時會包含一個相對路徑。
2、如何獲取客戶端的IP地址?
$_SERVER[‘REMOTE_ADDR’]
3、寫出使用header函數跳轉頁面的語句
Header(‘location:index.php’);
4、$str是一段html文本,使用正則表達式去除其中的所有js腳本
$pattern = ‘/\.+<\/script>/’; Preg_replace($pattern,’’,$str);
5、寫出將一個數組里的空值去掉的語句
$arr = array(‘’,1,2,3,’’,19);
第一種方法:
$array1 = array(' ',1,'',2,3); print_r(array_filter($array1, "del")); function del($var) { return(trim($var)); }
第二種方法:
$arr=array("",1,2,3,""); $ptn="/\S+/i"; print_r(preg_grep($ptn,$arr));
6、寫出獲取當前時間戳的函數,及打印前一天的時間的方法(格式:年-月-日 時:分:秒)
Time(); Date(“Y-m-d H:i:s”,Strtotime(“-1 day”));
7、寫出php進行編碼轉換的函數
Iconv(‘utf-8’,’gb2312’,$str);
8、$str = “1,3,5,7,9,10,20”,使用什么函數可以把字符串str轉化為包含各個數字的數組?
$arr = explode(“,”,$str);
9、serialize() /unserialize()函數的作用
serialize()和unserialize()在php手冊上的解釋是:
serialize — 產生一個可存儲的值的表示,返回值為字符串,此字符串包含了表示 value 的字節流,不丟失其類型和結構,可以存儲於任何地方。
unserialize — 從已存儲的表示中創建 PHP 的值
具體用法:
$arr = array(“測試1″,”測試2″,”測試3″);//數組 $sarr = serialize($arr);//產生一個可存儲的值(用於存儲)
//用任意方法(例如:你要是吧$sarr存在一個文本文件中你就可以用file_get_contents取得)得到存儲的值保存在$newarr中;
$unsarr=unserialize($newarr);//從已存儲的表示中創建 PHP 的值
10、寫出一個函數,參數為年份和月份,輸出結果為指定月的天數
Function day_count($year,$month){ Echo date(“t”,strtotime($year.”-”.$month.”-1”)); }
11、一個文件的路徑為/wwwroot/include/page.class.php,寫出獲得該文件擴展名的方法
$arr = pathinfo(“/wwwroot/include/page.class.php”); $str = substr($arr[‘basename’],strrpos($arr[‘basename’],’.’));
12、你使用過哪種PHP的模板引擎?
Smarty,thinkphp自帶的模板引擎
13、請簡單寫一個類,實例化這個類,並寫出調用該類的屬性和方法的語句
Class myclass{ Public $aaa; Public $bbb; Public function myfun(){ Echo “this is my function”; } } $myclass = new myclass(); $myclass->$aaa; $myclass->myfun();
14、本地mysql數據庫db_test里已建有表friend,數據庫的連接用戶為root,密碼為123。friend表字段為:id,name,age,gender,phone,email,請使用php連接mysql,選擇出friend表里age > 20的所有記錄打印結果,並統計出查詢出的結果總數。
$link = Mysql_connect(“localhost”,”root”,”123”) or die(“數據庫連接失敗!”); Mysql_select_db(“db_test”,$link) or die(“選擇數據庫失敗!”); $sql = “select id,name,age,gender,phone,email from friend where age>20”; $result = mysql_query($sql); $count = mysql_num_rows($result); While($row = mysql_fetch_assoc($result)){ Echo $row[‘id’]; …. }
15、以下有兩個表
user表 字段id (int),name (varchar)
score表 字段uid (int),subject (varchar) ,score (int)
score表的uid字段與user表的id字段關聯
要求寫出以下的sql語句
1)在user表里新插入一條記錄,在score表里插入與新加入的記錄關聯的兩條記錄
2)獲取score表里uid為2的用戶score最高的5條記錄
3)使用聯合查詢獲取name為“張三”的用戶的總分數
4)刪除name為“李四”的用戶,包括分數記錄
5)清空score表
6)刪除user表
1). mysql_query(“insert into user(name) values(‘test’)”); $id = mysql_insert_id(); Mysql_query(“insert into score(uid,subjext,score) values(“.$id.”,’english’,’99’)”); 2).$sql = select uid,sunjext,score from score where uid=2 order by score desc limit 0,5; 3).select s.score from score s RIGHT JOIN user u ON u.id=s.uid where u.name=’張三; 4).delete from score where uid in(select id from user where name=’李四’); Delete from user where name=’李四’; 5).delete from score; 6).drop table user;
16. 什么是面向對象?主要特征是什么?
面向對象是程序的一種設計方式,它利於提高程序的重用性,使程序結構更加清晰。主要特征:封裝、繼承、多態。
17. SESSION 與 COOKIE的區別是什么,請從協議,產生的原因與作用說明?
1、http無狀態協議,不能區分用戶是否是從同一個網站上來的,同一個用戶請求不同的頁面不能看做是同一個用戶。
2、SESSION存儲在服務器端,COOKIE保存在客戶端。Session比較安全,cookie用某些手段可以修改,不安全。Session依賴於cookie進行傳遞。
禁用cookie后,session不能正常使用。Session的缺點:保存在服務器端,每次讀取都從服務器進行讀取,對服務器有資源消耗。Session保存在服務器端的文件或數據庫中,默認保存在文件中,文件路徑由php配置文件的session.save_path指定。Session文件是公有的。
18. HTTP 狀態中302、403、 500代碼含義?
一二三四五原則: 一. 消息系列 二 成功系列 三. 重定向系列 四. 請求錯誤系列 五. 服務器端錯誤系列
302:臨時轉移成功,請求的內容已轉移到新位置 403:禁止訪問 500:服務器內部錯誤 401代表未授權。
19. Linux 下建立壓縮包,解壓縮包的命令
Tar.gz:
打包: tar czf file.tar.gz file.txt
解壓: tar xzf file.tar.gz
Bz2:
打包: bzip2 [-k] 文件
解壓: bunzip2 [-k] 文件
Gzip(只對文件,不保留原文件)
打包: gzip file1.txt
解壓: gunzip file1.txt.gz
Zip: -r 對目錄
打包: zip file1.zip file1.txt
解壓: unzip file1.zip
20. 請寫出數據類型(int char varchar datetime text)的意思;請問 varchar 和 char有什么區別?
Int 整數 char 定長字符 Varchar 變長字符 Datetime 日期時間型 Text 文本型 Varchar 與char的區別 char是固定長度的字符類型,分配多少空間,就占用多長空間。 Varchar是可變長度的字符類型,內容有多大就占用多大的空間,能有效節省空間。 由於varchar類型是可變的,所以在數據長度改變的時,服務器要進行額外的操作,所以效率比char類型低。
21. MyISAM 和 InnoDB 的基本區別?索引結構如何實現?
MyISAM類型不支持事務,表鎖,易產生碎片,要經常優化,讀寫速度較快,而InnoDB類型支持事務,行鎖,有崩潰恢復能力。讀寫速度比MyISAM慢。
創建索引:alert table tablename add index (`字段名`)
22. 不使用cookie向客戶端發送一個cookie.
理解:session_start()開啟時,生成一個常量 SID,當COOKIE開啟時,這個常量為空,當COOKIE關閉時,這個常量中存儲了PHPSESSID的值。通過在URL后加一個SID參數來傳遞SESSIONID的值,從而使客戶端頁面可以使用SESSION里面的值。 當客戶端開啟COOKIE和服務器端開啟SESSION時。 瀏覽器第一次請求,服務器會向瀏覽器端發送一個COOKIE里面存儲SESSIONID. 當瀏覽器第二次請求時,會把已存在
23. isset() 和 empty() 區別
Isset判斷變量是否存在,可以傳入多個變量,若其中一個變量不存在則返回假,empty判斷變量是否為空為假,只可傳一個變量,如果為空為假則返回真。
24. 寫出匹配URL的正則表達式.
‘/^(https?|ftps?):\/\/(www)\.([^\.\/]+)\.(com|cn|org)(\/[\w-\.\/\?\%\&\=]*)?/i’
25.請寫出常見的排序算法,並用PHP實現冒泡排序,將數組$a = array()按照從小到大的方式進行排序。
常見的排序算法: 冒泡排序法、快速排序法、簡單選擇排序法、堆排序法、直接插入排序法、希爾排序法、合並排序法。
冒泡排序法的基本思想是:對待排序記錄關鍵字從后往前(逆序)進行多遍掃描,當發現相鄰兩個關鍵字的次序與排序要求的規則不符時,就將這兩個記錄進行交換。這樣,關鍵字較小的記錄將逐漸從后面向前面移動,就象氣泡在水中向上浮一樣,所以該算法也稱為氣泡排序法。
// 冒泡排序法 Function mysort($arr){ For($i=0; $i For($j=0; $j If($arr[$j] > $arr[$j+1]){ $tmp=$arr[$j]; $arr[$j]=$arr[$j+1]; $arr[$j+1]=$tmp; } } } Return $arr; } $arr=array(3,2,1); print_r(mysort($arr));
26.請說明 PHP 中傳值與傳引用的區別。什么時候傳值什么時候傳引用?
按值傳遞:函數范圍內對值的任何改變在函數外部都會被忽略
按引用傳遞:函數范圍內對值的任何改變在函數外部也能反映出這些修改
優缺點:按值傳遞時,php必須復制值。特別是對於大型的字符串和對象來說,這將會是一個代價很大的操作。按引用傳遞則不需要復制值,對於性能提高很有好處。
27.請用正則表達式(Regular Expression)寫一個函數驗證電子郵件的格式是否正確。
if(isset($_POST['action']) && $_POST['action']==’submitted’){ $email=$_POST['email']; if(!preg_match(“/^[0-9a-zA-Z-]+@[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+){1,3}$/”,$email)){ echo “電子郵件檢測失敗”; }else{ echo “電子郵件檢測成功”; } }
28.使用PHP描述快速排序算法,對象可以是一個數組嗎?
原理:快速排序使用分治策略來把待排序數據序列分為兩個子序列,具體步驟為:
(1)從數列中挑出一個元素,稱該元素為“基准”。
(2)掃描一遍數列,將所有比“基准”小的元素排在基准前面,所有比“基准”大的元素排在基准后面。
(3)通過遞歸,將各子序列划分為更小的序列,直到把小於基准值元素的子數列和大於基准值元素的子數列排序。
//快速排序(數組排序) function QuickSort($arr){ $num = count($arr); $l=$r=0; for($i=1;$i<$num;$i++){ if($arr[$i] < $arr[0]){ $left[] = $arr[$i]; $l++; }else{ $right[] = $arr[$i]; $r++; } } if($l > 1){ $left = QuickSort($left); } $new_arr = $left; $new_arr[] = $arr[0]; if($r > 1){ $right = QuickSort($right); } for($i=0;$i<$r;$i++){ $new_arr[] = $right[$i]; } return $new_arr; }
使用PHP描述順序查找和二分查找(也叫做折半查找)算法,順序查找必須考慮效率,對象可以是一個有序數組
//二分查找(數組里查找某個元素) function bin_sch($array, $low, $high, $k){ if ($low <= $high){ $mid = intval(($low+$high)/2); if ($array[$mid] == $k){ return $mid; }elseif ($k < $array[$mid]){ return bin_sch($array, $low, $mid-1, $k); }else{ return bin_sch($array, $mid+1, $high, $k); } } return -1; } //順序查找(數組里查找某個元素) function seq_sch($array, $n, $k){ $array[$n] = $k; for($i=0; $i<$n; $i++){ if($array[$i]==$k){ break; } } if ($i<$n){ return $i; }else{ return -1; } }
29.寫一個二維數組排序算法函數,能夠具有通用性,可以調用php內置函數(array_multisort())
//二維數組排序, $arr是數據,$keys是排序的健值,$order是排序規則,1是升序,0是降序 function array_sort($arr, $keys, $order=0) { if (!is_array($arr)) { return false; } $keysvalue = array(); foreach($arr as $key => $val) { $keysvalue[$key] = $val[$keys]; } if($order == 0){ asort($keysvalue); }else { arsort($keysvalue); } reset($keysvalue); foreach($keysvalue as $key => $vals) { $keysort[$key] = $key; } $new_array = array(); foreach($keysort as $key => $val) { $new_array[$key] = $arr[$val]; } return $new_array; }
30.windows平台, Apache Http Server啟動失敗, 排錯思路是什么?
檢查apache使用的80端口是否被占用,如果被占用,先停止占用80端口的服務,然后啟動apache服務器
31.PHP session擴展默認將session數據儲存在哪里? D
A) SQLite Database B) MySQL Database C) Shared Memory D) File System E) Session Server
32.如果你想要自動加載類,下面哪種函數聲明是正確的 C
A) function autoload($class_name) B) function __autoload($class_name, $file) C) function __autoload($class_name) D) function _autoload($class_name) E) function autoload($class_name, $file)
33.PHP程序使用utf-8編碼, 以下程序輸出結果是什么? B
$str = ’hello你好世界’; echo strlen($str); ?>
A) 9 B) 13(gbk) C) 18 D) 17(utf8)
34.你所知道的php數組相關的函數?
array()----創建數組 array_combine()----通過合並兩個數組來創建一個新數組 range()----創建並返回一個包含指定范圍的元素的數組 compact()----建立一個數組 array_chunk()----將一個數組分割成多個 array_merge()----把兩個或多個數組合並成一個數組 array_slice()----在數組中根據條件取出一段值 array_diff()----返回兩個數組的差集數組 array_intersect()----計算數組的交集 array_search()----在數組中搜索給定的值 array_splice()----移除數組的一部分且替代它 array_key_exists()----判斷某個數組中是否存在指定的key shuffle()----把數組中的元素按隨機順序重新排列 array_flip()----交換數組中的鍵和值 array_reverse()----將原數組中的元素順序翻轉,創建新的數組並返回 array_unique()----移除數組中重復的值
35.php讀取文件內容的幾種方法和函數?
打開文件,然后讀取。Fopen() fread()
打開讀取一次完成 file_get_contents()
36.說說你對緩存技術的了解?
緩存技術是將動態內容緩存到文件中,在一定時間內訪問動態頁面直接調用緩存文件,而不必重新訪問數據庫。
使用memcache可以做緩存。
37.你所知道的設計模式有哪些?
工廠模式、策略模式、單元素模式、觀察者模式、命令鏈模式
38.說說你對代碼管理的了解? 常使用那些代碼版本控制軟件?
通常一個項目是由一個團隊去開發,每個人將自己寫好的代碼提交到版本服務器,由項目負責人按照版本進行管理,方便版本的控制,提高開發效率,保證需要時可以回到舊版本。
常用的版本控制器:SVN
39.說說你對SVN的了解?簡述優缺點?
SVN是一種版本控制器,程序員開發的代碼遞交到版本服務器進行集中管理。
SVN的優點:代碼進行集中管理,版本控制容易,操作比較簡單,權限控制方便。
缺點:不能隨意修改服務器項目文件夾。
40.你常用到的mysql命令?
Show databases Show tables Insert into 表名() values() Update 表名 set 字段=值 where ... Delete from 表名 where ... Select * from 表名 where 條件 order by ... Desc/asc limit ... Group by ... Having ...
41. 簡述Cookie的設置及獲取過程
設置COOKIE的值:
Setcookie(名稱,值,保存時間,有效域);
獲取值:$_COOKIE['名稱'];
42.對於大流量的網站,你采用什么樣的方法來解決訪問量問題?
優化程序,優化數據庫,如果程序和數據庫已經最優化,使用以下解決方法:
1)確定當前服務器設備是否滿足流量需求。
2)使用Memcache緩存技術,把動態內容緩存到文件中,動態網頁直接調用這些文件,而不必再訪問數據庫。
3)禁止外部盜鏈,圖片和文件外部盜鏈會給服務器帶來大量的負載壓力,可以通過refer來禁止外部盜鏈,或者使用apache來配置禁止盜鏈。
4)控制大文件的下載,大文件的下載對於非SCSI硬盤來說會占用大量的資源,導致服務器的響應能力下降。
5)使用不同的主機分流主要流量,使服務器均衡負載。
6)使用流量統計軟件統計分析網站流量,可以知道哪些地方耗費了大量的流量,哪些頁面需要再進行優化。
43.mysql_fetch_row() 和mysql_fetch_array之間有什么區別?
Mysql_fetch_row()是從結果集中取出一行作為枚舉數組,mysql_fetch_array()是從結果集中取出一行作為索引數組或關聯數組或兩種方式都有。
44.用PHP寫出顯示客戶端IP與服務器IP的代碼
獲取客戶端IP:$_SERVER(“REMOTE_ADDR”);
獲取服務器端IP:$_SERVER["SERVER_ADDR"];
45.寫一個函數,能夠遍歷一個文件夾下的所有文件和子文件夾。
function my_scandir($dir){ $files = array(); if ( $handle = opendir($dir) ){ while ( ($file = readdir($handle)) !== false ) { if ( $file != ".." && $file != "." ) { if ( is_dir($dir . "/" . $file) ) { $files[$file] = scandir($dir . "/" . $file); }else { $files[] = $file; } } } closedir($handle); return $files; } }
46.數據庫索引有幾類,分別是什么?什么時候該用索引?
普通索引、主鍵索引、唯一索引
並非所有的數據庫都以相同的方式使用索引,作為通用規則,只有當經常查詢列中的數據時才需要在表上創建索引。
47.$_REQUEST、$_POST、$_GET、$_COOKIE、$_SESSION、$_FILES的意思是什么?
它們都是PHP預定義變量 $_REQUEST用來獲取post或get方式提交的值 $_POST用來獲取post方式提交的值 $_GET用來獲取get方式提交的值 $_COOKIE用來獲取cookie存儲的值 $_SESSION用來獲取session存儲的值 $_FILES用來獲取上傳文件表單的值
48.框架中什么是單一入口和多入口,單一入口的優缺點?
1)多入口就是通過訪問不同的文件來完成用戶請求。
單一入口指web程序所有的請求都指向一個腳本文件的。
2)單一入口更容易控制權限,方便對http請求可以進行安全性檢查。
缺點:URL看起來不那么美觀,特別是對搜索引擎來說不友好。
49.如何快速下載一個遠程http服務器上的圖片文件到本地?
$file=”"; $fp=fopen($file,’rb’); $img=fread($fp,10000); $dir=”./”; $local=fopen($dir.’/’.basename($file),’w'); Fwrite($local,$img);
50.了解XSS攻擊嗎? 如何防止 ?
XSS是跨站腳本攻擊,首先是利用跨站腳本漏洞以一個特權模式去執行攻擊者構造的腳本,然后利用不安全的Activex控件執行惡意的行為。
使用htmlspecialchars()函數對提交的內容進行過濾,使字符串里面的特殊符號實體化。
51.SQL注入漏洞產生的原因 ? 如何防止?
SQL注入產生的原因:程序開發過程中不注意規范書寫sql語句和對特殊字符進行過濾,導致客戶端可以通過全局變量POST和GET提交一些sql語句正常執行。
防止SQL注入:
1)開啟配置文件中的magic_quotes_gpc和magic_quotes_runtime設置
2)執行sql語句時使用addslashes進行sql語句轉換
3)Sql語句書寫盡量不要省略小引號和單引號
4)過濾掉sql語句中的一些關鍵字:update、insert、delete、select、*
5)提高數據庫表和字段的命名技巧,對一些重要的字段根據程序的特點命名,取不易被猜到的。
6)Php配置文件中設置register_globals為off,關閉全局變量注冊
7)控制錯誤信息,不要再瀏覽器上輸出錯誤信息,將錯誤信息寫到日志文件中。
52.在PHP中error_reporting這個函數有什么作用?
error_reporting() 設置 PHP 的報錯級別並返回當前級別。
53.smarty是什么,有什么作用?
回答一:smarty是用php寫出來的模板引擎,也是目前業界最著名的php模板引擎之一
它分離了邏輯代碼和外在的顯示,提供了一種易於管理和使用的方法,用來將混雜的php邏輯代碼與html代碼進行分離
回答二:smarty是php中最著名的引擎框架之一,我們公司使用的是TP框架,已經封裝好了smarty模板,所以沒有單獨使用過
回答三: smarty是個模板引擎,最顯著的地方就是有可以把模板緩存起來。一般模板來說,都是做一個靜態頁面,然后在里面把一些動態的部分用一切分隔符切開,然后在PHP里打開這個模板文件,把分隔符里面的值替換掉,然后輸出來,你可以看下PHPLib里面的template部分。
而smarty設定了緩存參數以后,第一次運行時候會把模板打開,在php替換里面值的時候把讀取的html和php部分重新生成一個臨時的php文件,這樣就省去了每次打開都重新讀取html了。如果修改了模板,只要重新刷下就行了。
54.TP的特性有哪些?
1).多表查詢非常方便,在model中幾句代碼就可以完成對多表的關聯操作
2).融合了smarty模板,使前后台分離
3).支持多種緩存技術,尤其對memcache技術支持非常好
4).命名規范,模型,視圖,控制器嚴格遵循命名規則,通過命名一一對應
5).支持多種url模式
6).內置ajax返回方法,包括xml,json,html等
7).支持應用擴展,類庫擴展,驅動擴展等
55.TP框架中的大字母函數?
U:對url的組裝
A:內部實例化控制器
S:緩存處理
R:調用某個控制器的操作方法
D:實例化自定義模型類
M:實例化基礎模型類
I:獲取參數
L:設置或者獲取當前語言
C:設置或獲取,保存配置
56.laravel有那些特點?
回答一:
1).強大的rest router:用簡單的回調函數就可以調用,快速綁定controller和router
2).artisan:命令行工具,很多手動的工作都自動化
3).可繼承的模板,簡化view的開發和管理
4).blade模板:渲染速度更快
5).ORM操作數據庫
6).migration:管理數據庫和版本控制
7).測試功能也很強大
8).composer也是亮點
回答二: laravel框架引入了門面,依賴注入,Ioc模式,以及各種各樣的設計模式等
57.如何解決異常處理?
答: 拋出異常:使用try…catch,異常的代碼放在try代碼塊內,如果沒有觸發異常,則代碼繼續執行,如果異常被觸發,就會 拋出一個異常。Catch代碼塊捕獲異常,並創建一個包含異常信息的對象。$e->getMessage(),輸出異常的錯誤信息。
解決異常:使用set_error_handler函數獲取異常(也可以使用try()和catch()函數),然后使用set_exception_handler()函數設置默認的異常處理程序,register_shutdown_function()函數來執行,執行機制是,php要把調入的函數調入到內存,當頁面所有的php語句都執行完成時,再調用此函數
58.redis消息隊列先進先出需要注意什么?
答:通常使用一個list來實現隊列操作,這樣有一個小限制,所以的任務統一都是先進先出,如果想優先處理某個任務就不太好處理了,這就需要讓隊列有優先級的概念,我們就可以優先處理高級別的任務,實現方式有以下幾種方式:
1)單一列表實現:隊列正常的操作是 左進右出(lpush,rpop)為了先處理高優先級任務,在遇到高級別任務時,可以直接插隊,直接放入隊列頭部(rpush),這樣,從隊列頭部(右側)獲取任務時,取到的就是高優先級的任務(rpop)
2)使用兩個隊列,一個普通隊列,一個高級隊列,針對任務的級別放入不同的隊列,獲取任務時也很簡單,redis的BRPOP命令可以按順序從多個隊列中取值,BRPOP會按照給出的 key 順序查看,並在找到的第一個非空 list 的尾部彈出一個元素,redis> BRPOP list1 list2 0
list1 做為高優先級任務隊列
list2 做為普通任務隊列
這樣就實現了先處理高優先級任務,當沒有高優先級任務時,就去獲取普通任務
方式1最簡單,但實際應用比較局限,方式3可以實現復雜優先級,但實現比較復雜,不利於維護
方式2是推薦用法,實際應用最為合適
59.數組內置的排序方法有哪些?
sort($array); //數組升序排序
rsort($array); //數組降序排序
asort($array); //根據值,以升序對關聯數組進行排序
ksort($array); //根據建,以升序對關聯數組進行排序
arsort($array); //根據值,以降序對關聯數組進行排序
krsort($array); // 根據鍵,以降序對關聯數組進行排序
60.redis 和 memache 緩存的區別
總結一:
1).數據類型
Redis數據類型豐富,支持set list等類型
memcache支持簡單數據類型,需要客戶端自己處理復雜對象
2).持久性
redis支持數據落地持久化存儲
memcache不支持數據持久存儲
3).分布式存儲
redis支持master-slave復制模式
memcache可以使用一致性hash做分布式
value大小不同
memcache是一個內存緩存,key的長度小於250字符,單個item存儲要小於1M,不適合虛擬機使用
4).數據一致性不同
redis使用的是單線程模型,保證了數據按順序提交。
memcache需要使用cas保證數據一致性。CAS(Check and Set)是一個確保並發一致性的機制,屬於“樂觀鎖”范疇;原理很簡單:拿版本號,操作,對比版本號,如果一致就操作,不一致就放棄任何操作
5).cpu利用
redis單線程模型只能使用一個cpu,可以開啟多個redis進程
總結二:
1).Redis中,並不是所有的數據都一直存儲在內存中的,這是和Memcached相比一個最大的區別。
2).Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,hash等數據結構的存儲。
3).Redis支持數據的備份,即master-slave模式的數據備份。
4).Redis支持數據的持久化,可以將內存中的數據保持在磁盤中,重啟的時候可以再次加載進行使用。
我個人認為最本質的不同是Redis在很多方面具備數據庫的特征,或者說就是一個數據庫系統,而Memcached只是簡單的K/V緩存
總結三:
redis和memecache的不同在於:
1)、存儲方式:
memecache 把數據全部存在內存之中,斷電后會掛掉,數據不能超過內存大小
redis有部份存在硬盤上,這樣能保證數據的持久性。
2)、數據支持類型:
redis在數據支持上要比memecache多的多。
3)、使用底層模型不同:
新版本的redis直接自己構建了VM 機制 ,因為一般的系統調用系統函數的話,會浪費一定的時間去移動和請求。
4)、運行環境不同:
redis目前官方只支持Linux 上去行,從而省去了對於其它系統的支持,這樣的話可以更好的把精力用於本系統 環境上的優化,雖然后來微軟有一個小組為其寫了補丁。但是沒有放到主干上
memcache只能當做緩存,cache
redis的內容是可以落地的,就是說跟MongoDB有些類似,然后redis也可以作為緩存,並且可以設置master-slave
未完待續~~~~~~
題型還有很多,希望大家在學習過程中,慢慢的去發現和慢慢的提升自己的學習技能,最后祝大家學習愉快,找到最適合自己的工作!
博主已將php相關面試題匯總整理成了一個PDF版的PHP面試寶典,關注微 信 公 眾 號 “PHP大神” 回復“面試題”即可獲取!