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 的理解

1、Model(業務模型):應用程序中用於處理應用程序數據邏輯的部分,通常模型對象負責在數據庫中存取數據。           2、view(視圖):應用程序中處理數據顯示的部分。通常視圖是依據模型數據創建的。 3、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(未定義,找不到值時出現)
2、null(代表空值)
3、false(布爾值的false,字符串"false"布爾值為true)
4、0(數字0,字符串"0"布爾值為true)
5、NaN(無法計算結果時出現,表示"非數值";但是tapeof NaN==="number"6、""(雙引號)或''(單引號) (空字符串,中間有空格時也是true)
原文:https://blog.csdn.net/Lisunlight/article/details/82733939 

PHP:
1、null(代表空值)為false
2、false(布爾值的false,字符串"false"布爾值為true)
3、0(數字0,字符串"0"布爾值都為false)
4、""(雙引號)或''(單引號)為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>';

 


免責聲明!

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



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