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、二叉樹前中后遍歷代碼
- 層序遍歷
- 先序遍歷
- 中序遍歷
- 后序遍歷
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
