PHP面試題(2021版)


如果你正在尋找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大神” 回復“面試題”即可獲取!

image.png

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM