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
它們擁有一個保存類的實例的靜態成員變量
它們擁有一個訪問這個實例的公共的靜態方法
單例類不能再其它類中直接實例化,只能被其自身實例化。它不會創建實例副本,而是會向單例類內部存儲的實例返回一個引用。
抽象的類不能被實例化。任何一個類,如果它里面至少有一個方法是被聲明為抽象的,那么這個類就必須被聲明為抽象的。被定義為抽象的方法只是聲明了其調用方式(參數),不能定義其具體的功能實現。