主頁 > 後端開發 > PHP 高級面試115題匯總(含答案)

PHP 高級面試115題匯總(含答案)

2020-09-25 03:02:42 後端開發



1、給你四個坐標點,判斷它們能不能組成一個矩形,如判斷 ([0,0],[0,1],[1,1],[1,0]) 能組成一個矩形,
勾股定理,矩形是對角線相等的四邊形,只要任意三點不在一條直線上,任選一點,求這一點到另外三點的長度的平方,兩個短的之和如果等于最長的,那么這就是矩形,

2、寫一段代碼判斷單向鏈表中有沒有形成環,如果形成環,請找出環的入口處,即 P 點

 1 /*
 2  *單鏈表的結點類
 3  */
 4 class LNode{
 5     //為了簡化訪問單鏈表,結點中的資料項的訪問權限都設為public
 6     public int data;
 7     public LNode next;
 8 }
 9 
10 class LinkListUtli {
11     //當單鏈表中沒有環時回傳null,有環時回傳環的入口結點
12     public static LNode searchEntranceNode(LNode L)
13     {
14         LNode slow=L;//p表示從頭結點開始每次往后走一步的指標
15         LNode fast=L;//q表示從頭結點開始每次往后走兩步的指標
16         while(fast !=null && fast.next !=null) 
17         {
18             if(slow==fast) break;//p與q相等,單鏈表有環
19             slow=slow.next;
20             fast=fast.next.next;
21         }
22         if(fast==null || fast.next==null) return null;
23 
24         // 重新遍歷,尋找環的入口點
25         slow=L;
26         while(slow!=fast)
27         {
28             slow=slow.next;
29             fast=fast.next;
30         }
31 
32         return slow;
33     }
34 }
35 3、寫一個函式,獲取一篇文章內容中的全部圖片,并下載
36 
37 function download_images($article_url = '', $image_path = 'tmp'){
38 
39     // 獲取文章類容
40     $content = file_get_contents($article_url);
41 
42     // 利用正則運算式得到圖片鏈接
43     $reg_tag = '/<img.*?\"([^\"]*(jpg|bmp|jpeg|gif|png)).*?>/';
44     $ret = preg_match_all($reg_tag, $content, $match_result); 
45     $pic_url_array = array_unique($match_result1[1]);
46 
47     // 創建路徑
48     $dir = getcwd() . DIRECTORY_SEPARATOR .$image_path;
49     mkdir(iconv("UTF-8", "GBK", $dir), 0777, true);
50 
51     foreach($pic_url_array as $pic_url){
52         // 獲取檔案資訊
53         $ch = curl_init($pic_url);
54         curl_setopt($ch, CURLOPT_HEADER, 0);
55         curl_setopt($ch, CURLOPT_NOBODY, 0);
56         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE );
57         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE );
58         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
59         $fileInfo = curl_exec($ch);
60         $httpinfo = curl_getinfo($ch);
61         curl_close($ch);
62 
63         // 獲取圖片檔案后綴
64         $ext = strrchr($pic_url, '.');
65         $filename = $dir . '/' . uniqid() . $ext; 
66 
67         // 保存圖片資訊到檔案
68         $local_file = fopen($filename, 'w');
69         if(false !== $local_file){
70             if( false !== fwrite($local_file, $filecontent) ){
71             fclose($local_file);
72             }
73         }
74     }
75 
76 }

 

4、獲取當前客戶端的 IP 地址,并判斷是否在

(111.111.111.111,222.222.222.222)
如果沒有使用代理服務器:

$ip = $_SERVER['REMOTE_ADDR'];
使用透明代理

$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];

 

5、nginx 的 log_format 配置如下:

1 log_format main ‘remoteaddr?remote_user [timelocal]"request”’ 
2 ‘statusbody_bytes_sent “httpreferer"″"http_user_agent” “upstreamresponsetime""request_time” “http_x_forwarded_for"';

 

從今天的 nginx log 檔案 access.log 中:

a、列出 “request_time” 最大的 20 行?
b、列出早上 10 點訪問量做多的 20 個 url 地址?

6、什么是 CSRF 攻擊?XSS 攻擊?如何防范?
CSRF:跨站請求偽造,可以通過通過判斷來源和加 Token 的方式來防范,

XSS:跨站腳本攻擊,可以通過對內容轉義和過濾來防范,還有 CSP

7、應用中我們經常會遇到在 user 表隨機調取 10 條資料來展示的情況,簡述你如何實作該功能,

SELECT * FROM `table` WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) ORDER BY id LIMIT 1;

 

8、從撲克牌中隨機抽 5 張牌,判斷是不是一個順子,即這 5 張牌是連續的
這個問題有個關鍵點,撲克牌,1-13 不能再多了,這就很簡單了,用 PHP 來做,定義一個陣列分別存著 1 到 13, 拿出一個,置空一個,最后看下 這五個置空的 是不是連續的,這種情況不考慮抽出的順序,

9、兩條相交的單向鏈表,如何求它們的第一個公共節點
思想:

如果兩個鏈表相交,則從相交點開始,后面的節點都相同,即最后一個節點肯定相同;
從頭到尾遍歷兩個鏈表,并記錄鏈表長度,當二者的尾節點不同,則二者肯定不相交;
尾節點相同,如果 A 長為 LA,B 為 LB,如果 LA>LB, 則 A 前 LA-LB 個先跳過
如果兩個單向鏈表有公共的結點,也就是說兩個鏈表從某一結點開始,它們的 m_pNext 都指向同一個結點,但由于是單向鏈表的結點,每個結點只有一個 m_pNext,因此從第一個公共結點開始,之后它們所有結點都是重合的,不可能再出現分叉,所以,兩個有公共結點而部分重合的鏈表,拓撲形狀看起來像一個 Y,而不可能像 X,

10、最長公共子序列問題 LCS,如有 [1,2,5,11,32,15,77] 和 [99,32,15,5,1,77] 兩個陣列,找到它們共同都擁有的數,寫出時間復雜度最優的代碼,不能用 array_intersect(這里有坑,需要去研究一下動態規劃),

11、linux 的記憶體分配和多執行緒原理

12、MYSQL 中主鍵與唯一索引的區別
主鍵:絕對不能有空值,唯一索引:可以有空值

13、http 與 https 的主要區別
關鍵是 S 上,簡而言之,https 建立連接后要先把 SSL 的證書發下去,有了公鑰和私鑰,就可以解密了,

14、http 狀態碼及其含意

200 請求已成功,請求所希望的回應頭或資料體將隨此回應回傳,
301 被請求的資源已永久移動到新位置,
302 請求的資源現在臨時從不同的 URI 回應請求,
400 1、語意有誤,當前請求無法被服務器理解,2、請求引數有誤,
401 當前請求需要用戶驗證,
403 服務器已經理解請求,但是拒絕執行它,
404 請求失敗,請求所希望得到的資源未被在服務器上發現,
500 服務器遇到了一個未曾預料的狀況,無法完成對請求的處理,會在程式碼出錯時出現,
501 服務器不支持當前請求所需要的某個功能,無法識別請求的方法,
502 作為網關或者代理作業的服務器嘗試執行請求時,從上游服務器接收到無效的回應,
503 由于臨時的服務器維護或者過載,服務器當前無法處理請求,

15、linux 中怎么查看系統資源占用情況

top、htop、free、uptime

16、SQL 注入的原理是什么?如何防止 SQL 注入
原理:第一 SQL 本身有問題(這個不是主要問題),第二你寫的 SQL 很有問題(這是最主要的)

防范:第一,絕對不要相信用戶輸入的任何東西,第二,預編譯,現在的框架一般都會有 SQL 過濾的,

17、isset (null) isset (false) empty (null) empty (false) 輸出
PHP 入門問題,isset 和 empty 的區別

分別是 false, true, true, true

18、優化 MYSQL 的方法
第一,資料超過一定數量或者體積,請拆分表,垂直或者水平分(最有效果的優化)

第二,務必有自增主鍵,通過自增主鍵來查資料是最快的,

第三,常用的查詢欄位建立聯合索引,寫 SQL 一定要尊從最左原則,用到這個索引,

第四,不要把邏輯運算放到 sql 里,言外之意是,不要寫太復雜的 SQL,你能寫復雜的 SQL 你肯定也能通過 PHP 實作,

19、資料庫中的事務是什么?
事務(transaction)是作為一個單元的一組有序的資料庫操作,如果組中的所有操作都成功,則認為事務成功,即使只有一個操作失敗,事務也不成功,如果所有操作完成,

事務則提交,其修改將作用于所有其他資料庫行程,如果一個操作失敗,則事務將回滾,該事務所有操作的影響都將取消,

20、寫一個函式,盡可能高效的從一個標準 URL 中取出檔案的擴展名
會 寫正則最好,我反正不會正則,需要用的時候就百度,

21、引數為多個日期時間的陣列,回傳離當前時間最近的那個時間
遍歷陣列,求當前時間差,和第一個進行對比,小于第一個交換位置,最后取第一個即可,

22、echo、print、print_r 的區別
這三個放在一起,回答的點在于,print_r 是函式,echo、print 是結構語言,

23、http 協議的 header 中有哪些 key 及含義
這個問題,很難,一會半會說不清楚,如果做過 PHP restful 介面開發,也踩過這里面的坑,那應該是可以答出來常用的幾個 KEY 的,

24、二叉樹前中后遍歷代

  1. 層序遍歷
  2. 先序遍歷
  3. 中序遍歷
  4. 后序遍歷

25、PHP 的陣列和 C 語言的陣列結構上有何區別?
但從 PHP 來講,考的是 PHP 陣列的實作,可以簡單的認為,PHP 的陣列是 hash 桶 + 十字鏈表(實際上是數列 Array,串列 List,散串列 / 關聯陣列 / 字典 Hashtable 的聚合體),優點是查詢效率很高,遍歷很方便,缺點是,占記憶體較多,(還是空間換時間的思路,畢竟現在記憶體又不值錢)

C 語言的陣列,就是定長定型別的數列,

26、Redis 的跳躍表怎么實作的
跳躍表 (skiplist) 是一種有序資料結構,它通過在每個節點中維持多個指向其他節點的指標,從而達到快速訪問節點的目的,

27、哈希是什么?hash 沖突后,資料怎么存?

28、聚簇索引,聚集索引的區別?

29、B+Tree 是怎么進行搜索的

30、陣列和 hash 的區別是什么?

31、寫個函式,判斷下面擴號是否閉合,左右對稱即為閉合:((())),)(()),(()))),(((((()),(()()),()()

32、 找出陣列中不重復的值 [1,2,3,3,2,1,5]
用普通方法,肯定很容易的,

33、32 題你的時間復雜度是多少?有的情況下,你寫了個演算法,然后面試官會讓你把你的演算法的時間復雜度運算式寫出來

34、PHP 的的這種弱型別變數是怎么實作的?
考 zval 的,PHP 的八種型別,本質只有一個結構,

35、在 HTTP 通訊程序中,是客戶端還是服務端主動斷開連接
三次握手和四次揮手,以及他們每步的狀態,

這個問題最好能一步到位回答的全面的,一般都是有客戶端告訴服務端,我這邊東西發完了,可以斷連接了么,但是如果客戶端發完 FIN 服務端沒有回復,就會重試,直到超過超時時間,就斷了,服務端也一樣,超過時間,服務端就斷了,

36、PHP 中發起 http 請求有哪幾種方式?它們有何區別?

GET
POST
HEAD
PUT
DELETE
OPTIONS
TRACE
CONNECT

37、有一顆二叉樹,寫代碼找出來從根節點到 flag 節點的最短路徑并列印出來,flag 節點有多個,比如下圖這個樹中的 6 和 14 是 flag 節點,請寫代碼列印 8、3、6 和 8、10、14 兩個路徑

典型的二叉搜索樹,大學資料結構的基礎題,

38、有兩個檔案檔案,大小都超過了 1G,一行一條資料,每行資料不超過 500 位元組,兩檔案中有一部分內容是完全相同的,請寫代碼找到相同的行,并寫到新檔案中,PHP 最大允許內內為 255M,
將檔案拆分成若干個小檔案,根據內容計算 hash 值,分散到不同檔案,

39、請寫出自少兩個支持回呼處理的 PHP 函式,并自己實作一個支持回呼的 PHP 函式

array_map,array_filter, array_walk

40、請寫出自少兩個獲取指定檔案夾下所有檔案的方法(代碼或思路),
核心方法是 scandir, 核心思想是遞回,

41、請寫出自少三種截取檔案名后綴的方法或函式(PHP 原生函式和自己實作函式均可)

echo substr(strrchr($file, '.'), 1);

echo substr($file, strrpos($file, '.')+1);

$arr=explode('.', $file);
echo $arr[count($arr)-1];

$arr=explode('.', $file);
echo end($arr);

echo strrev(explode('.', strrev($file))[0]);

echo pathinfo($file)['extension'];

echo pathinfo($file, PATHINFO_EXTENSION);

42、PHP 如何實作不用自帶的 cookie 函式為客戶端下發 cookie,對于分布式系統,如何來保存 session 值,
這個題有點繞,考的還是 COOKIE 和 SESSION 的基礎知識,服務端通過 set-cookie 命令來通知客戶端保存 cookie,

只要按照 domain path 過期時間等規則 用 header 函式就可以實作,

分布式系統 session,集中處理,按我們公司的架構,為了實作高可用和高容災,提供一個分布式的驗簽服務,具體的可以看下 redis 的分布式服務架構,

43、請用 SHELL 統計 5 分鐘內,nginx 日志里訪問最多的 URL 地址,對應的 IP 是哪些?

44、寫一段 shell 腳本實作備份 mysql 指定庫(如 test) 到指定檔案夾并打包,并洗掉 30 天前的備份,然后將新的備份推送到遠端服務器,完成后送郵件通知,

45、mysql 資料庫中 innodb 和 myisam 引擎的區別
區別主要在資料和索引的存盤結構和存盤方式上,以及對于事務的支持,

46、從用戶在瀏覽器中輸入網址并回車,到看到完整的見面,中間都經歷了哪些程序,
入門問題,這個問題有一個很大的坑,面試官可能會從這個問題下手問你一大堆問題,

以 PHP 為例:通常最簡單的回答,從用戶的電腦找到最近的 DNS 服務,然后決議到對應的 IP 然后雙方開始 HTTP 連接,然后發送請求資訊,服務器拿到請求資訊就開始準備回應的資訊,中間要經過 nginx 轉發到 frstCGI (PHP-FPM), 然后 PHP 開始決議框架,決議請求頭部,找到對應的 API,該查資料庫查資料,該組裝 HTML 組裝 HTML,完事了就重新回傳給用戶,用戶拿到回傳資料,瀏覽器開始渲染頁面,JS 開始加載,

47、如何分析一條 sql 陳述句的性能,
explain,具體的請百度,(基本很少用性能分析陳述句,MYSQL 的表設計上盡量冗余一部分欄位,避免在 MYSQL 里處理大量的邏輯運算,我們是做 PHP 服務開發的,mysql 陳述句能簡單盡量簡單,邏輯運算的地方可以在 PHP 里做,)

48、ping 一個服務器 ping 不通,用哪個命令跟蹤路由包?

linux:traceroute,windows:tracert

49、

$a=[0,1,2,3]; $b=[1,2,3,4,5]; $a+=$b; var_dump ($a) 等于多少?
基礎問題,本質還是考 PHP 陣列的結構和特點,

結果是 01235,PHP 用數字索引和 STRING 索引差別還是很大的

50.

$a=[1,2,3]; foreach ($a as &$v){} foreach ($a as $v){} var_dump ($a) 等于多少;
122
此處有一坑,foreach 完之后,$index , $value 并不會消失保留最后一次賦值,
這里的第一次 foreach 之后,陣列中最后一個元素變成參考,參考變數 $v 繼續存在且指向陣列的最后一個元素,第二次遍歷,因為遍歷變數名是 $v , 所以等于說每次遍歷都將此次遍歷的值修改成最后元素的值,直至到遍歷最后一個元素(參考元素),因為此時陣列的最后一個元素已被修改成上一個元素的值,最后一次賦值就是 自己 == 自己, 故最后一個等于倒數第二個

博客:【PHP - 雷】foreach 與 reference 的雷

51、資料庫中的存放了用戶 ID, 扣費很多行,redis 中存放的是用戶的錢包,現在要寫一個腳本,將資料庫中的扣費記錄同步到 redis 中,每 5 分鐘執行一次,請問要考慮哪些問題?
思路:生產者和消費者模式,這個問題也沒有說其他的狀態,比如資料庫的資料會實時增加么?redis 中每個錢包是否有其他服務在讀取或者寫入啊,什么的,資料庫和 REDIS 放一起,要么考資料一致性,要么考出現鎖,導致效率降低,

52、MYSQL 主從服務器,如果主服務器是 innodb 引擎,從服務器是 myisam 引擎,在實際應用中,會遇到什么問題?
不知道,沒用過,為什么這么設計?故意給自己找不愉快?

53、linux 中行程信號有哪些?
kill -l 很少用

54、redis 的底層實作
面試官這么樣問你,你就反問他,你要的底層實作是欄位的設計?記憶體分配管理?網路模型?資料同步?還是分布式的實作?(TIPS: 面試就是兩個人的博弈,面試官給出一個描述不清晰的問題,我們沒必要回答,讓他把問題講清楚再思考怎么回復)

這篇文章 要多讀幾遍,

55、異步模型
問清楚是 IO 異步模型,還是 AJAX 這類的異步請求模型,差別非常大的,

狗東某風控研發必考題,

56、10g 檔案,用 php 查看它的行數
粗暴一點的方法 ini_set ('memory_limit','-1'); 先把當前記憶體限制解除了 然后直接逐行統計,時間會非常的久,

有更好的方法請留言,

57、有 10 億條訂單資料,屬于 1000 個司機的,請取出訂單量前 20 的司機
(TIPS)不要中招,不要用常用思路來處理,10 億資料 你再怎么優化,全表求和,都是要死人的,

我們從設計上解決這個問題,只有一千個司機,我們可以做個簡單哈希,分庫分表,% 求余數,保證這一千個司機分在一千個表里,每個人有每個人的單獨表,引擎用 MYSAIM,求表中資料的總數,效率飛快,遍歷一千張表,求最大前二十即可,

58、設計一個微信紅包的功能
沒做過,其實題目表達不清楚,如果做過微信公眾號開發,知道微信事件模型的 XML 資料結構,應該會好做一點,

59、根據 access.log 檔案統計最近 5 秒的 qps,并以如下格式顯示,01 1000(難點在 01 序號)

tail -f access.log | awk -F '[' '{print $2}' | awk '{print $1}' | uniq -c

60、php7 性能為什么提升這么高
不逼逼,直接參考:http://www.laruence.com/php-internal

鳥哥的文章要多讀,多讀,

61、遍歷一個多維陣列
遞回,array_map 傳入一個回呼函式,

62、有這樣一個字串 abcdefgkbcdefab…… 隨機長度,寫一個函式來求 bcde 在這個字串中出現的次數
substr_count();

63、有一個 1G 大小的一個檔案,里面每一行是一個詞,詞的大小不超過 16 個位元組,記憶體限制大小是 1M,回傳頻數最高的 100 個詞
方法太多了,但是實作起來 各有各的問題,

我可能只會用 HASH 映射做,其他的,不會,

參考:第 64 題,

64、十道海量資料處理面試題與十個方法大總結

https://blog.csdn.net/v_JULY_v/article/details/6279498

65、php 行程模型,php 怎么支持多個并發
守護行程模型(需要知道 php-fpm 的各種配置了)

參考:https://www.jianshu.com/p/542935a3bfa8

66、nginx 的行程模型,怎么支持多個并發
這個三言兩語說不清楚,

參考:https://www.zhihu.com/question/22062795

67、php-fpm 各配置含義,fpm 的 daemonize 模式

php-fpm 的配置并不多,常用的就更少了,

參考:http://www.4wei.cn/archives/1002061

static - 子行程的數量是固定的(pm.max_children)
ondemand - 行程在有需求時才產生(當請求時,與 dynamic 相反,pm.start_servers 在服務啟動時即啟動
dynamic - 子行程的數量在下面配置的基礎上動態設定:pm.max_children,pm.start_servers,pm.min_spare_servers,pm.max_spare_servers

68、讓你實作一個簡單的架構,并保持高可用,兩個介面,一個上傳一條文本,一個獲取上傳的內容,你怎么來設計?要避免單機房故障,同時要讓代碼層面無感,
參考:分布式架構設計必備 CAP 原理,

69、兩臺 mysql 服務器,其中一臺掛了,怎么讓業務端無感切換,并保證正常情況下講臺服務器的資料是一致的
不是核心業務的話,先停寫,把備機拉起來,查看兩臺機器的日志,進行資料補償,開寫,

如果是核心業務的話,現在所有的寫操作都在正常的狀態機器上,把好的這臺機器的備機拉起來,當主機,

以上全是應急操作,實際上資料庫的容災設計要復雜的多,

面試官要是問你,備機的資料不一致怎么辦,你要勇敢懟回去,你們每秒多少寫入操作,按照百萬級表,每秒 1000 的寫入效率,正常的設計是,分布在 2 臺機器上每臺 500,這個級別的資料同步,出現差異的概率 可以忽略不計的,有一臺出現問題,另一臺也可以抗住,

(正常的操作,還是先停寫,等資料一致,切換,開寫,我們公司搞這些切換都是在凌晨 4.00 左右,核心業務的每秒寫操作,只有十幾個,前后耽擱不到 20 秒),

70、http 協議具體的定義
這種題 有是很難回答的,太寬泛了,我們面試早就不問這種問題了,

參考:日本人寫的《圖解 HTTP》

71、什么是鎖,怎么解決鎖的問題
計算機原理學的,生產者消費者模型,銀行家模型,都可以解決鎖的問題,

72、rand 與 mt_rand 的區別
我實習的時候遇到這個坑,

說是 mt_rand 比 rand 快 4 倍,

在亂數區間不大的情況下并沒有很大的效率差距,但是出現重復數的幾率,rand 要比 mt_rand 高很多,

73、mysql 事務隔離是怎么實作的
通過各種行鎖表鎖,各種樂觀鎖悲觀鎖,排他鎖實作的呀,

74、mysql 的鎖怎么實作的

75、對稱加密和非對稱加密的方式
對稱加密:我們倆共用一個秘鑰,你加密,我解密,

非對稱加密:我給你一個公鑰,你加密完了,我還能有我的私鑰把密文解開,但是你沒有我的私鑰,

擴展:橢圓加密演算法,

76、10 瓶水,其中一瓶有毒,小白鼠喝完有毒的水之后,會在 24 小時后死亡,問:最少用幾只小白鼠可以在 24 小時后找到具體是哪一瓶水有毒,
四只

二進制問題,薛定諤的老鼠,

一只老鼠有兩個狀態,死活,對應 01,假設老鼠的個數為 A,則有 2^A>=10; A=4;

思路很簡單,十瓶藥編號:0,1,10,11….1001;

0 不喝,第一只老鼠喝所有個位是 1 的:13579,第二只喝十位是 1 的,第三只和百位是 1 的,第四只喝千位是 1 的,

24 小時后,看下死了的是 1,活著的是 0,按老鼠的順序乖乖站好…… 假如第一只和第三只死了,那就是 0101,就是 5 有問題,

77、redis 是如何進行同步的,同步的方式,同步回滾怎么辦,資料例外怎么辦,同時會問 MYSQL 的同步方式和相關例外情況
redis 集群主從同步的簡單原理

  Redis 的復制功能是基于記憶體快照的持久化策略基礎上的,也就是說無論你的持久化策略選擇的是什么,只要用到了 Redis 的復制功能,就一定會有記憶體快照發生,

  當 Slave 啟動并連接到 Master 之后,它將主動發送一個 SYNC 命令 (首先 Master 會啟動一個后臺行程,將資料快照保存到檔案中 [rdb 檔案] Master 會給 Slave 發送一個

Ping 命令來判斷 Slave 的存活狀態 當存活時 Master 會將資料檔案發送給 Slave 并將所有寫命令發送到 Slave ),

  Slave 首先會將資料檔案保存到本地 之后再將 資料 加載到記憶體中,

  當第一次鏈接 或者是 故障后 重新連接 都會先判斷 Slave 的存活狀態 在做全部資料的同步 , 之后只會同步 Master 的寫操作 (將命令發送給 Slave)

問題:

  當 Master 同步資料時 若資料量較大 而 Master 本身只會啟用一個后臺行程 來對多個 Slave 進行同步 , 這樣 Master 就會壓力過大 , 而且 Slave 恢復的時間也會很慢!

redis 主從復制的優點:

(1)在一個Redis集群中,master負責寫請求,slave負責讀請求,這么做一方面通過將讀請求分散到其他機器從而大大減少了master服務器的壓力,另一方面slave專注于提供
讀服務從而提高了回應和讀取速度,

  (2) 在一個 Redis 集群中,如果 master 宕機,slave 可以介入并取代 master 的位置,因此對于整個 Redis 服務來說不至于提供不了服務,這樣使得整個 Redis 服務足夠安全,

  (3) 水平增加 Slave 機器可以提高性能

78、怎么解決跨域
JSONP
添加回應頭,允許跨域
代理的方式

79、json 和 xml 區別,各有什么優缺點
(1)可讀性方面:基本相同,XML 的可讀性比較好;

(2)可擴展性方面:都具有良好的擴展性;

(3)編碼難度方面:相對而言,JSON 的編碼比較容易;

(4)解碼難度:JSON 的解碼難度基本為零,XML 需要考慮子節點和父節點;

(5)資料體積方面:JSON 相對于 XML 來講,資料體積小,傳遞的速度比較快;

(6)資料互動方面:JSON 與 javascript 的互動更加方便,更容易決議處理,更好的資料互動;

(7)資料描述方面:XML 對資料描述性比較好;

(8)傳輸速度方面:JSON 的速度遠遠快于 XML,

80、Trait 優先級
在 trait 繼承中,優先順序依次是:來自當前類的成員覆寫了 trait 的方法,而 trait 則覆寫了被繼承的方法

81、a 參考 b,報錯 c 里面類重復定義,回圈參考會出現什么問題

82、下面員工 3 的薪水大于其主管的薪水,一條 SQL 找到薪水比下屬低的主管

id    username    salary  pid
1    a   3000    null
2    b   8000    null
3    c   5000    1
4    d   6000    3
SELECT a.*, b.*
FROM `user` as a
LEFT JOIN `user` as b ON a.pid = b.id AND a.salary > b.salary
WHERE b.id > 0;

82、在一個坐標系內有一個 N 個點組成的多邊形,現在有一個坐標點,寫代碼或思路來判斷這個點是否處于多邊形內

83、資料庫如果出現了死鎖,你怎么排查,怎么判斷出現了死鎖?

84、寫一個一個程式來查找最長子串

85、分析一個問題:php-fpm 的日志正常,但客戶端卻超時了,你認為可能是哪里出了問題,怎么排查?
檢查 nginx log,請求是否達到 nginx 和是否正常轉發給 php-fpm

86、nginx 的作業流程是什么樣的,可以畫圖描述

87、行程間通信方式有哪些
1) 管道
管道分為有名管道和無名管道
無名管道是一種半雙工的通信方式,資料只能單向流動,而且只能在具有親緣關系的行程間使用,行程的親緣關系一般指的是父子關系,無明管道一般用于兩個不同行程之間的通信,當一個行程創建了一個管道,并呼叫 fork 創建自己的一個子行程后,父行程關閉讀管道端,子行程關閉寫管道端,這樣提供了兩個行程之間資料流動的一種方式,
有名管道也是一種半雙工的通信方式,但是它允許無親緣關系行程間的通信,

2) 信號量
信號量是一個計數器,可以用來控制多個執行緒對共享資源的訪問., 它不是用于交換大批資料,而用于多執行緒之間的同步,它常作為一種鎖機制,防止某行程在訪問資源時其它行程也訪問該資源,因此,主要作為行程間以及同一個行程內不同執行緒之間的同步手段.

3) 信號
信號是一種比較復雜的通信方式,用于通知接收行程某個事件已經發生.

4) 訊息佇列
訊息佇列是訊息的鏈表,存放在內核中并由訊息佇列識別符號標識,訊息佇列克服了信號傳遞資訊少,管道只能承載無格式位元組流以及緩沖區大小受限等特點,訊息佇列是 UNIX 下不同行程之間可實作共享資源的一種機制,UNIX 允許不同行程將格式化的資料流以訊息佇列形式發送給任意行程,對訊息佇列具有操作權限的行程都可以使用 msget 完成對訊息佇列的操作控制,通過使用訊息型別,行程可以按任何順序讀資訊,或為訊息安排優先級順序.

5) 共享記憶體
共享記憶體就是映射一段能被其他行程所訪問的記憶體,這段共享記憶體由一個行程創建,但多個行程都可以訪問,共享記憶體是最快的 IPC (行程間通信) 方式,它是針對其它行程間通信方式運行效率低而專門設計的,它往往與其他通信機制,如信號量,配合使用,來實作行程間的同步與通信.

6) 套接字:可用于不同及其間的行程通信

88、主從復制,從服務器會讀取到主服務器正在回滾的資料嗎?主資料庫寫成功,從服務器因為一些原因寫失敗,最后會出現什么情況?主從復制如果鍵沖突怎么辦?
不會;主從資料不一致;正常是不會出現這種情景,具體看情況,是否可以修復,恢復到之前的時間點,然后追回同步,

89、事務有幾種隔離級別?事務的隔離級別是怎么實作的?

讀未提交(read-uncommitted)
不可重復讀(read-committed)
可重復讀(repeatable-read)
串行化(serializable)

90、什么是 B + 樹,請畫 b + 樹的結構

91、mysql 中的字符集,客戶端與資料庫不一致,怎么辦?MYSQL 中字串到顯示到界面,字符轉換的程序是怎樣的?資料庫中的字符集是 latin1, 你現在將 utf8 的字串存到 latin1 字符集的資料庫表,你能將 utf8 的字串存進去嗎?假如你說能存,追問:能否恢復?假如能,那怎么恢復?

92、

寫一段代碼,找到所有子集合,如 [a,b,c] 的子集合有 {},{a},{b},{c},{ab},{ac},{abc}

93、

['a'=>200,'b'=>100,'c'=>100], 寫一個自定義排序函式,按值降序,如果值一樣,按鍵排序
冒泡排序

94、設計一個快取系統,可以定期或空間占滿之后自動洗掉長期不用的資料,不能使用用遍歷,
我當時的答案是用鏈表來存,快取命中就將該快取移到鏈表頭,然后鏈表尾就都是冷資料了,
我記得之前是在哪里看過這個設計,但我忘記在連接了,請知道朋友的把連接貼上來,

95、

== 和 === 的區別,寫出以下輸出:"aa"==1,"bb"==0,1=="1"
== 等于,不需要對比資料型別
=== 全等,需要對比型別
false, true, true

96、一個排序好的陣列,將它從中間任意一個位置切分成兩個陣列,然后交換它們的位置并合并,合并后新陣列元素如:20,21,22,25,30,1,2,3,5,6,7,8,15,18,19, 寫一個查詢函式來查找某個值是否存在,

97、設計一個樹形結構,再寫一個函式對它進行層序遍歷

98、

'$var' 和 "$var" 的區別
雙引號串中的內容可以被解釋而且替換,而單引號串中的內容總被認為是普通字符,

在單引號串中甚至反斜杠也失去了他的擴展含義(除了插入反斜杠 \ 和插入單引號 \'),所以,當你想在字串中進行變數代換和包 含 \n(換行符)等轉義序列時,你應該使用雙引號,單引號串可以用在其他任何地方,腳本中使用單引號串處理速度會更快些,

99、self 和 static 的區別
static:如果在子類中重寫了父類中的 static 方法、屬性,父類就會去訪問了子類的 static 方法

self: 是類內指標,不管子類有沒有重寫過父類中的方法、屬性都指向本類的靜態方法、屬性
100、PHP 的協程以及用途

101、描述 autoload 的機制

102、mysql 中欄位型別各占幾個位元組:smallint、int、bigint、datetime、varchar (8)

smallint 2 位元組
int 4 位元組
bigint 8 位元組
datetime 8 位元組
varchar (8) 8*3 位元組

103、哪些屬性唯一確定一條 TCP 連接

104、myisam 和 innodb 的區別,為什么 myisam 比 innodb 快,myisam 和 innodb 的索引資料結構是什么樣的?innodb 主鍵索引和非主鍵索引的區別?其索引上存放的資料是什么樣的?
區別主要在資料和索引的存盤結構和存盤方式上,以及對于事務的支持,

105、斷開 TCP 連接時,timewait 狀態會出現在發起分手的一端還是被分手的一端
為什么建立 TCP 連接需要三次握手?
原因:為了應對網路中存在的延遲的重復陣列的問題
例子:
假設 client 發起連接的連接請求報文段在網路中沒有丟失,而是在某個網路節點長時間滯留了,導致延遲到達 server,本來這是一個已經失效的連接報文,但是 server 接收到這個連接報文之后,誤認為 client 發起了新的連接,于是向 client 發送確認報文段,此時因為沒有了連接的 3 次握手,client 不會對 server 的確認報文作出回應,也不會向 server 發送資料,server 就以為連接已經建立,一直在空等 client 的資料,這樣 server 的這一部分網路資源就被浪費了,

為什么斷開 TCP 連接需要進行四次握手 ?
因為 TCP 連接是全雙工的網路協議,允許同時通信的雙方同時進行資料的收發,同樣也允許收發兩個方向的連接被獨立關閉,以避免 client 資料發送完畢,向 server 發送 FIN 關閉連接,而 server 還有發送到 client 的資料沒有發送完畢的情況,所以關閉 TCP 連接需要進行四次握手,每次關閉一個方向上的連接需要 FIN 和 ACK 兩次握手,

TIME_WAIT 狀態的意義

在 TCP 連接中,當被動關閉連接的一方 (圖中 client) 發送的 FIN 報文到達時,被動關閉連接的一方會發送 ACK 確認報文,并且進入 TIME_WAIT 狀態,并且等待 2MSL 時間段 (MSL:maximum segment life),這么做有下述兩個原因:

被動關閉連接的一方 (圖中的 server) 在一段時間內沒有收到對方的 ACK 確認資料包,會重新發送 FIN 資料包,因而主動關閉連接的一方需要停留在等待狀態以處理對方重新發送的 FIN 資料包,否則他會回應一個 RST 資料包給被動關閉連接的一方,使得對方莫名其妙,

在 TIME_WAIT 狀態下,不允許應用程式在當前 ip 和埠上和之前通信的 client (這個 client 的 ip 和埠號不變) 建立一個新的連接,這樣就能避免新的連接收到之前的 ip 和埠一致的連接殘存在網路中的資料包,這也是 TIME_WAIT 狀態的等待時間被設定為 2MSL 的原因,以確保網路上當前連接兩個方向上尚未接收的 TCP 報文已經全部消失,

106、AWK 各種資料分析考得非常多,要多練習,題目不再一一寫了

107、redis 中集合、有序集合、hyperLog、hash 的資料結構是啥樣的
key value

108、描述一下:一個請求到達 nginx 的全部處理程序(nginx 自身會呼叫哪些邏輯)、然后怎么與 php 通信,中間的流程是什么樣的等等?

109、nginx 和 php-fpm 的相關配置,隨便問里面各種引數啥意思
php-fpm 可以通過 tcp socket 和 unix socket 兩種方式實作,

110、假如有一張地圖,如下圖,"-" 代表海洋、"+" 代表陸地,用你最擅長的方式,取出陸地的坐標,

--++----++--+++---
-++++----+++++++--
-+++----++++------
-----++------++++-
---++++++-----+++-
-----+++------+++-
比如上圖在陣列中表示成,1 表示成陸地,0 表示海洋:

[
    [0,0,1,1,0,0,0,1,1....],
    [0,1,1,1.....],
]
寫個演算法取出所有陸地的坐標,并按塊放到一起,如地圖上左上角第一個陸地的坐標是:

[
    [0,2],[0,3],
    [1,1],[1,2],[1,3],[1,4],
    [2,1],[2,2],[2,3]
]

111、Jsonp 的實作原理,你還知道哪些跨域方式?
JSONP
添加回應頭,允許跨域
代理的方式

112、如果某個博客通過判斷 referer 方式來進行圖片防盜鏈,如何破解?
curl 設定來源地址來欺騙對方服務器驗證

113、簡述 mysql 查詢優化的本質,并舉 2 個例子
114、設計一個秒殺系統,如何保證商品不超賣?

115、單例模式的優點是什么?抽象類是什么?還了解哪些設計模式?
單例模式又稱為職責模式,它用來在程式中創建一個單一功能的訪問點,通俗地說就是實體化出來的物件是唯一的,
所有的單例模式至少擁有以下三種公共元素:

它們必須擁有一個建構式,并且必須被標記為 private
它們擁有一個保存類的實體的靜態成員變數
它們擁有一個訪問這個實體的公共的靜態方法
單例類不能再其它類中直接實體化,只能被其自身實體化,它不會創建實體副本,而是會向單例類內部存盤的實體回傳一個參考,
抽象的類不能被實體化,任何一個類,如果它里面至少有一個方法是被宣告為抽象的,那么這個類就必須被宣告為抽象的,被定義為抽象的方法只是宣告了其呼叫方式(引數),不能定義其具體的功能實作,

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

標籤:PHP

上一篇:tp5.1 根據IP地址獲取用戶所在省市(個人筆記)

下一篇:PHP 格式化顯示時間 date() 函式【轉】

標籤雲
其他(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