PHP 面試踩過的坑

1.get,post 的區別

**顯示有區別 **
get方法是將字符串拼接在地址欄後面能夠看見 
而post方法看不見

**傳遞的大小有區別 **
具體大小和瀏覽器有關係,ie瀏覽器是2k其餘瀏覽器的最大值可能不一樣,可是也比較小。 
而post方法傳遞參數的大小是能夠設定的,原來是認爲無限大。在Php當中在php.ini文件是能夠設置參數的大小的。

**安全性 **
get方法安全性比較低由於暴露在外面而post方法安全性比較高

**提交的原理 **
get方法提交的數據都是獨立的。 
而Post方法將全部的提交的數據變成一個總體(將提交的數據變成xml格式)

**靈活性**
get方法很靈活, 
post方法不靈活,必需要有表單的參與才能用post提交很不方便

 

  
 

2.require,include 區別

require是無條件包含也就是若是一個流程里加入require,不管條件成立與否都會先執行require
 include有返回值,而require沒有(可能由於如此require的速度比include快)
 包含文件不存在或者語法錯誤的時候require是致命的錯誤終止執行,include不是

 

 

3. 獲取 URL 後綴名

 1 pathinfo()解析文件路徑,返回其組成部分;
 2 返回關聯數組
 3 dirname    文件路徑
 4 basename   文件名+擴展名
 5 extension   最後一個擴展名
 6 filename   文件名
 7 eg: print_r( pathinfo('/ab/cd/e.php') );
 8 Array(
 9   [dirname] => /ab/cd
10   [basename] => e.php
11   [extension] => php
12   [filename] => e
13 )
14 擴展:
15 打印解析路徑    var_dump( pathinfo($path) );
16 打印路徑的父級路徑    var_dump( pathinfo($path, PATHINFO_DIRNAME) );
17 打印路徑的尾名    var_dump( pathinfo($path, PATHINFO_BASENAME) );
18 打印路徑的最後的擴展名   var_dump( pathinfo($path, PATHINFO_EXTENSION) );
19 打印路徑的文件的名字   var_dump( pathinfo($path, PATHINFO_FILENAME) );

 

 
 

4.tcp,udp,http 區別

 
 

5. 獲取上級目錄的方法

echo __FILE__ ; // 獲取當前所在文件的絕對路徑及地址,結果:D:\aaa\my.php 
echo dirname(__FILE__); // 取得當前文件所在的絕對目錄,結果:D:\aaa\ 
echo dirname(dirname(__FILE__)); //取得當前文件的上一層目錄名,結果:D:\ 
 

6. 數據庫主從複製,讀寫分離

* 什麼是主從複製
主從複製,是用來創建一個和主數據庫徹底同樣的數據庫環境,稱爲從數據庫;

* 主從複製的原理:
1.數據庫有個bin-log二進制文件,記錄了全部的sql語句。
2.只須要把主數據庫的bin-log文件中的sql語句複製。
3.讓其從數據的relay-log重作日誌文件中在執行一次這些sql語句便可。

* 主從複製的做用
1.作數據的熱備份,做爲後備數據庫,主數據庫服務器故障後,可切換到從數據庫繼續工做,避免數據丟失。
2.架構的擴展。業務量愈來愈大,I/O訪問頻率太高,單機沒法知足,此時作多庫的存儲,下降磁盤I/O訪問頻率,提升單機的I/O性能
3.主從複製是讀寫分離的基礎,使數據庫能製成更大 的併發。例如子報表中,因爲部署報表的sql語句十分慢,致使鎖表,影響前臺的服務。若是前臺服務使用master,報表使用slave,那麼報表sql將不會形成前臺所,保證了前臺的訪問速度。

* 主從複製的幾種方式:
1.同步複製:所謂的同步複製,意思是master的變化,必須等待slave-1,slave-2,...,slave-n完成後才能返回。
2.異步複製:如同AJAX請求同樣。master只須要完成本身的數據庫操做便可。至於slaves是否收到二進制日誌,是否完成操做,不用關心。MYSQL的默認設置。
3.半同步複製:master只保證slaves中的一個操做成功,就返回,其餘slave無論。
這個功能,是由google爲MYSQL引入的。

* 關於讀寫分離
在完成主從複製時,因爲slave是須要同步master的。因此對於insert/delete/update這些更新數據庫的操做,應該在master中完成。而select的查詢操做,則落下到slave中。

 

 

7. 數據庫索引

**什麼是索引**
索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息。(摘自百度百科)

**索引類型**
1.FULLTEXT 全文索引
    全文索引,僅MyISAM引擎支持。其能夠在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不過目前只有 CHAR、VARCHAR ,TEXT 列上能夠建立全文索引。
2.HASH 哈希索引
    HASH索引的惟一性及相似鍵值對的形式十分適合做爲索引,HASH索引能夠一次定位,不須要像樹形索引那樣逐層參照,所以具備極高的效率。可是這種高效是有條件的。即只在「=」和「in」條件下高效,對於範圍查詢,排序及組合索引仍然效率不高。
3.BTREE 樹形索引
    BTREE因此是一種將索引按必定算法,存入一個樹形的數據結構中(二叉樹),每次查詢都是從樹的入口root開始,一次遍歷node,獲取leaf。這是MySQL中默認也是最經常使用的索引類型。
4.RTREE
    RTREE在MySQL中不多使用,僅支持geometry數據類型,支持該存儲引擎只有MyISAM、BDb、InnoDb、NDb、Archive幾種。相對於BTREE,RTREE的優點在於範圍查找。

**索引種類**
普通索引:僅加速查詢
惟一索引:加速查詢+列值惟一(能夠有null)
主鍵索引:加速查詢+列值惟一(不能夠有null)+表中只有一個
組合索引:多列值組成一個索引,專門用於組合搜索,其效率大於索引合併
全文索引:對文本內容進行分詞,進行搜索
外鍵索引:與主鍵索引造成聯繫,保證數據的完整性。

**索引使用的注意事項**
1.符合索引遵循前綴原則
2.like查詢%不能再前,不然索引失效。若有須要,使用全文索引
3.column is null可使用索引
4.若是MySQL估計使用索引比全表掃描慢,則放棄使用索引
5.若是or前的條件中列有索引,後面的沒有,索引不會生效。
6.列類型是字符串,查詢時,必定要給值加引號,不然索引失效。
7.肯定order by 和 group by 中只有一個表的列,這樣才能使用索引

 

 

8. 高併發的解決方案

web服務器優化 :負載均衡 
流量優化:防盜鏈處理 將惡意請求屏蔽,
前端優化:減小http請求、添加異步請求、啓用瀏覽器緩存和文件壓縮、cdn加速、創建獨立的圖片服務器、
服務端優化:  頁面靜態化、併發處理、隊列處理、
數據庫優化: 數據庫緩存、分庫分表、分區操做 、讀寫分離、負載均衡

 

 

9.MVC 的理解

一、Model(業務模型):應用程序中用於處理應用程序數據邏輯的部分,一般模型對象負責在數據庫中存取數據。           二、view(視圖):應用程序中處理數據顯示的部分。一般視圖是依據模型數據建立的。 三、controller(控制器):應用程序中處理用戶交互的部分。一般控制器負責從視圖讀取數據,控制用戶輸入,並向模型發送數據。
 

10. 經常使用的文件操做函數

 1 **1. 得到文件名:**
 2 basename — 返回路徑中的文件名部分
 3 
 4 $path = "/home/cate/index/index2.php";\
 5 $file = basename($path);\
 6 echo $file; //結果index2.php
 7 
 8 **2. 得到目錄名**
 9 dirname — 返回路徑中的目錄部分
10 
11 $path = "/home/cate/index/index2.php";\
12 $file = dirname($path);\
13 echo $file;//結果/home/cate/index
14 
15 **3.獲得路徑關聯數組**
16 pathinfo() 函數以數組的形式返回關於文件路徑的信息。
17 返回的數組元素以下:
18 -   [dirname]: 目錄路徑
19 -   [basename]: 文件名
20 -   [extension]: 文件後綴名
21 -   [filename]: 不包含後綴的文件名
22 pathinfo(path,options)
23 | path | 必需。規定要檢查的路徑。 |
24 | options | 可選。規定要返回的數組元素。默認是 all。
25 
26 可能的值:
27 
28 -   PATHINFO_DIRNAME - 只返回 dirname
29 -   PATHINFO_BASENAME - 只返回 basename
30 -   PATHINFO_EXTENSION - 只返回 extension
31 -   PATHINFO_FILENAME - 只返回 filename
32 
33  |
34  **4.filesize取得文件大小**
35 filesize ( string $filename )
36 返回文件大小的字節數,若是出錯返回  **FALSE** 並生成一條  **E_WARNING** 級的錯誤。
37 
38  **判斷目錄是否存在**
39  $lujing = "./nihao/wohao";
40  if(!is_dir($liujing)){ 
41      mkdir(iconv("UTF-8", "GBK", $lujing),0777,true);
42  }
43 
44  **判斷文件是否存在**
45  file_exists(path);

 

  
 

11. 常見的排序算法

 1 1. 冒泡排序   2 思路分析:在要排序的一組數中,對當前還未排好的序列,從前日後對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即,每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。
  3 
 4 代碼實現:   5 $arr=array(1,43,54,62,21,66,32,78,36,76,39);  
  6 function bubbleSort($arr)
  7 {  
  8   $len=count($arr);
  9   //該層循環控制 須要冒泡的輪數
 10   for($i=1;$i<$len;$i++)
 11   { //該層循環用來控制每輪 冒出一個數 須要比較的次數
 12     for($k=0;$k<$len-$i;$k++)
 13     {
 14        if($arr[$k]>$arr[$k+1])
 15         {
 16             $tmp=$arr[$k+1];
 17             $arr[$k+1]=$arr[$k];
 18             $arr[$k]=$tmp;
 19         }
 20     }
 21   }
 22   return $arr;
 23 }
 24 
 25 2. 選擇排序  26 思路分析:在要排序的一組數中,選出最小的一個數與第一個位置的數交換。而後在剩下的數當中再找最小的與第二個位置的數交換,如此循環到倒數第二個數和最後一個數比較爲止。
 27 
 28 代碼實現:  29 function selectSort($arr) {
 30 //雙重循環完成,外層控制輪數,內層控制比較次數
 31  $len=count($arr);
 32     for($i=0; $i<$len-1; $i++) {
 33         //先假設最小的值的位置
 34         $p = $i;
 35 
 36         for($j=$i+1; $j<$len; $j++) {
 37             //$arr[$p] 是當前已知的最小值
 38             if($arr[$p] > $arr[$j]) {
 39             //比較,發現更小的,記錄下最小值的位置;而且在下次比較時採用已知的最小值進行比較。
 40                 $p = $j;
 41             }
 42         }
 43         //已經肯定了當前的最小值的位置,保存到$p中。若是發現最小值的位置與當前假設的位置$i不一樣,則位置互換便可。
 44         if($p != $i) {
 45             $tmp = $arr[$p];
 46             $arr[$p] = $arr[$i];
 47             $arr[$i] = $tmp;
 48         }
 49     }
 50     //返回最終結果
 51     return $arr;
 52 }
 53 
 54 3.插入排序  55 思路分析:在要排序的一組數中,假設前面的數已是排好順序的,如今要把第n個數插到前面的有序數中,使得這n個數也是排好順序的。如此反覆循環,直到所有排好順序。
 56 
 57 代碼實現:  58 function insertSort($arr) {
 59     $len=count($arr); 
 60     for($i=1, $i<$len; $i++) {
 61         $tmp = $arr[$i];
 62         //內層循環控制,比較並插入
 63         for($j=$i-1;$j>=0;$j--) {
 64             if($tmp < $arr[$j]) {
 65                 //發現插入的元素要小,交換位置,將後邊的元素與前面的元素互換
 66                 $arr[$j+1] = $arr[$j];
 67                 $arr[$j] = $tmp;
 68             } else {
 69                 //若是碰到不須要移動的元素,因爲是已經排序好是數組,則前面的就不須要再次比較了。
 70                 break;
 71             }
 72         }
 73     }
 74     return $arr;
 75 }
 76 
 77 4.快速排序  78 思路分析:選擇一個基準元素,一般選擇第一個元素或者最後一個元素。經過一趟掃描,將待排序列分紅兩部分,一部分比基準元素小,一部分大於等於基準元素。此時基準元素在其排好序後的正確位置,而後再用一樣的方法遞歸地排序劃分的兩部分。
 79 
 80 代碼實現:  81 function quickSort($arr) {
 82     //先判斷是否須要繼續進行
 83     $length = count($arr);
 84     if($length <= 1) {
 85         return $arr;
 86     }
 87     //選擇第一個元素做爲基準
 88     $base_num = $arr[0];
 89     //遍歷除了標尺外的全部元素,按照大小關係放入兩個數組內
 90     //初始化兩個數組
 91     $left_array = array();  //小於基準的
 92     $right_array = array();  //大於基準的
 93     for($i=1; $i<$length; $i++) {
 94         if($base_num > $arr[$i]) {
 95             //放入左邊數組
 96             $left_array[] = $arr[$i];
 97         } else {
 98             //放入右邊
 99             $right_array[] = $arr[$i];
100         }
101     }
102     //再分別對左邊和右邊的數組進行相同的排序處理方式遞歸調用這個函數
103     $left_array = quick_sort($left_array);
104     $right_array = quick_sort($right_array);
105     //合併
106     return array_merge($left_array, array($base_num), $right_array);
107 }

 

 
 

12. 接口與抽象類的區別

1. 接口
(1)對接口的使用是經過關鍵字implements
(2)接口不能定義成員變量(包括類靜態變量),能定義常量
(3)子類必須實現接口定義的全部方法
(4)接口只能定義不能實現該方法
(5)接口沒有構造函數
(6)接口中的方法和實現它的類默認都是public類型的
2. 抽象類
(1)對抽象類的使用是經過關鍵字extends
(2)不能被實例化,能夠定義子類必須實現的方法
(3)子類必須定義父類中的全部抽象方法,這些方法的訪問控制必須和父類中同樣(或者更爲寬鬆)
(4)如一個類中有一個抽象方法,則該類必須定義爲抽象類
(5)抽象類能夠有構造函數
(6)抽象類中的方法可使用private,protected,public來修飾。
(7)一個類能夠同時實現多個接口,但一個類只能繼承於一個抽象類。
3. Final類/方法
(1)final類不能被繼承
(2)final方法不能被重寫
4. Static類/方法
(1)能夠不實例化類而直接訪問
(2)靜態屬性不能夠由對象經過->操做符來訪問,用::方式調用

 

 
 

13.innoDB,MyISAM 的區別

MyISAM:
不支持事務;
數據存儲在磁盤,可被壓縮,存儲空間較小;
只支持表級鎖;
支持(FULLTEXT類型的)全文索引。
保存有表的總行數,若是select count(*) from table,會直接取出該值;
若是執行大量的SELECT,MyISAM是更好的選擇;
不支持外鍵;

InnoDB:
支持事務;
存儲在共享空間,須要更多的內存和存儲;
具備事務、回滾和崩潰修復能力;
只支持行級鎖;
不支持(FULLTEXT類型的)全文索引,可是innodb可使用sphinx插件支持全文索引,而且效果更好;
支持外鍵;
若是你的數據執行大量的INSERT或UPDATE,出於性能方面的考慮,應該使用InnoDB表。

**MyISAM和InnoDB二者的應用場景:**\
1) MyISAM管理非事務表。它提供高速存儲和檢索,以及全文搜索能力。若是應用中須要執行大量的SELECT查詢,那麼MyISAM是更好的選擇。\
2) InnoDB用於事務處理應用程序,具備衆多特性,包括ACID事務支持。若是應用中須要執行大量的INSERT或UPDATE操做,則應該使用InnoDB,這樣能夠提升多用戶併發操做的性能。

 

 
 

14. 常見的設計模式

#策略模式
策略模式是對象的行爲模式,用意是對一組算法的封裝。動態的選擇須要的算法並使用。
策略模式指的是程序中涉及決策控制的一種模式。策略模式功能很是強大,由於這個設計模式自己的核心思想就是面向對象編程的多形性思想。
策略模式的三個角色:
1.抽象策略角色
2.具體策略角色
3.環境角色(對抽象策略角色的引用)
實現步驟:
1.定義抽象角色類(定義好各個實現的共同抽象方法)
2.定義具體策略類(具體實現父類的共同方法)
3.定義環境角色類(私有化申明抽象角色變量,重載構造方法,執行抽象方法)
就在編程領域以外,有許多例子是關於策略模式的。例如:
若是我須要在早晨從家裏出發去上班,我能夠有幾個策略考慮:我能夠乘坐地鐵,乘坐公交車,走路或其它的途徑。每一個策略能夠獲得相同的結果,可是使用了不一樣的資源。

# 工廠模式
工廠模式是咱們最經常使用的實例化對象模式,是用工廠方法代替new操做的一種模式。
使用工廠模式的好處是,若是你想要更改所實例化的類名等,則只需更改該工廠方法內容便可,不需逐一尋找代碼中具體實例化的地方(new處)修改了。爲系統結構提供靈活的動態擴展機制,減小了耦合。

# 單例模式
單例模式確保某個類只有一個實例,並且自行實例化並向整個系統提供這個實例。
單例模式是一種常見的設計模式,在計算機系統中,線程池、緩存、日誌對象、對話框、打印機、數據庫操做、顯卡的驅動程序常被設計成單例。
單例模式分3種:懶漢式單例、餓漢式單例、登記式單例。
單例模式有如下3個特色:
1.只能有一個實例。
2.必須自行建立這個實例。
3.必須給其餘對象提供這一實例。
那麼爲何要使用PHP單例模式?
PHP一個主要應用場合就是應用程序與數據庫打交道的場景,在一個應用中會存在大量的數據庫操做,針對數據庫句柄鏈接數據庫的行爲,使用單例模式能夠避免大量的new操做。由於每一次new操做都會消耗系統和內存的資源。

# 註冊模式
註冊模式,解決全局共享和交換對象。已經建立好的對象,掛在到某個全局可使用的數組上,在須要使用的時候,直接從該數組上獲取便可。將對象註冊到全局的樹上。任何地方直接去訪問。

# 適配器模式
將各類大相徑庭的函數接口封裝成統一的API。 \
PHP中的數據庫操做有MySQL,MySQLi,PDO三種,能夠用適配器模式統一成一致,使不一樣的數據庫操做,統一成同樣的API。相似的場景還有cache適配器,能夠將memcache,redis,file,apc等不一樣的緩存函數,統一成一致。 \
首先定義一個接口(有幾個方法,以及相應的參數)。而後,有幾種不一樣的狀況,就寫幾個類實現該接口。將完成類似功能的函數,統一成一致的方法。

 

 
 

15. 寫出乘法表的算法

 1 1.九九乘法表 for 實現:
 2 for($i=1;$i<10;$i++){    
 3     for($j=1;$j<=$i;$j++){        
 4     echo $i.'*'.$j.'='.$i*$j.'   ';   
 5     }    
 6     echo '<br />';
 7 }
 8 2.九九乘法表 while 實現:
 9 $m = 1;
10 while($m<10){    
11     $n = 1;   
12     while($n<=$m){       
13     echo $m.'*'.$n.'='.$m*$n.'   ';        
14     $n++;       
15 }       
16 echo '<br>';        
17 $m++;}

 

 
 

16.echo,print_r ,print,var_dump 區別

 echo是PHP語句, print和print_r是函數,語句沒有返回值,函數能夠有返回值(即使沒有用)
 print() 只能打印出簡單類型變量的值(如int,string)
 print_r() 能夠打印出複雜類型變量的值(如數組,對象)
 echo 輸出一個或者多個字符串
 echo:語句結構;
 print:是函數,有返回值
 print_r:能打印數組,對象
 var_dump:能打印對象數組,而且帶數據類型
 

 

17.session 和 cookie 的區別

 session:儲存用戶訪問的全局惟一變量,存儲在服務器上的php指定的目錄中的(session_dir)的位置進行的存放
 cookie:用來存儲連續訪問一個頁面時所使用,是存儲在客戶端,對於Cookie來講是存儲在用戶WIN的Temp目錄中的。
二者均可經過時間來設置時間長短

 

 

18. 用 PHP 寫出顯示客戶端 IP 與服務器 IP 的代碼

客戶端:$_SERVER["REMOTE_ADDR"]
服務器:$_SERVER["SERVER_ADDR"]

 

 

19.sql 語句應該考慮哪些安全性

(1)防止sql注入,對特殊字符進行轉義,過濾或者使用預編譯sql語句綁定
(2)使用最小權限原則,特別是不要使用root帳戶,爲不一樣的動做或者操做創建不一樣的帳戶
(3)當sql出錯時,不要把數據庫出錯的信息暴露到客戶端

 

 

20. 優化 mysqi 數據庫的方法

(1)選取適當的字段,打字段設置爲NOT NULL,在查詢的時候數據庫不用比較NULL;
(2)使用連接(join)代替子查詢;
(3)使用聯合(UNION)查詢代替手動建立臨時表;
(4)儘可能減小使用(LIKE)關鍵字和通配符
(5)使用事務和外健

 

21. 對於大流量的網站,你會採用什麼方法來解決訪問量?

(1)首先確認服務器硬件是否知足支持當前的流量;
(2)優化數據庫的訪問;
(3)禁止外部盜鏈;
(4)控制大文件下載;
(5)使用不一樣的主機分流;
(6)使用流量分析統計;

 

 

22.isset (),empty () 的區別

isset():
若變量不存在則返回 FALSE 
若變量存在且其值爲NULL,也返回 FALSE 
若變量存在且值不爲NULL,則返回 TURE 
同時檢查多個變量時,每一個單項都符合上一條要求時才返回 TRUE,不然結果爲 FALSE 

empty():
若變量不存在則返回 TRUE
若變量存在且其值爲""、0、"0"、NULL、、FALSEarray()、var $var; 以及沒有任何屬性的對象,則返回 TURE\
若變量存在且值不爲""、0、"0"、NULL、、FALSEarray()、var $var; 以及沒有任何屬性的對象,則返回 FALSE

 

 

23. 六大設計原則(接 14 點設計模式)

1.單一職責原則:一個類只負責一個職責。
2.開閉原則:一個軟件實體好比類-模塊-函數,應該對擴展開放,對修改關閉。
3.里氏替換原則:全部引用基類的地方必須透明地使用其子類的對象,子類必須徹底實現父類的方法,能夠拓展本身的方法和屬性,即子類能夠擴展父類的功能,可是不能改變父類的原有功能。
4.迪米特法則:一個對象應該對其餘對象保持最少的瞭解。
5.接口隔離原則:類間的依賴應該創建在最小的接口上。
6.依賴倒置原則:高層模塊不該該依賴底層模塊,兩者應該依賴其抽象;抽象不該該依賴細節;細節應該依賴抽象;

 

 
 

24.group by 與 distinct 的區別

 

25. 開發中應該注意哪些安全機制

1.PHP配置
2.Sql注入,
3.Xss攻擊(cross site script 跨站腳本),
4.盜鏈,
5.CSRF(跨站請求僞造cross site request forgery),
6.CC(是利用不斷對網站發送鏈接請求導致造成拒絕服務的目的)

 

 
 

26.memcache 和 Redis 的區別

數據結構:memcache僅支持簡單的key-value形式,Redis支持的數據更多(string字符串,set集合,list列表,hash散列,zset有序集合);
多線程:memcache支持多線程,Redis支持單線程
持久化:Redis支持持久化,memcache不支持持久化
分佈式:Redis作主從結構,memcache服務器須要經過hash一致化來支撐主從結構

1.  Redis中,並非全部的數據都一直存儲在內存中的,這是和Memcache相比一個最大的區別。
2.  Redis在不少方面具有數據庫的特徵,或者說就是一個數據庫系統,而Memcache只是簡單的K/V緩存。
3.  他們的擴展都須要作集羣;實現方式:master-slave、Hash。
4.  在100k以上的數據中,Memcache性能要高於Redis。
5.  若是要說內存使用效率,使用簡單的key-value存儲的話,Memcached的內存利用率更高,而若是Redis採用hash結構來作key-value存儲,因爲其組合式的壓縮,其內存利用率會高於Memcache。固然,這和你的應用場景和數據特性有關。
6.  若是你對數據持久化和數據同步有所要求,那麼推薦你選擇Redis,由於這兩個特性Memcache都不具有。即便你只是但願在升級或者重啓系統後緩存數據不會丟失,選擇Redis也是明智的。
7.  Redis和Memcache在寫入性能上面差異不大,讀取性能上面尤爲是批量讀取性能上面Memcache更強

 

 

27. 經常使用的數組函數

數組的鍵名和值:
array_values($arr);  得到數組的值
array_keys($arr);  得到數組的鍵名
array_flip($arr);  數組中的值與鍵名互換(若是有重複前面的會被後面的覆蓋)
in_array("apple",$arr);  在數組中檢索apple
array_search("apple",$arr);  在數組中檢索apple ,若是存在返回鍵名
array_key_exists("apple",$arr);  檢索給定的鍵名是否存在數組中
isset($arr[apple]):   檢索給定的鍵名是否存在數組中

數組的內部指針:
current($arr);  返回數組中的當前單元\
pos($arr);  返回數組中的當前單元\
key($arr);  返回數組中當前單元的鍵名\
prev($arr);  將數組中的內部指針倒回一位\
next($arr);  將數組中的內部指針向前移動一位\
end($arr);  將數組中的內部指針指向最後一個單元\
reset($arr;  將數組中的內部指針指向第一個單元\
each($arr);  將返回數組當前元素的一個鍵名/值的構造數組,並使數組指針向前移動一位\
list($key,$value)=each($arr);  得到數組當前元素的鍵名和值

數組的排序:
1.經過元素值對數組排序:
sort($arr);  由小到大的順序排序(第二個參數爲按什麼方式排序)忽略鍵名的數組排序\
rsort($arr);  由大到小的順序排序(第二個參數爲按什麼方式排序)忽略鍵名的數組排序\
usort($arr,"function");  使用用戶自定義的比較函數對數組中的值進行排序(function中有兩個參數,0表示相等,正數表示第一個大於第二個,負數表示第一個小於第二個)忽略鍵名的數組排序\
asort($arr);  由小到大的順序排序(第二個參數爲按什麼方式排序)保留鍵名的數組排序\
arsort($arr);  由大到小的順序排序(第二個參數爲按什麼方式排序)保留鍵名的數組排序\
uasort($arr,"function");  使用用戶自定義的比較函數對數組中的值進行排序(function中有兩個參數,0表示相等,正數表示第一個大於第二個,負數表示第一個小於第二個)保留鍵名的數組排序

2.經過鍵名對數組排序
ksort($arr);  按照鍵名正序排序\
krsort($arr);  按照鍵名逆序排序\
uksort($arr,"function");  使用用戶自定義的比較函數對數組中的鍵名進行排序(function中有兩個參數,0表示相等,正數表示第一個大於第二個,負數表示第一個小於第二個)

數組的合併:
array_merge($arr1,$arr2);  合併兩個或多個數組(相同的字符串鍵名,後面的覆蓋前面的,相同的數字鍵名,後面的不會作覆蓋操做,而是附加到後面)
array_merge_recursive($arr1,$arr2);   遞歸合併操做,若是數組中有相同的字符串鍵名,這些值將被合併到一個數組中去。若是一個值自己是一個數組,將按照相應的鍵名把它合併爲另外一個數組。當數組 具備相同的數組鍵名時,後一個值將不會覆蓋原來的值,而是附加到後面

數組的差集
array_diff($arr1,$arr2);  返回差集結果數組\
array_diff_assoc($arr1,$arr2,$arr3);  返回差集結果數組,鍵名也作比較

數組的交集
array_intersect($arr1,$arr2);  返回交集結果數組\
array_intersect_assoc($arr1,$arr2);  返回交集結果數組,鍵名也作比較

其餘:
extract($arr);用於把數組中的元素轉換成變量導入到當前文件中,鍵名看成變量名,值做爲變量值
compact(var1,var2,var3);compact() 函數建立包含變量名和它們的值的數組。
array_slice($arr,0,3);  能夠將數組中的一段取出,此函數忽略鍵名
array_push($arr,"apple","pear");  將一個或多個元素壓入數組棧的末尾(入棧),返回入棧元素的個數\
array_pop($arr);  將數組棧的最後一個元素彈出(出棧)

 

 
 

28. 瀏覽器經過 URL 訪問的原理

1.鍵盤或觸屏輸入URL並回車確認
2.URL解析/DNS解析查找域名IP地址
3.網絡鏈接發起HTTP請求
4.HTTP報文傳輸過程
5.服務器接收數據
6.服務器響應請求/MVC
7.服務器返回數據
8.客戶端接收數據
9.瀏覽器加載/渲染頁面
10.打印繪製輸出 

 

29. 常見的負載均衡方案

1.基於DNS的負載均衡
2.基於四層交換技術的負載均衡
3.基於七層交換技術的負載均衡
4.四層+七層負載結合方案

 

 
 

30.mysql_fetch_row () 和 mysql_fetch_array () 的區別

mysql_fetch_row() 從和結果標識 data 關聯的結果集中取得一行數據並做爲數組返回。每一個結果的列儲存在一個數組的單元中,偏移量從 0 開始。依次調用 mysql_fetch_row() 將返回結果集中的下一行,若是沒有更多行則返回 FALSEmysql_fetch_array() 函數從結果集中取得一行做爲關聯數組,或數字數組,或兩者兼有。

解釋:
(1)若是你的表裏面有字段a,b,c那麼你用mysql_fetch_row()  就返回array(1=>a的值,2=>b的值,3=>c的值)這個時候你讀數組的話,只能這樣寫$array[1],$array[2]才能獲得a的值;

(2)要是用mysql_fetch_array()  就返回array(a=>a的值,b=>b的值,c=>c的值)和 array(1=>a的值,2=>b的值,3=>c的值)這個時候你讀數組的話$array[1]和$array[a]都能獲得a的值

 

 
 

31. 如何保障代碼在多個 PHP 版本中能夠正常運行

經過修改nginx配置文件的fastCGI,監聽不一樣端口,從而選擇不同的版本。

 


 

32. 分析 MySQL 查詢慢的緣由

1.查看慢查詢日誌
2.經過pt-query-digest工具分析
3.設置set profiling = 1;開啓服務,執行show profile。查看全部語句會監測消耗時間存到臨時表
4.找到消耗時間大的ID,執行show profile for query 臨時表ID
5.使用show status,show processlist 等命令查看
6.使用explain分析單條SQL語句

 

 

33. 如何不借助第三變量交換兩個變量的值

 1 字符串交換:
 2 1.substr,strlen兩個方法實現:
 3 $a="abc";
 4 $b="bcd";
 5 echo '交換前 $a:'.$a.',$b:'.$b.'<br />';
 6 
 7 $a.=$b;//將字符串合併爲一條
 8 
 9 //利用切割字符串的方法交換
10 $b=substr($a,0,(strlen($a)-strlen($b)));
11 $a=substr($a, strlen($b));
12 echo '交換後$a:'.$a.',$b:'.$b.'<br />';
13 
14 2.使用str_replace方法實現:
15 $a="abc";\
16 $b="bcd";\
17 echo '交換前 $a:'.$a.',$b:'.$b.'<br />';\
18 $a.=$b;\
19 $b=str_replace($b, "", $a);\
20 $a=str_replace($b, "", $a);\
21 echo '交換後$a:'.$a.',$b:'.$b.'<br />';\
22 
23 3.結合使用list方法和array實現:
24 $a="abc";\
25 $b="bcd";\
26 echo '交換前 $a:'.$a.',$b:'.$b.'<br />';\
27 list($b,$a)=array($a,$b);\
28 echo '交換後$a:'.$a.',$b:'.$b.'<br />';
29 PS:list()用法:把數組中的值賦給list中的變量中:
30     $my_array = array("Dog","Cat","Horse");
31     list($a, $b, $c) = $my_array;
32$a = "Dog",$b = "Cat" ,  $c = "Horse";
33 
34 字符串和數字都適用 使用異或運算:
35 $a="abc";\
36 $b="bcd";\
37 echo '交換前 $a:'.$a.',$b:'.$b.'<br />';\
38 $a=$a^$b;\
39 $b=$b^$a;\
40 $a=$a^$b;\
41 echo '交換後$a:'.$a.',$b:'.$b.'<br />';    
42 
43 
44 只適用於數字:
45 $a=3;\
46 $b=5;\
47 echo '交換前 $a:'.$a.',$b:'.$b.'<br />';\
48 $a=$a+$b;\
49 $b=$a-$b;\
50 $a=$a-$b;\
51 echo '交換後$a:'.$a.',$b:'.$b.'<br />';

 

 
 

34.char 和 varchar 的區別

1.varchar用於存儲可變長度,char用於存儲定長
2.對於常常變動的數據char比varchar更好,不容易產生碎片
3.對於很是短的列,char比varcahr在存儲空間上更有效率
4.char對於未達到長度的數據會自動補空格

 

 

35.MySQL 事務的四大特性

通常來講,事務是必須知足4個條件(ACID)::原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)。

    原子性:一個事務(transaction)中的全部操做,要麼所有完成,要麼所有不完成,不會結束在中間某個環節。事務在執行過程當中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務歷來沒有執行過同樣。

    一致性:在事務開始以前和事務結束之後,數據庫的完整性沒有被破壞。這表示寫入的資料必須徹底符合全部的預設規則,這包含資料的精確度、串聯性以及後續數據庫能夠自發性地完成預約的工做。

    隔離性:數據庫容許多個併發事務同時對其數據進行讀寫和修改的能力,隔離性能夠防止多個事務併發執行時因爲交叉執行而致使數據的不一致。事務隔離分爲不一樣級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和串行化(Serializable)。

    持久性:事務處理結束後,對數據的修改就是永久的,即使系統故障也不會丟失。

 

 
 

36. 線程和進程

進程:是併發執行的程序在執行過程當中分配和管理資源的基本單位,是一個動態概念,競爭計算機系統資源的基本單位。

線程:是進程的一個執行單元,是進程內科調度實體。比進程更小的獨立運行的基本單位。線程也被稱爲輕量級進程。一個程序至少一個進程,一個進程至少一個線程。

**進程線程的區別:**

-   地址空間:同一進程的線程共享本進程的地址空間,而進程之間則是獨立的地址空間。
-   資源擁有:同一進程內的線程共享本進程的資源如內存、I/O、cpu等,可是進程之間的資源是獨立的。

     一個進程崩潰後,在保護模式下不會對其餘進程產生影響,可是一個線程崩潰整個進程都死掉。因此多進程要比多線程健壯。

     進程切換時,消耗的資源大,效率高。因此涉及到頻繁的切換時,使用線程要好於進程。一樣若是要求同時進行而且又要共享某些變量的併發操做,只能用線程不能用進程

-   執行過程:每一個獨立的進程程有一個程序運行的入口、順序執行序列和程序入口。可是線程不能獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
-   線程是處理器調度的基本單位,可是進程不是。
-   二者都可併發執行。

**優缺點:**

  線程執行開銷小,可是不利於資源的管理和保護。線程適合在SMP機器(雙CPU系統)上運行。

  進程執行開銷大,可是可以很好的進行資源管理和保護。進程能夠跨機器前移。

  **什麼時候使用多進程,什麼時候使用多線程?**

對資源的管理和保護要求高,不限制開銷和效率時,使用多進程。

要求效率高,頻繁切換時,資源的保護管理要求不是很高時,使用多線程。

 

 

38.HTTP 狀態碼

1**
信息,服務器收到請求,須要請求者繼續執行操做
2**
成功,操做被成功接收並處理
3**
重定向,須要進一步的操做以完成請求
4**
客戶端錯誤,請求包含語法錯誤或沒法完成請求
5**
服務器錯誤,服務器在處理請求的過程當中發生了錯誤

 

 
 

39.Linux 服務器 CPU 負載太高的排查方法

 
 

40. 常見的查找算法

 
 

41.PHP 中布爾值爲 false 的狀況

JS:
1、undefined(未定義,找不到值時出現)
二、null(表明空值)
三、false(布爾值的false,字符串"false"布爾值爲true)
四、0(數字0,字符串"0"布爾值爲true)
五、NaN(沒法計算結果時出現,表示"非數值";可是tapeof NaN==="number"六、""(雙引號)或''(單引號) (空字符串,中間有空格時也是true)
原文:https://blog.csdn.net/Lisunlight/article/details/82733939 

PHP:
一、null(表明空值)爲false
二、false(布爾值的false,字符串"false"布爾值爲true)
三、0(數字0,字符串"0"布爾值都爲false)
四、""(雙引號)或''(單引號)爲false (中間有空格時是true)

 

 

42.php 實現重定向的三種方式

1.header()函數;
header('location:http://www.baidu.com');

2. meta標籤
echo '<meta http-equiv="refresh" content="1;url=http://www.baidu.com">';

3.script標籤;
echo '<script>window.location.href="http://www.baidu.com"</script>';
相關文章
相關標籤/搜索