PHP面試踩過的坑

2020-07-16 10:05:40

相關推薦:《2019年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字尾名

pathinfo()解析檔案路徑,返回其組成部分;
返回關聯陣列
dirname    檔案路徑
basename   檔名+擴充套件名
extension   最後一個擴充套件名
filename   檔名
eg: print_r( pathinfo('/ab/cd/e.php') );
Array(
  [dirname] => /ab/cd
  [basename] => e.php
  [extension] => php
  [filename] => e
)
擴充套件:
列印解析路徑    var_dump( pathinfo($path) );
列印路徑的父級路徑    var_dump( pathinfo($path, PATHINFO_DIRNAME) );
列印路徑的尾名    var_dump( pathinfo($path, PATHINFO_BASENAME) );
列印路徑的最後的擴充套件名   var_dump( pathinfo($path, PATHINFO_EXTENSION) );
列印路徑的檔案的名字   var_dump( pathinfo($path, PATHINFO_FILENAME) );

4.tcp,udp,http區別

參考連結:https://blog.csdn.net/qq_31332467/article/details/79217262

5.獲取上級目錄的方法

echo __FILE__ ; // 獲取當前所在檔案的絕對路徑及地址,結果:D:aaamy.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. 獲得檔名:**
basename — 返回路徑中的檔名部分

$path = "/home/cate/index/index2.php";
$file = basename($path);
echo $file; //結果index2.php

**2. 獲得目錄名**
dirname — 返回路徑中的目錄部分

$path = "/home/cate/index/index2.php";
$file = dirname($path);
echo $file;//結果/home/cate/index

**3.得到路徑關聯陣列**
pathinfo() 函數以陣列的形式返回關於檔案路徑的資訊。
返回的陣列元素如下:
-   [dirname]: 目錄路徑
-   [basename]: 檔名
-   [extension]: 檔案字尾名
-   [filename]: 不包含字尾的檔名
pathinfo(path,options)
| path | 必需。規定要檢查的路徑。 |
| options | 可選。規定要返回的陣列元素。預設是 all。

可能的值:

-   PATHINFO_DIRNAME - 只返回 dirname
-   PATHINFO_BASENAME - 只返回 basename
-   PATHINFO_EXTENSION - 只返回 extension
-   PATHINFO_FILENAME - 只返回 filename

 |
 **4.filesize取得檔案大小**
filesize ( string $filename )
返回檔案大小的位元組數,如果出錯返回  **FALSE** 並生成一條  **E_WARNING** 級的錯誤。

 **判斷目錄是否存在**
 $lujing = "./nihao/wohao";
 if(!is_dir($liujing)){ 
     mkdir(iconv("UTF-8", "GBK", $lujing),0777,true);
 }

 **判斷檔案是否存在**
 file_exists(path);

11.常見的排序演算法

1. 氣泡排序
思路分析:在要排序的一組數中,對當前還未排好的序列,從前往後對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即,每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。

程式碼實現:
$arr=array(1,43,54,62,21,66,32,78,36,76,39);  
function bubbleSort($arr)
{  
  $len=count($arr);
  //該層迴圈控制 需要冒泡的輪數
  for($i=1;$i<$len;$i++)
  { //該層迴圈用來控制每輪 冒出一個數 需要比較的次數
    for($k=0;$k<$len-$i;$k++)
    {
       if($arr[$k]>$arr[$k+1])
        {
            $tmp=$arr[$k+1];
            $arr[$k+1]=$arr[$k];
            $arr[$k]=$tmp;
        }
    }
  }
  return $arr;
}

2. 選擇排序 
思路分析:在要排序的一組數中,選出最小的一個數與第一個位置的數交換。然後在剩下的數當中再找最小的與第二個位置的數交換,如此迴圈到倒數第二個數和最後一個數比較為止。

程式碼實現:
function selectSort($arr) {
//雙重回圈完成,外層控制輪數,內層控制比較次數
 $len=count($arr);
    for($i=0; $i<$len-1; $i++) {
        //先假設最小的值的位置
        $p = $i;

        for($j=$i+1; $j<$len; $j++) {
            //$arr[$p] 是當前已知的最小值
            if($arr[$p] > $arr[$j]) {
            //比較,發現更小的,記錄下最小值的位置;並且在下次比較時採用已知的最小值進行比較。
                $p = $j;
            }
        }
        //已經確定了當前的最小值的位置,儲存到$p中。如果發現最小值的位置與當前假設的位置$i不同,則位置互換即可。
        if($p != $i) {
            $tmp = $arr[$p];
            $arr[$p] = $arr[$i];
            $arr[$i] = $tmp;
        }
    }
    //返回最終結果
    return $arr;
}

3.插入排序
思路分析:在要排序的一組數中,假設前面的數已經是排好順序的,現在要把第n個數插到前面的有序數中,使得這n個數也是排好順序的。如此反復迴圈,直到全部排好順序。

程式碼實現:
function insertSort($arr) {
    $len=count($arr); 
    for($i=1, $i<$len; $i++) {
        $tmp = $arr[$i];
        //內層迴圈控制,比較並插入
        for($j=$i-1;$j>=0;$j--) {
            if($tmp < $arr[$j]) {
                //發現插入的元素要小,交換位置,將後邊的元素與前面的元素互換
                $arr[$j+1] = $arr[$j];
                $arr[$j] = $tmp;
            } else {
                //如果碰到不需要移動的元素,由於是已經排序好是陣列,則前面的就不需要再次比較了。
                break;
            }
        }
    }
    return $arr;
}

4.快速排序  
思路分析:選擇一個基準元素,通常選擇第一個元素或者最後一個元素。通過一趟掃描,將待排序列分成兩部分,一部分比基準元素小,一部分大於等於基準元素。此時基準元素在其排好序後的正確位置,然後再用同樣的方法遞回地排序劃分的兩部分。

程式碼實現:
function quickSort($arr) {
    //先判斷是否需要繼續進行
    $length = count($arr);
    if($length <= 1) {
        return $arr;
    }
    //選擇第一個元素作為基準
    $base_num = $arr[0];
    //遍歷除了標尺外的所有元素,按照大小關係放入兩個陣列內
    //初始化兩個陣列
    $left_array = array();  //小於基準的
    $right_array = array();  //大於基準的
    for($i=1; $i<$length; $i++) {
        if($base_num > $arr[$i]) {
            //放入左邊陣列
            $left_array[] = $arr[$i];
        } else {
            //放入右邊
            $right_array[] = $arr[$i];
        }
    }
    //再分別對左邊和右邊的陣列進行相同的排序處理方式遞回呼叫這個函數
    $left_array = quick_sort($left_array);
    $right_array = quick_sort($right_array);
    //合併
    return array_merge($left_array, array($base_num), $right_array);
}

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.九九乘法表 for 實現:
for($i=1;$i<10;$i++){    
    for($j=1;$j<=$i;$j++){        
    echo $i.'*'.$j.'='.$i*$j.'   ';   
    }    
    echo '<br />';
}
2.九九乘法表 while 實現:
$m = 1;
while($m<10){    
    $n = 1;   
    while($n<=$m){       
    echo $m.'*'.$n.'='.$m*$n.'   ';        
    $n++;       
}       
echo '<br>';        
$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、、FALSE、array()、var $var; 以及沒有任何屬性的物件,則返回 TURE
若變數存在且值不為""、0、"0"、NULL、、FALSE、array()、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() 將返回結果集中的下一行,如果沒有更多行則返回 FALSE。                                                     

mysql_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.substr,strlen兩個方法實現:
$a="abc";
$b="bcd";
echo '交換前 $a:'.$a.',$b:'.$b.'<br />';

$a.=$b;//將字串合併為一條

//利用切割字串的方法交換
$b=substr($a,0,(strlen($a)-strlen($b)));
$a=substr($a, strlen($b));
echo '交換後$a:'.$a.',$b:'.$b.'<br />';

2.使用str_replace方法實現:
$a="abc";
$b="bcd";
echo '交換前 $a:'.$a.',$b:'.$b.'<br />';
$a.=$b;
$b=str_replace($b, "", $a);
$a=str_replace($b, "", $a);
echo '交換後$a:'.$a.',$b:'.$b.'<br />';

3.結合使用list方法和array實現:
$a="abc";
$b="bcd";
echo '交換前 $a:'.$a.',$b:'.$b.'<br />';
list($b,$a)=array($a,$b);
echo '交換後$a:'.$a.',$b:'.$b.'<br />';
PS:list()用法:把陣列中的值賦給list中的變數中:
    $my_array = array("Dog","Cat","Horse");
    list($a, $b, $c) = $my_array;
    則 $a = "Dog",$b = "Cat" ,  $c = "Horse";

字串和數位都適用 使用互斥或運算:
$a="abc";
$b="bcd";
echo '交換前 $a:'.$a.',$b:'.$b.'<br />';
$a=$a^$b;
$b=$b^$a;
$a=$a^$b;
echo '交換後$a:'.$a.',$b:'.$b.'<br />';    

原理:https://blog.csdn.net/github_37767025/article/details/68943789

只適用於數位:
$a=3;
$b=5;
echo '交換前 $a:'.$a.',$b:'.$b.'<br />';
$a=$a+$b;
$b=$a-$b;
$a=$a-$b;
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負載過高的排查方法

參考連結:https://blog.csdn.net/u014692324/article/details/80816521

40.常見的查詢演算法

參考連結:https://segmentfault.com/a/1190000016582674

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)

PHP:
1、undefined(未定義,找不到值時出現)
2、null(代表空值)
3、false(布林值的false,字串"false"布林值為true)
4、0(數位0,字串"0"布林值都為false)
5、""(雙引號)或''(單引號) (空字串,中間有空格時也是true)

推薦教學:phpStudy極速入門視訊教學

以上就是PHP面試踩過的坑的詳細內容,更多請關注TW511.COM其它相關文章!