PHP後端面試85問

IT小馬發表於2022-07-05

1.(int)'0xff'為什麼是0?

0xff是字串 字串轉int 第一個是0 可以轉換成功 xff轉換失敗

2. PHP中10進位制與16進位制互轉

#10轉16
dechex(52558);
或
gmp_strval(52558,16);

#16轉10
hexdec('0xcd4e');

3. 通過aux命令查詢cup和記憶體前十的記錄

ps -aux --sort -pcpu,-pmem | head -n 10

 pcpu是CPU利用率
 pmem是記憶體利用率
 --sort -是降序,+是升序

4. 物件導向基本原則?

  1. 單一職責原則SRP(Single Responsibility Principle) :是指一個類的功能要單一,不能包羅永珍。
  2. 開放封閉原則OCP(Open-Close Principle) 一個模組在擴充套件性方面應該是開放的而在更改性方面應該是封閉的。
  3. 替換原則(the Liskov Substitution Principle LSP) :子類應當可以替換父類並出現在父類能夠出現的任何地方。
  4. 依賴倒置原則(the Dependency Inversion Principle DIP) 具體依賴抽象,上層依賴下層。
  5. 介面分離原則(the Interface Segregation Principle ISP) 模組間要通過抽象介面隔離開,而不是通過具體的類強耦合起來。

5. 設計模式分類,設計原則

建立型模式、結構型模式、行為模式

參考:https://github.com/jiayisheji...

  • 建立型模式,就是建立物件的模式,抽象了例項化的過程。

    • 簡單工廠模式(Simple Factory)
    • 工廠方法模式(Factory Method)
    • 抽象工廠模式(Abstract Factory)
    • 建立者模式(Builder)
    • 原型模式(Prototype):利用原型例項來“克隆”建立新的物件。
    • 單例模式(Singleton)
  • 結構型模式:處理類或物件間的組合。是為解決怎樣組裝現有的類,設計它們的互動方式,從而達到實現一定的功能目的。

    • 外觀模式/門面模式(Facade門面模式)
    • 介面卡模式(Adapter)
    • 代理模式(Proxy)
    • 裝飾模式(Decorator)
    • 橋接模式(Bridge)
    • 組合模式(Composite):
    • 享元模式(Flyweight)
  • 行為型模式涉及到演算法和物件間職責的分配,行為模式描述了物件和類的模式,以及它們之間的通訊模式。

    • 模板方法模式(Template Method)
    • 觀察者模式(Observer)
    • 狀態模式(State)
    • 策略模式(Strategy)
    • 職責鏈模式(Chain of Responsibility)
    • 命令模式(Command)
    • 訪問者模式(Visitor)
    • 調停者模式(Mediator)
    • 備忘錄模式(Memento)
    • 迭代器模式(Iterator)
    • 直譯器模式(Interpreter)

6. PHP一次web請求的流程

  1. 瀏覽器傳送URL請求
  2. DNS解析域名
  3. 獲取到IP後開始訪問IP和Port
  4. 開發傳送TCP請求到Nginx
  5. Nginx解析server name ,然後傳送到 php-fpm管理程式
  6. php-fpm把具體的請求交給PHP執行

7. PHP靜態變數有幾種?

靜態變數屬於靜態儲存方式,其儲存空間為記憶體中的靜態資料區(在靜態儲存區內分配儲存單元)。

靜態變數可以在任何可以申請的地方申請,一旦申請成功後,它將不再接受其他的同樣申請。

靜態變數的值可變,但不會隨著函式的呼叫和退出而發生變化。

靜態區域性變數:static型別的內部變數是一種只能在某個特定函式中使用,但一直佔據儲存空間的變數。

靜態變數的初始值為0。

靜態全域性變數:全域性變數(外部變數)的宣告之前再冠以static 就構成了靜態的全域性變數。

7.區域性變數和靜態區域性變數,全域性變數和靜態全域性變數的區別?

把區域性變數改變為靜態變數後是改變了它的儲存方式,即改變了它的生存期。

把全域性變數改變為靜態變數後是改變了它的作用域(靜態全域性變數只在定義該變數的原始檔內有效),限制了它的使用範圍。

php之static靜態變數詳解

9.array_merge和array+array的區別?

$a=[0,1,2,3]; $b=[1,2,3,4,5]; $a+=$b; echo json_encode($a);//[0,1,2,3,5]

array_merge()不會覆蓋掉原來的值

array+array合併陣列則會把最先出現的值作為最終結果返回,拋棄掉後面的陣列擁有相同鍵名的值。

10.foreach引用傳值結果

<?php
$a=[1,2,3]; 
foreach($a as &$v){} //$v 仍然引用到最後一項 $a[2]
foreach($a as $v){}  //$a[2]會遍歷$a中的值,$v=1,$v=2,$v=2
echo json_encode($a);//[1,2,2]

參考:https://www.php.net/manual/zh...

11.PHP的執行過程?

  1. 掃描(scanning) :將index.php內容變成一個個語言片段(token)
  2. 解析(parsing) :將一個個語言片段變成有意義的表示式
  3. 編譯(complication):將表示式編譯成中間碼(opcode)
  4. 執行(execution):將中間碼一條一條的執行
  5. 輸出(output buffer):將要輸出的內容輸出到緩衝區

12.PHP的變數儲存

php中變數存在於zval變數容器中。

zval結構:變數型別,變數值,is_ref欄位,refcount欄位。

  • is_ref:是個bool值,用來區分變數是否屬於引用集合,表示變數是否有一個以上的別名。
  • refcount:計數器,表示指向這個zval變數容器的變數個數。
  • 當refcount值為1時,is_ref的值為false。因為refcount為1,此變數不可能有多個別名,也就不存在引用了。
  • 將一個變數 = 賦值給另一個變數時,不會立即為新變數分配記憶體空間,而是在原變數的zval中給refcount加1。
  • 有當原變數或者發生改變時,才會為新變數分配記憶體空間,同時原變數的refcount減 1 。
  • 如果unset原變數,新變數直接就使用原變數的zval而不是重新分配。
  • &引用賦值時,原變數的is_ref 變為1,refcount 加1. 如果給一個變數&賦值,之前 = 賦值的變數會分配空間。

13.PHP環狀引用記憶體洩漏

<?php
$a = array( 'one' );
$a[] = &$a;
xdebug_debug_zval( 'a' );//a:(refcount=2, is_ref=1),
?>

PHP5.2以前,refcount為0,則變數的空間可以被釋放,否則就不釋放

unset($a); //refcount減1變為1,不會回收

14.PHP5.3的GC垃圾回收機制

演算法把所有可能根(possible roots 都是zval變數容器),放在根緩衝區(root buffer)中(稱為疑似垃圾),在根緩衝區滿了時,對緩衝區內部所有不同的變數容器執行垃圾回收操作。

或者我們在指令碼中使用gc_collect_cycles,強制回收緩衝區中的垃圾。

  1. 如果一個引用計數refcount增加,它將繼續被使用,當然就不再在垃圾中。
  2. 如果引用計數refcount減少到0,所在變數容器將被清除(free),不會進入緩衝區。
  3. 僅僅在引用計數減少到非零值時,才會產生垃圾週期(garbage cycle),將其放入緩衝區。在一個垃圾週期中,通過檢查引用計數是否減1,並且檢查哪些變數容器的引用次數是零,來發現哪部分是垃圾。

或者我們在指令碼中使用gc_collect_cycles()強制回收緩衝區中的垃圾。

15. PHP開啟/關閉垃圾回收

預設的,PHP的垃圾回收機制是開啟的,然後有個 php.ini 設定允許你修改它:zend.enable_gc

在程式中使用gc_enable() 和 gc_disable()開啟和關閉

16. XSS攻擊及防禦機制

Xss(cross-site scripting)跨站指令碼攻擊:指攻擊者往Web頁面裡插入惡意html標籤或javascript程式碼。

防禦機制:

  • 轉義標籤(htmlspecialchars)
  • 限制字元(reg\_match)
  • 過濾(preg\_replace)
  • cookie設定HTTPOnly(js無法讀取)
  • 模板引擎

17.CSRF攻擊及防禦機制

CSRF跨站點請求偽造(Cross—Site Request Forgery):

CSRF攻擊攻擊原理及過程如下:

  1. 使用者C開啟瀏覽器,訪問受信任網站A,輸入使用者名稱和密碼請求登入網站A;
  2. 在使用者資訊通過驗證後,網站A產生Cookie資訊並返回給瀏覽器,此時使用者登入網站A成功,可以正常傳送請求到網站A;
  3. 使用者未退出網站A之前,在同一瀏覽器中,開啟一個TAB頁訪問網站B;
  4. 網站B接收到使用者請求後,返回一些攻擊性程式碼,併發出一個請求要求訪問第三方站點A;
  5. 瀏覽器在接收到這些攻擊性程式碼後,根據網站B的請求,在使用者不知情的情況下攜帶Cookie資訊,向網站A發出請求。網站A並不知道該請求其實是由B發起的,所以會根據使用者C的Cookie資訊以C的許可權處理該請求,導致來自網站B的惡意程式碼被執行。

防禦CSRF攻擊:目前防禦 CSRF 攻擊主要有三種策略:驗證 HTTP Referer 欄位;在請求地址中新增 token 並驗證;在 HTTP 頭中自定義屬性並驗證。

18. 有一個檔案ip.txt,每行一條ip記錄共若干行,如何統計出現次數最多的前3個ip及其次數?

sort -nr ip.txt | uniq -c | sort -nr | head -n 3

uniq -c filename用於去除冗餘並統計每一行出現的次數。 
sort -r 指逆序排序 -n指按數字字串大小排序 
head -n 指定數量

注:第一次排序,把ip按順序排列,因為第二個uniq只會合併相鄰項 第二次排序,才是把ip按出現次序大小從大到小排列 最後取前三項結果。

19. Mysql B-Tree和B+Tree的結構?

B-Tree:

  1. d>=2,即B-Tree的度(對於一個節點,有n個邊和它相連,就叫做數=n);
  2. h為B-Tree的高;
  3. 每個非葉子結點由n-1個key和n個指標組成,其中d<=n<=2d;
  4. 每個葉子結點至少包含一個key和兩個指標,最多包含2d-1個key和2d個指標,葉結點的指標均為NULL;
  5. 所有葉結點都在同一層,深度等於樹高h;
  6. key和指標相互間隔,結點兩端是指標;
  7. 一個結點中的key從左至右遞增排列;
  8. 一個度為dB-Tree,設其索引Nkey,則其樹高h的上限為logd((N+1)/2),檢索一個key,其查詢結點個數的漸進複雜度為O(logdN)

B+Tree:

  • 每個結點的指標上限為2d而不是2d+1(指標個數和 key的個數相同)。
  • 非葉子結點不儲存data,只儲存key
  • 葉子結點不儲存指標。

20.正規表示式引擎

NFA,表示式主導引擎

DFA,文字主導引擎

DFA引擎搜尋更快一些。但是NFA以表示式為主導,更容易操縱,因此一般程式設計師更偏愛NFA引擎

21. GET和POST的區別

  • GET請求只能進行url編碼,而POST支援多種編碼方式。
  • GET請求在URL中傳送的引數是有長度限制的,而POST沒有。
  • 對引數的資料型別,GET只接受ASCII字元,而POST沒有限制。
  • GET比POST更不安全,因為引數直接暴露在URL上,所以不能用來傳遞敏感資訊。
  • GET引數通過URL傳遞,POST放在Request body中。
  • GET產生一個TCP資料包,POST產生兩個TCP資料包。

參考:https://blog.csdn.net/happy_x...

22. Mysql優化器的參考標準

mysql對索引的是用是由mysql的server層的優化器決定的

23.Memcache和Redis單個key大小限制

Memcache單個key(變數)存放的資料有1M的限制

Redis單個key(變數)存放的資料有1G的限制

24.快取雪崩的處理辦法

事前:進行系統壓力測試,在負載均衡層做限流處理,過載丟棄請求或者進入佇列

事前:redis 高可用,主從+哨兵,redis cluster,避免全盤崩潰。

事中:本地快取 + 限流降級,避免 MySQL 被打死。

事後:redis 持久化,一旦重啟,自動從磁碟上載入資料,快速恢復快取資料。

25.分散式id演算法?

雪花演算法是 twitter 開源的分散式 id 生成演算法,採用 Scala 語言實現,是把一個 64 位的 long 型的 id,1 個 bit 是不用的,用其中的 41 bit 作為毫秒數,用 10 bit 作為工作機器 id,12 bit 作為序列號。

1 bit:不用,為啥呢?因為二進位制裡第一個 bit 為如果是 1,那麼都是負數,但是我們生成的 id 都是正數,所以第一個 bit 統一都是 0。

41 bit:表示的是時間戳,單位是毫秒。41 bit 可以表示的數字多達 2^41 - 1,也就是可以標識 2^41 - 1 個毫秒值,換算成年就是表示69年的時間。

10 bit:記錄工作機器 id,代表的是這個服務最多可以部署在 2^10臺機器上哪,也就是1024臺機器。但是 10 bit 裡 5 個 bit 代表機房 id,5 個 bit 代表機器 id。意思就是最多代表 2^5個機房(32個機房),每個機房裡可以代表 2^5 個機器(32臺機器)。

12 bit:這個是用來記錄同一個毫秒內產生的不同 id,12 bit 可以代表的最大正整數是 2^12 - 1 = 4096,也就是說可以用這個 12 bit 代表的數字來區分同一個毫秒內的 4096 個不同的 id。

26.Redis記憶體淘汰機制

  • noeviction: 當記憶體不足以容納新寫入資料時,新寫入操作會報錯,這個一般沒人用吧,實在是太噁心了。
  • allkeys-lru:當記憶體不足以容納新寫入資料時,在鍵空間中,移除最近最少使用的 key(這個是最常用的)。
  • allkeys-random:當記憶體不足以容納新寫入資料時,在鍵空間中,隨機移除某個 key,這個一般沒人用吧,為啥要隨機,肯定是把最近最少使用的 key 給幹掉啊。
  • volatile-lru:當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,移除最近最少使用的 key(這個一般不太合適)。
  • volatile-random:當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,隨機移除某個 key。
  • volatile-ttl:當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,有更早過期時間的 key 優先移除。

27. 常見MQ選型

ActiveMQ 基於 Java 開發的, RabbitMQ 是基於 erlang 開發的。

特性ActiveMQRabbitMQRocketMQKafka
單機吞吐量萬級,比 RocketMQ、Kafka 低一個數量級同 ActiveMQ10 萬級,支撐高吞吐10 萬級,高吞吐,一般配合大資料類的系統來進行實時資料計算、日誌採集等場景
topic 數量對吞吐量的影響 topic 可以達到幾百/幾千的級別,吞吐量會有較小幅度的下降,這是 RocketMQ 的一大優勢,在同等機器下,可以支撐大量的 topictopic 從幾十到幾百個時候,吞吐量會大幅度下降,在同等機器下,Kafka 儘量保證 topic 數量不要過多,如果要支撐大規模的 topic,需要增加更多的機器資源
時效性ms 級微秒級,這是 RabbitMQ 的一大特點,延遲最低ms 級延遲在 ms 級以內
可用性高,基於主從架構實現高可用同 ActiveMQ非常高,分散式架構非常高,分散式,一個資料多個副本,少數機器當機,不會丟失資料,不會導致不可用
訊息可靠性有較低的概率丟失資料基本不丟經過引數優化配置,可以做到 0 丟失同 RocketMQ
功能支援MQ 領域的功能極其完備基於 erlang 開發,併發能力很強,效能極好,延時很低MQ 功能較為完善,還是分散式的,擴充套件性好功能較為簡單,主要支援簡單的 MQ 功能,在大資料領域的實時計算以及日誌採集被大規模使用

28. 樹資料結構分類

有序樹的定義:若將樹中每個結點的各子樹看成是從左到右有次序的(即不能互換),則稱該樹為有序樹(Ordered Tree)

無序樹的定義:若將樹中每個結點的各子樹從左到右是沒有次序的(即可以互換),則稱該樹為無序樹

29. 資料,資料元素,資料項,資料物件的詳細理解

1.資料(Data):資料就是使用者輸入到計算機被計算機程式處理的一些符號,比如圖片還有聲音等....

2.資料元素(Data Element):是資料的基本單位,資料元素用於完整的描述一個物件,比如一個學生表,學生表也是由 資料元素和資料項組成的.

3.資料項(Data ltem):是組成資料元素的!例如 學生表 的中的 "學號 姓名 性別"等資料項.

4.資料物件:是性質相同的資料元素的集合,是資料的一個子集,例如:整數資料物件的集合 N={1,2,3,4,5,6,7,...};

30. 301和302跳轉的區別?PHP如何顯示301,302,403,404跳轉?

301 Moved Permanently 永久重定向
302 Moved Temporarily 臨時重定向(POST改為GET)
307 Temporary Redirect 臨時重定向(保持POST)

301一般用作永久跳轉,除非使用者清瀏覽器快取,否則不會修改跳轉地址;
302和307可以在後端修改跳轉地址,不同在於302會把POST轉為GET請求,307可以保持POST

//301跳轉
header("HTTP/1.1 301 Moved Permanently");
Header("Location: http://www.baidu.com");
//302
Header("Location: http://www.baidu.com");
//403
header('HTTP/1.0 403 Forbidden');
//404
header('HTTP/1.1 404 Not Found');
header("status: 404 Not Found");

31. 複合索引的使用條件?

複合索引只有在前面的欄位為精確查詢時,才會用上後面的複合索引,一旦出現不精確查詢,則不會使用複合索引。

select * from test where a=10 and b>10 order by c

使用了a_b索引,order by c不使用索引

32. sql語句從執行到返回結果中間花費時間最長的環節是哪步

查詢結果的資料量越大返回時間越長,遠遠超過其他環節的佔用時間。

33.PHP模式修飾符

模式修飾符 含義

i

正規表示式匹配時不區分大小寫

m

不加m時,被匹配的字串被當成整體一行處理,^匹配開始位置,$匹配結束位置或匹配最後一個換行符;

加m時,被匹配的字串通過換行符當成多行處理,每行都與^和$包圍的正則進行匹配

s

正規表示式中的點號(.)將表示任何字元,包括換行符

x

正規表示式中除轉義外的空字元,其它空字元將被忽略

e

只用在正則替換的函式比如preg_replace()中,表示用一個函式替換內容。該修飾符在高版本php中已不再使用,已被preg_replace_callback()所替代

A

匹配時會從字串開始位置進行匹配

D

不加D時,$匹配結束位置或匹配最後一個換行符;

加D時,僅匹配結束位置;

如果設定了修飾符m則會忽略修飾符D

U

不加U時,是貪婪匹配,會最大量的找匹配部分;

加U時,是非貪婪匹配,只找最小的匹配部分

34. HTTP常用方法及作用

  • 一臺伺服器要與HTTP1.1相容,只要為資源實現GET和HEAD方法即可
  • GET是最常用的方法,通常用於請求伺服器傳送某個資源。
  • HEAD與GET類似,但伺服器在響應中值返回首部,不返回實體的主體部分
  • PUT讓伺服器用請求的主體部分來建立一個由所請求的URL命名的新文件,或者,如果那個URL已經存在的話,就用幹這個主體替代它
  • POST起初是用來向伺服器輸入資料的。實際上,通常會用它來支援HTML的表單。表單中填好的資料通常會被送給伺服器,然後由伺服器將其傳送到要去的地方。
  • TRACE會在目的伺服器端發起一個環回診斷,最後一站的伺服器會彈回一個TRACE響應並在響應主體中攜帶它收到的原始請求報文。TRACE方法主要用於診斷,用於驗證請求是否如願穿過了請求/響應鏈。
  • OPTIONS方法請求web伺服器告知其支援的各種功能。可以查詢伺服器支援哪些方法或者對某些特殊資源支援哪些方法。
  • DELETE請求伺服器刪除請求URL指定的資源

35. 常見header請求頭

--示例
vary告訴代理伺服器/快取/CDN,如何判斷請求是否一樣Vary: Accept-Encoding,User-Agent
Rang請求一段記憶體,如0到2000位元組,可用於斷點下載Rang bytes=0-2000
Referer來源地址
Upgrade切換協議版本Upgrade: HTTP/2.0, SHTTP/1.3
User-Agent使用者資訊User-Agent: Mozilla/5.0 (Linux; X11)
X-Requested-Withnull 傳統請求;XMLHttpRequest Ajax請求

參考:https://www.cnblogs.com/yunlo...

36.外部排序使用的資料結構

外部排序指的是大檔案的排序,即待排序的記錄儲存在外儲存器上,待排序的檔案無法一次裝入記憶體,需要在記憶體和外部儲存器之間進行多次資料交換,以達到排序整個檔案的目的。

外部排序最常用的演算法是多路歸併排序,即將原檔案分解成多個能夠一次性裝人記憶體的部分,分別把每一部分調入記憶體完成排序。然後,對已經排序的子檔案進行歸併排序。 大規模資料儲存中,實現索引查詢這樣一個實際背景下,樹節點儲存的元素數量是有限的(如果元素數量非常多的話,查詢就退化成節點內部的線性查詢了),這樣導致二叉查詢樹結構由於樹的深度過大而造成磁碟I/O讀寫過於頻繁,進而導致查詢效率低下,那麼如何減少樹的深度(當然是不能減少查詢的資料量),一個基本的想法就是:採用多叉樹結構(由於樹節點元素數量是有限的,自然該節點的子樹數量也就是有限的)。 這樣我們就提出了一個新的查詢樹結構——多路查詢樹。根據平衡二叉樹的啟發,自然就想到平衡多路查詢樹結構,也就是B-tree(B樹結構)

37. PHP三大模組

核心、zend引擎、以及擴充套件層

參考:[PHP核心]()

38.opcode是什麼?

opcode 是Php指令碼編譯後的中間碼,Zend引擎將原始檔轉換成opcode程式碼,然後在虛擬機器上執行

快取opcode 後 可以加快網站的執行速度

用apc 或者xcache 快取可以快取php的opcode

39.字母如何轉二進位制?

A的ASCII碼是65,16進位制對應41,二進位制對應01000001

a的ASCII碼是97,16進位制對應61,二進位制對應01100001

40. Apache和Nginx的區別?

  • Nginx是輕量級,比apache佔用更少的記憶體以及資源
  • apache是同步多程式模型,一個連線對應一個程式;nginx是非同步的,多個連線(萬級別)可以對應一個程式

41.PHP的魔術方法,魔術常量,超全域性變數

魔術方法

__construct 
__destruct 
__call 
__callStatic 
__get 
__set 
__isset 
__clone 
__unset 
__sleep 
__wakeup 
__toString 
__invoke //反射:當嘗試以呼叫函式的方式呼叫一個物件時,__invoke() 方法會被自動呼叫。
__set_state

魔術常量:所謂的魔術常量就是PHP預定義的一些常量,這些常量會隨著所在的位置而變化。

__LINE__ 獲取檔案中的當前行號。
__FILE__ 獲取檔案的完整路徑和檔名。
__DIR__  獲取檔案所在目錄。
__FUNCTION__ 獲取函式名稱(PHP 4.3.0 新加)。
__CLASS__  獲取類的名稱(PHP 4.3.0 新加)。
__METHOD__ 獲取類的方法名(PHP 5.0.0 新加)。
__NAMESPACE__ 當前名稱空間的名稱(區分大小寫)。
__TRAIT__ Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait 被定義時的名字(區分大小寫)。Trait 名包括其被宣告的作用區域(例如 *Foo\Bar*)。

超全域性變數(9個)

$GLOBALS :儲存全域性作用域中的變數
$_SERVER :獲取伺服器相關資訊
$_REQUEST :獲取POST和GET請求的引數
$_POST : 獲取表單的POST請求引數
$_GET : 獲取表單的GET請求引數
$_FILES :獲取上傳檔案的的變
$_ENV : 獲取伺服器端環境變數的陣列
$_COOKIE:獲取瀏覽器的cookie
$_SESSION : 獲取session

42.Linux新使用者配置檔案的目錄

/etc/skel/目錄是用來存放新使用者配置檔案的目錄,當我們新增新使用者的時候,這個目錄下的所有檔案會自動被複制到新新增的使用者的家目錄下。 這個目錄下的所有檔案都是隱藏檔案(以.點開頭的檔案)。

43. 國標碼,區位碼,機內碼,機器碼的區別?

【國標碼】指國家標準漢字編碼:GB-2312

【區位碼】區位碼在GB-2312中預留了一些空位,便於補充和擴充套件

【機內碼】漢字ASCII碼。指計算機內部儲存,處理加工和傳輸漢字時所用的由0和1符號組成的程式碼。

【機器碼】計算機直接使用的程式語言,其語句就是機器指令碼。

44. PHP檔案指標操作?

ftell(resource handle)         //返回檔案指標的當前位置
fseek(resource hanlde,int offset[,int whence])          //移動檔案指標到指定位置
rewind(resource handle)          //移動檔案指標到檔案的開頭
feof() //測試檔案指標是否在結尾

45. 簡述HTTP和TCP/IP協議

  1. HTTP超文字傳輸協議,是應用層協議,主要解決如何包裝資料,是基於TCP連線的。TCP/IP 傳輸控制協議是傳輸層協議,主要解決資料在網路中如何傳輸的問題。
  2. HTTP協議是獲取地址,傳遞資料的一種基於請求與響應模式的應用層的協議。而TCP是伺服器和客戶端可以互相傳送訊息的互動模式。伺服器主動可以推送訊息給客戶端。
  3. Http就是在每次請求完成後就把TCP連線關了,所以是短連線。TCP是長連線。

46. HTTP報文的組成

Http報文包括請求報文響應報文兩大部分:

  • 請求報文:

    • 請求行(request line):請求型別、訪問的資源,HTTP版本
    • 請求頭(header):通知伺服器有關於客戶端請求的資訊
    • 空行:表示請求頭已經結束
    • 請求體:可以承載多個請求引數的資料
  • 響應報文:

    • 狀態行
    • 響應頭部
    • 空行
    • 響應體

參考:https://www.cnblogs.com/xingx...

47. HTTP1.1的優點

  1. 支援長連線:預設Connection: keep-alive 當一個網頁開啟完成後,客戶端和伺服器之間用於傳輸HTTP資料的TCP連線不會關閉,如果客戶端再次訪問這個伺服器上的網頁,會繼續使用這一條已經建立的TCP連線。
  2. 在一個TCP連線上可以傳送多個HTTP請求和響應,減少了建立和關閉連線的消耗和延遲即減少了 TCP 慢啟動次數
  3. 允許客戶端不用等待上一次請求結果返回,就可以發出下一次請求,減少了 RTTs 數量以及下載過程所需要的時間
  4. 提供了與身份認證、狀態管理和Cache快取等機制相關的請求頭和響應頭。
  5. 安全效能並不是HTTP1.1的特點,不過使用HTTPS解決了HTTP的安全問題,即安全的超文字傳輸協議(SHTTP).

48.PHP中以mb_開頭的方法和非mb開頭的方法區別?

以mb開頭的字串函式,處理的字串可以是多位元組的

如strlen函式,UTF8中文是3個位元組長度,mb_strlen是1個位元組長度

49.str_replace與substr_replace的區別

str_replace() :函式替換字串中的一些字元(區分大小寫)

substr_replace():指定位置把字串的一部分替換為另一個字串

<?php
echo substr_replace("Hello","world",0); //輸出 world
// 0 will start replacing at the first character in the string

50.簡述TCP和UDP協議

TCP:傳輸控制協議

UDP:使用者資料包協議

1、udp是無連線的,tcp是面向連線的;

2、udp是不可靠傳輸,tcp是可靠傳輸;

3、udp是面向報文傳輸,tcp是面向位元組流傳輸。

tcp和udp有什麼區別

51.TCP RTTs:加權平均往返時間

TCP採用了一種自適應演算法,它記錄一個報文段發出的時間,以及收到相應的確認的時間。這兩個時間之差就是報文段的往返時間RTT。

超時重傳時間RTO

RTTD是RTT的偏差的加權平均值

52.awk用法

上古神器AWK

53.inode

作業系統讀取硬碟的時候,不會一個個扇區地讀取,這樣效率太低,而是一次性連續讀取多個扇區,即一次性讀取一個"塊"(block)。這種由多個扇區組成的"塊",是檔案存取的最小單位。"塊"的大小,最常見的是4KB,即連續八個 sector組成一個 block。

儲存檔案元資訊的區域就叫做inode,中文譯名為"索引節點"。

inode包含檔案的元資訊,具體來說有以下內容:

  • 檔案的位元組數
  • 檔案擁有者的User ID
  • 檔案的Group ID
  • 檔案的讀、寫、執行許可權
  • 檔案的時間戳,共有三個:ctime指inode上一次變動的時間,mtime指檔案內容上一次變動的時間,atime指檔案上一次開啟的時間。
  • 連結數,即有多少檔名指向這個inode
  • 檔案資料block的位置

除了檔名以外的所有檔案資訊,都存在inode之中

可以用stat命令,檢視某個檔案的inode資訊:

stat example.txt

54.file()和file_get_contents()的區別

file() 函式把整個檔案讀入一個陣列中。陣列中的每個單元都是檔案中相應的一行,包括換行符在內。失敗返回 false。

file_get_contents() 函式把整個檔案讀入一個字串中。失敗返回 false。

55.PHP的單例模式應用場景

單次頁面級請求,出現多個應用場景並需要共享同一物件資源時。

比如資料庫操作類、網路請求類、日誌操作類、配置管理服務等等。

class Singleton
{
    private static $uniqueInstance;
    private $singletonData = '單例類內部資料';
    private function __construct()
    {
        // 構造方法私有化,外部不能直接例項化這個類
    }
    public static function GetInstance()
    {
        if (self::$uniqueInstance == null) {
            self::$uniqueInstance = new Singleton();
        }
        return self::$uniqueInstance;
    }
    public function SingletonOperation(){
        $this->singletonData = '修改單例類內部資料';
    }
    public function GetSigletonData()
    {
        return $this->singletonData;
    }
}

一起聊聊PHP中的單例模式

56.PHP的socket

Socket 是在應用層和傳輸層之間的一個抽象層,它把 TCP/IP 層複雜的操作抽象為幾個簡單的介面,供應用層呼叫實現程式在網路中的通訊。

  • 客戶端過程:建立 Socket,連線伺服器,將 Socket 與遠端主機連線(注意:只有 TCP 才有“連線”的概念,一些 Socket 比如 UDP、ICMP 和 ARP 沒有“連線”的概念),傳送資料,讀取響應資料,直到資料交換完畢,關閉連線,結束 TCP 對話。
  • 服務端過程:先初始化 Socket,建立流式套接字,與本機地址及埠進行繫結,然後通知 TCP,準備好接收連線,呼叫 accept() 阻塞,等待來自客戶端的連線。如果這時客戶端與伺服器建立了連線,客戶端傳送資料請求,伺服器接收請求並處理請求,然後把響應資料傳送給客戶端,客戶端讀取資料,直到資料交換完畢。最後關閉連線,互動結束。

php中socket是什麼?

57.PHP陣列結構及排序原理

PHP陣列是由雜湊表 + 雙向連結串列實現

排序原理:

  1. 申請n個額外空間
  2. 遍歷雙連結串列 呼叫排序函式zend\_qsort(內部是快速排序演算法)對陣列排序
  3. 呼叫排序函式zend\_qsort(內部是快速排序演算法)對陣列排序
  4. 排序後,雙連結串列中節點的位置發生變化,因而調整指定指向
  5. 遍歷陣列,分別設定每一個節點的pListLast和pListNext
  6. 設定HashTable的pListTail

58.PHP語言結構和函式

  • 語言結構:就是PHP語言的關鍵詞,語言語法的一部分
  • 函式:由程式碼塊組成的,可以複用。函式都要先被PHP解析器(Zend引擎)分解成語言結構,多了一層解析器解析。

語言結構列表 :

echo() print() die() isset() unset() include() array() list() empty() require(),注意,include_once()是函式 ,require_once()是函式

59.PHP-FPM的執行方式及優缺點?

  • static :表示在 php-fpm 執行時直接 fork 出 pm.max_chindren 個子程式,
  • dynamic:表示,執行時 fork 出 start_servers 個程式,隨著負載的情況,動態的調整,最多不超過 max_children 個程式。

一般推薦用 static ,優點是不用動態的判斷負載情況,提升效能;缺點是多佔用些系統記憶體資源。

N 是 CPU 核心數量,M 是 PHP 能利用的記憶體數量,m 是每個 PHP 程式平均使用的記憶體數量

dynamic 方式的公式: 在 N + 20% 和 M / m 之間

static方式的公式:M / (m 1.2)

pm.max_requests:指的是每個子程式在處理了多少個請求數量之後就重啟。這個引數,理論上可以隨便設定,但是為了預防記憶體洩漏的風險,還是設定一個合理的數比較好。

60.PHP常用資訊函式

phpinfo — 輸出關於 PHP 配置的資訊
phpversion — 獲取當前的PHP版本
php_sapi_name — 返回 web 伺服器和 PHP 之間的介面型別
ini_get — 獲取一個配置選項的值
ini_get_all — 獲取所有配置選項
ini_restore — 恢復配置選項的值
ini_set — 為一個配置選項設定值

61.Shell基本操作

變數賦值:變數名=值                                如 FRUIT=apple
取變數值:在變數名前加上 $,這在shell中一般是取變數值的意思
算術表示式求值:$(( ... ))                            如  echo $((a + b))    
字串比較: -n 是否不為空 -z 是否為空         如 if [ -n "$str1" ]

62.演算法,邏輯結構,儲存結構的關係

一個演算法的設計取決於所選定的邏輯結構,而演算法的實現依賴於所採用的儲存結構。

  • 順序儲存結構:用資料元素在儲存器中的相對位置來表示資料元素之間的邏輯結構(關係)。
  • 鏈式儲存結構:在每一個資料元素中增加一個存放另一個元素地址的指標(pointer ),用該指標來表示資料元素之間的邏輯結構(關係)

63.PHP偽型別

偽型別:假型別,實際上在PHP中不存在的型別。但是通過偽型別可以幫助程式設計師去更好的檢視操作手冊從而更方便學習。

  1. mixed混合型別:多種PHP中的資料型別
  2. number數字型別:任意數值型別(整形和浮點型)
  3. callback回撥型別:回撥函式作為引數

64.正則匹配符


65.TCP/IP協議中ARP及RARP協議的作用?

ARP協議的作用是由IP地址查詢對應的MAC地址

RARP協議的作用正好相反,是由MAC地址查詢對應的IP地址。

66. 重放攻擊,Smurf攻擊,字典攻擊,中間人攻擊

  • 重放攻擊指攻擊者傳送一個目的主機已接收過的包,來達到欺騙系統的目的,主要用於身份認證過程,破壞認證的正確性。重放攻擊可以由發起者,也可以由攔截並重發該資料的地方進行。
  • Smurf攻擊是一種分散式拒絕服務 (DDoS) 攻擊,結合使用IP欺騙和ICMP回覆方法使大量網路傳輸充斥目標系統,引起目標系統拒絕為正常系統進行服務。Smurf攻擊通過使用將回復地址設定成網路的廣播地址的ICMP應答請求資料包,來淹沒受害主機,最終導致該網路的所有主機都對此ICMP應答請求做出回覆,導致網路阻塞。更復雜的將源地址改為第三方的受害者,最終導致第三方崩潰。
  • 字典攻擊是在破解密碼或金鑰時,逐一嘗試使用者自定義詞典中的可能密碼的攻擊方式。與暴力破解的區別是,暴力破解會逐一嘗試所有可能的組合密碼,而字典攻擊會使用一個預先定義好的單詞列表。
  • 中間人攻擊是一種間接的入侵攻擊,這種攻擊模式是通過各種技術手段將受入侵者控制的一臺計算機虛擬放置在網路連線中的兩臺通訊計算機之間,這臺計算機稱為“中間人”。通過攔截正常的網路通訊資料,並進行資料篡改和嗅探,而通訊的雙方毫不知情。

71.EXT3,EXT4,XFS檔案系統大小?

Linux檔案系統大小單個檔案大小
ext316TB2TB
ext41EB16TB
xfs18EB9EB

72.Linux 系統檔案描述符:

0:STDIN 標準輸入

1:STDOUT 標準輸出

2:STDERR 標準錯誤輸出

73.Mysql日誌

  1. 有多少種日誌 redo/undo
  2. 日誌的存放形式

    1. redo:在頁修改的時候,先寫到redo log buffer 裡面,然後寫到redo log 的檔案系統快取裡面(fwrite),然後再同步到磁碟檔案(fsync)。
    2. Undo:在MySQL5.5之前,undo只能存放在ibdata*檔案裡面,5.6之後,可以通過設定innodb\_undo\_tablespaces引數把undo log存放在ibdata*之外。
  3. 事務是如何通過日誌來實現的: 因為事務在修改頁時,要先記undo,在記undo之前要記undo的redo,然後修改資料頁,再記資料頁修改的redo。Redo(裡面包括undo的修改)一定要比資料頁先持久化到磁碟。當事務需要回滾時,因為有undo,可以把資料頁回滾到前映象的狀態,崩潰恢復時,如果redo log中事務沒有對應的commit記錄,那麼需要用undo把該事務的修改回滾到事務開始之前。如果有commit記錄,就用redo前滾到該事務完成時並提交掉。

74. Mysql json型別

5.7.8開始,mysql開始支援json資料型別,json資料型別儲存時會做格式檢驗,不滿足json格式會報錯,json資料型別預設值不允許為空。
優勢:
  1. 儲存上類似text,可以存非常大的資料。
  2. JSON有效性檢查:插入的資料必須是JSON型別的字串才行。
  3. 相比於傳統形式,不需要遍歷所有字串才能找到資料。
  4. 支援索引:通過虛擬列的功能可以對JSON中部分的資料進行索引

參考:https://blog.csdn.net/u011207...

75. Mysql索引建立原則

  1. 最適合索引的列是出現在 where 子句或連線子句中的列,而不是出現在 select 的關鍵字後的列
  2. 索引列的基數越大,索引效果越好
  3. 對字串進行索引,應指定一個字首長度,可以節省大量的索引空間
  4. 根據情況建立複合索引,複合索引可以提高查詢效率
  5. 避免建立過多索引,索引會額外佔用磁碟空間,減低寫操作效率
  6. 主鍵儘可能選擇較短的資料型別,可以有效減少索引的磁碟佔用,提高效率

76. 索引的注意事項

  1. 複合索引遵循左字首原則
  2. like 查詢,%不能在前,可以使用全文索引
  3. column is null 可以使用索引
  4. 如果 MySQL 估計使用索引比全表掃描更慢,會放棄使用索引

77.查詢速度慢的原因

  1. 開啟慢查詢日誌,通過 pt-query-dugest 分析

    #看一下當前mysql資料庫是否開啟了慢查詢
    show variables like 'slow_query%';
    #臨時開啟
    set global slow_query_log='ON';

    永久開啟:修改配置檔案my.cnf,在[mysqld]下的下方加入
    [mysqld]
    slow_query_log = ON
    slow_query_log_file = /var/lib/mysql/tmp_slow.log //linux
    long_query_time = 1

    重啟mysql服務

  2. show profile,通過 set profiling=1;開啟,伺服器上執行的所有語句消耗時間都會記錄到臨時表。show profile for query QUERY_ID 查詢指定查詢
  3. show status,查詢一些計數器,猜出哪些代價高或消耗時間多
  4. show processlist,查詢執行緒狀態進行分析
  5. explain,分析單個 SQL 語句查詢

78.Mysql優化查詢過程中的資料訪問

  1. 訪問資料太多導致效能下降
  2. 確定應用程式是否檢索大量超過需要的資料,可能是太多列或者行
  3. 確定 mysql 是否分析大量不必要的資料行
  4. 查詢不需要的記錄,使用 limit 限制
  5. 奪標關聯返回全部列指定 A.id,A.name
  6. 總數取出全部列,select * 會讓優化器無法完成所有覆蓋掃碼的優化
  7. 重複查詢相同的資料,可以快取資料
  8. 改變資料庫和表的結構,修改資料表正規化
  9. 重寫 SQL 語句,讓優化器可以更優的執行

79.優化長難的查詢語句

  1. MySQL 內部每秒能掃描記憶體中上百萬行資料,相比之下,響應資料給客戶端就要慢得多
  2. 將一個大的查詢分解為多個小的查詢
  3. 分解關聯查詢,將一個關聯查詢分解為多個 sql 來執行,讓快取效率更高,執行單個查詢可以減少鎖的競爭,在應用層做關聯可以更容易對資料庫進行拆分,查詢效率會有大幅提升,較少冗餘記錄的查詢

80 .優化特定型別的查詢語句

  1. 優化 count()查詢,count(*)會忽略所有列,直接統計所有列數,因此不要用 count(列名)
  2. 優化關聯查詢,確定 ON 或者 USING 子句的列上有索引;確保 GROUP BY 和 ORDER BY 中只有一個表的列,這樣 MySQL 才有可能使用索引
  3. 優化子查詢,可使用關聯查詢替代
  4. 優化 GROUP BY 和 DISTINCT,建立索引進行優化
  5. 優化 LIMIT 分頁,可以通過記錄上次查詢的最大 ID,如果根據 id 排序時,下次查詢根據該 ID 來查 詢(如:ID > maxID)
  6. 優化 UNION 查詢,UNION ALL 效能比 UNION 高

81.高併發常見單位

  1. QPS:每秒鐘請求或查詢數量,在網際網路領域指每秒響應的請求數(指 HTTP 請求)
  2. 吞吐量:單位時間內處理的請求數量(通常由 QPS 和併發數決定)
  3. 響應時間:從請求發出到收到響應花費時間
  4. PV:綜合瀏覽量(Page View),即頁面瀏覽量或者點選量,一個訪客在 24 小時內訪問的頁面數量。同一個人瀏覽你的網站同一個頁面,只記作一次 PV
  5. UV:獨立訪客(UniQue Visitor),即一定時間範圍內相同訪客多次訪問網站,只能計算

為 1 個獨立訪客

  1. 頻寬:計算頻寬大小需關注兩個指標,峰值流量和頁面的平均大小
  2. 日網站頻寬=PV/統計時間(秒)平均頁面大小(KB)8
  3. 峰值一般是平均值的倍數
  4. QPS 不等於併發併發連線數。QPS 是每秒 HTTP 請求數量,併發連線數是系統同時處理的請求數量
  5. 二八定律(80%的訪問量集中在 20%的時間):(總 PV 數 80%)/(6 小時秒速 20%)=峰值每秒請求數(QPS)
  6. 壓力測試:能承受最大的併發數和最大承受的 QPS 值

82.常用效能測試工具 ab

# 模擬併發請求 100 次,總請求 5000 次 
ab -c 100 -n 5000 http://example.com

83.http 狀態碼

  1. 200 請求成功2. 204 not content
  2. 206 reset content
  3. 301 永久重定向
  4. 302 臨時重定向
  5. 307 臨時重定向
  6. 400 錯誤請求
  7. 401 缺少認證資訊
  8. 403 拒絕
  9. 404 不存在
  10. 500 伺服器異常
  11. 502 Bad Gateway
  12. 503 伺服器超負載或停機維護

84.OSI 七層協議

物數網傳會表應

  1. 物理層:建立、維護、斷開物理連線
  2. 資料鏈路層:建立邏輯連線,進行硬體地址定址,差錯校驗等功能
  3. 網路層:進行邏輯地址定址,不同網路之間的路徑選擇
  4. 傳輸層:定義傳輸資料的協議埠號,一級流控和差錯校驗。協議有 TCP/UDP,資料包一旦離開網路卡即進入網路傳輸層
  5. 會話層:建立、管理、終止會話
  6. 表示層:資料的表示、安全、壓縮
  7. 應用層:網路服務與使用者的 介面,預設協議有 :http(80),ftp(21),tftp,smtp(25),snmp,dns(53),telnet(23),https(443),pop3(110),dhcp

85. HTTP 協議常見請求頭/響應頭

  1. Content-Type 指定資料內容型別
  2. Accept 指定客戶端能接受資料內容型別
  3. Origin 最初請求來源(POST)
  4. Cookie
  5. Cache-Control 指定請求的快取機制
  6. User-Agent 使用者瀏覽器資訊
  7. Referrer 上級請求路徑
  8. X-Forwarded-For 請求端真實 ip
  9. Access-Control-Allow-Origin 允許其他請求域名,用於跨域
  10. Last-Modified 最後響應時間

相關文章