主頁 > 後端開發 > 談談我在PHP面試時踩過的坑 找作業必看

談談我在PHP面試時踩過的坑 找作業必看

2020-09-11 23:21:26 後端開發

1.get,post 的區別

顯示有區別

  • get方法是將字串拼接在地址欄后面可以看見
  • 而post方法看不見

傳遞的大小有區別

  • 具體大小和瀏覽器有關系,ie瀏覽器是2k其他瀏覽器的最大值可能不同,但是也比較小,
  • 而post方法傳遞引數的大小是可以設定的,原來是認為無限大,在Php當中在php.ini檔案是可以設定引數的大小的,

安全性

  • get方法安全性比較低因為暴露在外面
  • 而post方法安全性比較高

提交的原理

  • get方法提交的資料都是獨立的,
  • 而Post方法將所有的提交的資料變成一個整體(將提交的資料變成xml格式)

靈活性

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

PS在查資料的時候發現一個有趣的回答:
傳送門:https://www.cnblogs.com/xkzy/p/5987742.html

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://zhuanlan.zhihu.com/p/234817919

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)獲得檔案名:

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() 函式以陣列的形式回傳關于檔案路徑的資訊,

回傳的陣列元素如下:

(1)[dirname]: 目錄路徑

(2)[basename]: 檔案名

(3)[extension]: 檔案后綴名

(4)[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 />';    

只適用于數字:

$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系統)上運行,

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

何時使用多行程,何時使用多執行緒?

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

  • 要求效率高,頻繁切換時,資源的保護管理要求不是很高時,使用多執行緒,

37.HTTP 狀態碼

1**
資訊,服務器收到請求,需要請求者繼續執行操作
2**
成功,操作被成功接收并處理
3**
重定向,需要進一步的操作以完成請求
4**
客戶端錯誤,請求包含語法錯誤或無法完成請求
5**
服務器錯誤,服務器在處理請求的程序中發生了錯誤

詳細參照:https://www.runoob.com/http/http-status-codes.html

38.Linux 服務器 CPU 負載過高的排查方法

參考鏈接:https://blog.csdn.net/u014692324/article/details/80816521

39.常見的查找演算法

參考鏈接:https://zhuanlan.zhihu.com/p/232220574

40.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)null(代表空值)為false

2)false(布林值的false,字串"false"布林值為true)

3)0(數字0,字串"0"布林值都為false)

4)""(雙引號)或''(單引號)為false (中間有空格時是true)

41.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=https://www.cnblogs.com/it-abu/p/"http://www.baidu.com"</script>';

點關注,不迷路

好了各位,以上就是這篇文章的全部內容了,能看到這里的人呀,都是人才,之前說過,PHP方面的技術點很多,也是因為太多了,實在是寫不過來,寫過來了大家也不會看的太多,所以我這里把它整理成了PDF和檔案,如果有需要的可以

點擊進入暗號: 博客園

在這里插入圖片描述

在這里插入圖片描述


更多學習內容可以訪問【對標大廠】精品PHP架構師教程目錄大全,只要你能看完保證薪資上升一個臺階(持續更新)

以上內容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那里入手去提升,對此我整理了一些資料,包括但不限于:分布式架構、高可擴展、高性能、高并發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階干貨需要的可以免費分享給大家,需要的可以加入我的PHP技術交流群953224940

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/8293.html

標籤:PHP

上一篇:PHP面試題:TCP/UDP/HTTP的區別和聯系

下一篇:古老的專案,不知道是什么框架,怎么傳參

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more