PHP高級工程面試題匯總(2018.05)
1、給你四個坐標點,判斷它們能不能組成一個矩形,如判斷([0,0],[0,1],[1,1],[1,0])能組成一個矩形。
勾股定理,矩形是對角線相等的四邊形。只要任意三點不在一條直線上,任選一點,求這一點到另外三點的長度的平方,兩個短的之和如果等於最長的,那么這就是矩形。
2、寫一段代碼判斷單向鏈表中有沒有形成環,如果形成環,請找出環的入口處,即P點
/* *單鏈表的結點類 */ class LNode{ //為了簡化訪問單鏈表,結點中的數據項的訪問權限都設為public public int data; public LNode next; } class LinkListUtli { //當單鏈表中沒有環時返回null,有環時返回環的入口結點 public static LNode searchEntranceNode(LNode L) { LNode slow=L;//p表示從頭結點開始每次往后走一步的指針 LNode fast=L;//q表示從頭結點開始每次往后走兩步的指針 while(fast !=null && fast.next !=null) { if(slow==fast) break;//p與q相等,單鏈表有環 slow=slow.next; fast=fast.next.next; } if(fast==null || fast.next==null) return null; // 重新遍歷,尋找環的入口點 slow=L; while(slow!=fast) { slow=slow.next; fast=fast.next; } return slow; } }
3、寫一個函數,獲取一篇文章內容中的全部圖片,並下載
function download_images($article_url = '', $image_path = 'tmp'){ // 獲取文章類容 $content = file_get_contents($article_url); // 利用正則表達式得到圖片鏈接 $reg_tag = '/<img.*?\"([^\"]*(jpg|bmp|jpeg|gif|png)).*?>/'; $ret = preg_match_all($reg_tag, $content, $match_result); $pic_url_array = array_unique($match_result1[1]); // 創建路徑 $dir = getcwd() . DIRECTORY_SEPARATOR .$image_path; mkdir(iconv("UTF-8", "GBK", $dir), 0777, true); foreach($pic_url_array as $pic_url){ // 獲取文件信息 $ch = curl_init($pic_url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_NOBODY, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE ); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE ); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $fileInfo = curl_exec($ch); $httpinfo = curl_getinfo($ch); curl_close($ch); // 獲取圖片文件后綴 $ext = strrchr($pic_url, '.'); $filename = $dir . '/' . uniqid() . $ext; // 保存圖片信息到文件 $local_file = fopen($filename, 'w'); if(false !== $local_file){ if( false !== fwrite($local_file, $filecontent) ){ fclose($local_file); } } } }
4、獲取當前客戶端的IP地址,並判斷是否在(111.111.111.111,222.222.222.222)
如果沒有使用代理服務器:
$ip = $_SERVER['REMOTE_ADDR'];
使用透明代理
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
參考文章
5、nginx的log_format配置如下:
log_format main ‘remoteaddr−remote_user [timelocal]"request”’ ‘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;
參考文章:
https://www.cnblogs.com/riasky/p/3367558.html
http://www.jb51.net/article/48801.htm
8、從撲克牌中隨機抽5張牌,判斷是不是一個順子,即這5張牌是連續的
這個問題有個關鍵點,撲克牌,1-13 不能再多了。這就很簡單了。用PHP來做,定義一個數組分別存着1到13,拿出一個,置空一個,最后看下 這五個置空的 是不是連續的。這種情況不考慮抽出的順序。
9、兩條相交的單向鏈表,如何求它們的第一個公共節點
思想:
- 如果兩個鏈表相交,則從相交點開始,后面的節點都相同,即最后一個節點肯定相同;
- 從頭到尾遍歷兩個鏈表,並記錄鏈表長度,當二者的尾節點不同,則二者肯定不相交;
- 尾節點相同,如果A長為LA,B為LB,如果LA>LB,則A前LA-LB個先跳過
如果兩個單向鏈表有公共的結點,也就是說兩個鏈表從某一結點開始,它們的m_pNext都指向同一個結點。但由於是單向鏈表的結點,每個結點只有一個m_pNext,因此從第一個公共結點開始,之后它們所有結點都是重合的,不可能再出現分叉。所以,兩個有公共結點而部分重合的鏈表,拓撲形狀看起來像一個Y,而不可能像X。
參考文獻:
https://blog.csdn.net/wcyoot/article/details/6426436
https://blog.csdn.net/Lieacui/article/details/52046548
10、最長公共子序列問題LCS,如有[1,2,5,11,32,15,77]和[99,32,15,5,1,77]兩個數組,找到它們共同都擁有的數,寫出時間復雜度最優的代碼,不能用array_intersect(這里有坑,需要去研究一下動態規划)。
11、linux的內存分配和多線程原理
12、MYSQL中主鍵與唯一索引的區別
主鍵:絕對不能有空值。唯一索引:可以有空值
參考:https://www.cnblogs.com/lonelyxmas/p/4594624.html
13、http與https的主要區別
關鍵是S上。簡而言之,https建立連接后要先把SSL的證書發下去,有了公鑰和私鑰,就可以解密了。
參考:https://www.cnblogs.com/zyl-Tara/p/7079696.html
14、http狀態碼及其含意
- 200 請求已成功,請求所希望的響應頭或數據體將隨此響應返回。
- 301 被請求的資源已永久移動到新位置。
- 302 請求的資源現在臨時從不同的 URI 響應請求。
- 400 1、語義有誤,當前請求無法被服務器理解。2、請求參數有誤。
- 401 當前請求需要用戶驗證。
- 403 服務器已經理解請求,但是拒絕執行它。
- 404 請求失敗,請求所希望得到的資源未被在服務器上發現。
- 500 服務器遇到了一個未曾預料的狀況,無法完成對請求的處理,會在程序碼出錯時出現。
- 501 服務器不支持當前請求所需要的某個功能。無法識別請求的方法。
- 502 作為網關或者代理工作的服務器嘗試執行請求時,從上游服務器接收到無效的響應。
- 503 由於臨時的服務器維護或者過載,服務器當前無法處理請求。
參考:http://tool.oschina.net/commons?type=5
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實現。
參考:https://cloud.tencent.com/developer/article/1004367
19、數據庫中的事務是什么?
事務(transaction)是作為一個單元的一組有序的數據庫操作。如果組中的所有操作都成功,則認為事務成功,即使只有一個操作失敗,事務也不成功。如果所有操作完成,
事務則提交,其修改將作用於所有其他數據庫進程。如果一個操作失敗,則事務將回滾,該事務所有操作的影響都將取消。
20、寫一個函數,盡可能高效的從一個標准URL中取出文件的擴展名
會 寫正則最好。我反正不會正則,需要用的時候就百度。
21、參數為多個日期時間的數組,返回離當前時間最近的那個時間
遍歷數組,求當前時間差,和第一個進行對比,小於第一個交換位置。最后取第一個即可。
22、echo、print、print_r的區別
這三個放在一起,回答的點在於,print_r是函數,echo、print是結構語言。
至於他們具體的區別參考:https://www.cnblogs.com/xiaotaoing/p/6687368.html
23、http協議的header中有哪些key及含義
這個問題,很難。一會半會說不清楚。如果做過PHP restful 接口開發,也踩過這里面的坑,那應該是可以答出來常用的幾個KEY的。
參考:https://blog.csdn.net/u014175572/article/details/54861813
24、二叉樹前中后遍歷代碼
1.層序遍歷
2.先序遍歷
3.中序遍歷
4.后序遍歷
參考:https://blog.csdn.net/wk199351/article/details/65936001
25、PHP的數組和C語言的數組結構上有何區別?
但從PHP來講,考的是PHP數組的實現。可以簡單的認為,PHP的數組是hash桶+十字鏈表(實際上是數列Array,列表List,散列表/關聯數組/字典Hashtable的聚合體)。優點是查詢效率很高,遍歷很方便,缺點是,占內存較多。(還是空間換時間的思路,畢竟現在內存又不值錢)
C語言的數組,就是定長定類型的數列。
26、Redis的跳躍表怎么實現的
跳躍表(skiplist)是一種有序數據結構,它通過在每個節點中維持多個指向其他節點的指針,從而達到快速訪問節點的目的。
參考:https://blog.csdn.net/universe_ant/article/details/51134020
27、哈希是什么?hash沖突后,數據怎么存?
28、聚簇索引,聚集索引的區別?
29、B+Tree是怎么進行搜索的
30、數組和hash的區別是什么?
31、寫個函數,判斷下面擴號是否閉合,左右對稱即為閉合: ((())),)(()),(()))),(((((()),(()()),()()
32、 找出數組中不重復的值[1,2,3,3,2,1,5]
用普通方法,肯定很容易的。
33、32題你的時間復雜度是多少?有的情況下,你寫了個算法,然后面試官會讓你把你的算法的時間復雜度表達式寫出來
34、PHP的的這種弱類型變量是怎么實現的?
考zval的,PHP的八種類型,本質只有一個結構。
參考:https://blog.csdn.net/ohmygirl/article/details/41542445
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兩個路徑
典型的二叉搜索樹。大學數據結構的基礎題。
參考:https://blog.csdn.net/BaiHuaXiu123/article/details/52488443
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引擎的區別
區別主要在數據和索引的存儲結構和存儲方式上,以及對於事務的支持。
參考:https://blog.csdn.net/chajinglong/article/details/56666771
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索引差別還是很大的
參考:http://www.jb51.net/article/38593.htm
50、$a=[1,2,3]; foreach($a as &$v){} foreach($a as $v){} var_dump($a)等於多少;
122
此處有一坑。foreach 完之后,$index , $value 並不會消失保留最后一次賦值。
這里的第一次foreach之后,數組中最后一個元素變成引用,引用變量 $v 繼續存在且指向數組的最后一個元素。第二次遍歷,因為遍歷變量名是 $v , 所以等於說每次遍歷都將此次遍歷的值修改成最后元素的值,直至到遍歷最后一個元素(引用元素),因為此時數組的最后一個元素已被修改成上一個元素的值,最后一次賦值就是 自己==自己。 故最后一個等於倒數第二個
https://laravel-china.org/articles/7001/php-ray-foreach-and-references-thunder
51、數據庫中的存放了用戶ID,扣費很多行,redis中存放的是用戶的錢包,現在要寫一個腳本,將數據庫中的扣費記錄同步到redis中,每5分鍾執行一次。請問要考慮哪些問題?
思路:生產者和消費者模式。這個問題也沒有說其他的狀態,比如數據庫的數據會實時增加么?redis中每個錢包是否有其他服務在讀取或者寫入啊。什么的。數據庫和REDIS放一起,要么考數據一致性,要么考出現鎖,導致效率降低。
52、MYSQL主從服務器,如果主服務器是innodb引擎,從服務器是myisam引擎,在實際應用中,會遇到什么問題?
不知道,沒用過,為什么這么設計?故意給自己找不愉快?
53、linux中進程信號有哪些?
kill -l 很少用
54、redis的底層實現
面試官這么樣問你,你就反問他,你要的底層實現是字段的設計?內存分配管理?網絡模型?數據同步?還是分布式的實現?(TIPS:面試就是兩個人的博弈。面試官給出一個描述不清晰的問題,我們沒必要回答。讓他把問題講清楚再思考怎么回復)
參考:https://cloud.tencent.com/developer/article/1004377
這篇文章 要多讀幾遍。
55、異步模型
問清楚是IO異步模型。還是AJAX這類的異步請求模型。差別非常大的。
參考:https://cloud.tencent.com/developer/article/1005481
狗東某風控研發必考題。
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
參考:https://blog.csdn.net/dong_007_007/article/details/78330337
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的鎖怎么實現的
https://blog.csdn.net/alexdamiao/article/details/52049993
https://www.cnblogs.com/luyucheng/p/6297752.html
https://blog.csdn.net/tangkund3218/article/details/47704527
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機器可以提高性能
參考:
- https://blog.csdn.net/hxpjava1/article/details/78347890/
- https://www.cnblogs.com/zhao-blog/p/6131524.html
78、怎么解決跨域
- JSONP
- 添加響應頭,允許跨域
- 代理的方式
79、json和xml區別,各有什么優缺點
(1)可讀性方面:基本相同,XML的可讀性比較好;
(2)可擴展性方面:都具有良好的擴展性;
(3)編碼難度方面:相對而言,JSON的編碼比較容易;
(4)解碼難度:JSON的解碼難度基本為零,XML需要考慮子節點和父節點;
(5)數據體積方面:JSON相對於XML來講,數據體積小,傳遞的速度比較快;
(6)數據交互方面:JSON與javascript的交互更加方便,更容易解析處理,更好的數據交互;
(7)數據描述方面:XML對數據描述性比較好;
(8)傳輸速度方面:JSON的速度遠遠快於XML。
參考:https://blog.csdn.net/java19880223/article/details/20054111
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、數據庫如果出現了死鎖,你怎么排查,怎么判斷出現了死鎖?
https://www.cnblogs.com/huanyou/p/5775965.html
84、寫一個一個程序來查找最長子串
http://www.jb51.net/article/128449.htm
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)
https://www.cnblogs.com/huanongying/p/7021555.html
90、什么是B+樹,請畫b+樹的結構
https://blog.csdn.net/qq_23217629/article/details/52510485
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的協程以及用途
http://www.laruence.com/2015/05/28/3038.html
https://blog.csdn.net/gavin_new/article/details/54603490
101、描述autoload的機制
https://blog.csdn.net/zhihua_w/article/details/52723402
102、mysql中字段類型各占幾個字節:smallint、int、bigint、datetime、varchar(8)
- smallint 2字節
- int 4字節
- bigint 8字節
- datetime 8字節
- varchar(8) 8*3字節
http://www.jb51.net/article/55853.htm
103、哪些屬性唯一確定一條TCP連接
104、myisam和innodb的區別,為什么myisam比innodb快,myisam和innodb的索引數據結構是什么樣的?innodb主鍵索引和非主鍵索引的區別?其索引上存放的數據是什么樣的?
區別主要在數據和索引的存儲結構和存儲方式上,以及對於事務的支持。
參考:https://blog.csdn.net/chajinglong/article/details/56666771
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報文已經全部消失。
https://www.cnblogs.com/zhoudayang/p/6012257.html
106、AWK各種數據分析考得非常多,要多練習,題目不再一一寫了
107、redis中集合、有序集合、hyperLog、hash的數據結構是啥樣的
key value
108、描述一下:一個請求到達nginx的全部處理過程(nginx自身會調用哪些邏輯)、然后怎么與php通信,中間的流程是什么樣的等等?
https://www.jianshu.com/p/df89b530db89
https://blog.csdn.net/xiajun07061225/article/details/9309273
109、nginx和php-fpm的相關配置,隨便問里面各種參數啥意思
php-fpm可以通過tcp socket和unix socket兩種方式實現。
https://blog.csdn.net/koastal/article/details/52303316
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、設計一個秒殺系統,如何保證商品不超賣?
https://blog.csdn.net/zhoudaxia/article/details/38067003
115、單例模式的優點是什么?抽象類是什么? 還了解哪些設計模式?
單例模式又稱為職責模式,它用來在程序中創建一個單一功能的訪問點,通俗地說就是實例化出來的對象是唯一的。
所有的單例模式至少擁有以下三種公共元素:
- 它們必須擁有一個構造函數,並且必須被標記為private
- 它們擁有一個保存類的實例的靜態成員變量
- 它們擁有一個訪問這個實例的公共的靜態方法
單例類不能再其它類中直接實例化,只能被其自身實例化。它不會創建實例副本,而是會向單例類內部存儲的實例返回一個引用。
抽象的類不能被實例化。任何一個類,如果它里面至少有一個方法是被聲明為抽象的,那么這個類就必須被聲明為抽象的。被定義為抽象的方法只是聲明了其調用方式(參數),不能定義其具體的功能實現。
https://www.cnblogs.com/kangxl/p/6347179.html
工廠模式
適配器模式
116、斗地主中,地主比農民得到王炸的概率多多少?
轉載:https://laravel-china.org/articles/20714
感覺挺有用,就支持小編啦,贊賞碼