[PHP]面試問題探討3

6. 面試的需求

6.1 JQuery 作了哪些事情?

答:JQuery 主要是對對javascript作了封裝,使得使用js開發更加高效。 更好的提升項目開發的效率。 主要的封裝有:javascript

  1. 搜索器的封裝。 更好的查找和定位節點元素。 如document.getElementbyid,
  2. 封裝了對ajax的請求,能夠直接使用$.ajax就能夠調用和處理ajax的事情
  3. 優化HTML文檔操做、事件處理、動畫設計和Ajax交互
  4. 也增長了都css過濾器的優化
  5. 對於ie,火狐,chrome瀏覽器的一些版本作了兼容
6.3 你使用了Weblogic主要作了哪些事情?

答:Weblogic 是java的服務器,其實咱們主要是使用weblogic進行系統的部署。 知足業務的開發須要。Weblogic 其實本質是servlet的容器,處理大量的Request或者Response的HTTP請求。對servlet進行管理工做。 servlet的的管理週期通常是,建立,啓動,鏈接,銷燬的過程。 WebLogic是美國Oracle公司出品的一個application server。 金融公司比較多使用weblogic主要也是考慮其穩定性和可擴展性。 而且對javaee的大量標準是支持的。 如ejb,servlet/jspphp

6.5 你說下對beanstalkd 理解?

答:beanstalkd 是facebook開源的一款基於內存的輕量級的消息處理的中間件。咱們在項目中的使用場景是處理同步lifetime的廣告同步數據,這部分數據量比較多,而且對實時性要求不是很高。 因此咱們會專門的消息隊列來進行處理。 Beanstalkd 的原理機制是,採用channel的方式,生成者把消息放入channel中,而消費者能夠進行關注和訂閱channel,而且能夠設置消息的優先級。 這樣就可構建起生成者和消費的消息隊列。 以前facebook用於該消息中間件處理950w用戶的應用服務。css

6.6 你說下你理解的logstash的實現機制?查看

答:logstash 是一個很是優秀的日誌採集組件。 咱們的使用場景是將不一樣服務器的nginx 報錯日誌經過logstash 統一採集,而且寫入到數據庫中。 logstash 的實現機制是採集增量的獲取日誌信息,而且能夠設置必定的規則條件,把這些日誌信息加載到內存中進行過濾和篩選處理,而後能夠輸出制定的格式,而且也提供相應的接口。 咱們是使用mysql的數據庫進行處理。html

6.7 你說下你理解的Redshift機制?

答: Redshift是亞馬遜很是優秀的列式存儲的數據庫。 它對於大數據的查詢和存儲都提供了很是好的性能。 尤爲是對於大表直接的關聯索引性能很是好。 Redshift 處理大表的機制主要是把大表直接的執行解析成SQL語法樹,而根據語法樹木生成大量的執行任務。 而Redshift的執行器自己是分佈式機制。能夠把任務分配給不一樣的節點,而不一樣的計算後的統一結果彙總進行計算。 因此Redshift也是很是耗費內存的處理。 可是執行的效率很是的高。前端

Redshift能夠輕鬆自動執行大多數常規管理任務,以管理、監控和擴展數據倉庫。經過處理全部這些耗時耗力的任務,Amazon Redshift 使您獲得瞭解脫並專一於您的數據和業務。java

6.9 說下php幾個大版本的改動狀況? PHP/Mysql中幾個版本的進化史,好比mysql4.0到4.1,PHP 4.x到5.1的重大改進等等。查看

答: PHP 4.x這個版本以前沒有使用到,我使用的早期版本是php5.2.x, 使用了glob來查找全局類文件的過濾,在5.4中安全模式和一些python

  • 5.3 :支持命名空間,static 引用當前的類,支持了匿名函數,增長了魔術方法,__call,__invoke, 支持heredoc 文檔模式,三目運算符省略中間的
  • 5.4 : 新增了Traits,新增短數組語法,新增支持對函數返回數組的成員訪問解析,內置開發的CLI的web server模式,新增實例化時,訪問類成員,新增了動態訪問靜態方法的方式,session提供了上傳進度支持,json更懂中文,默認的字符集改爲了utf-8
  • 5.5 :新增finally, empty 支持傳入一個任意表達式,而不只僅是一個變量,直接經過下標訪問數組和元素,新增array列的方式,能夠直接讀取列的信息(這個很重要)
  • 5.6 : 使用... 變長參數函數,支持use function 以及 use const ,能夠在內中導入外面的函數或者變量

Mysql 的版本特性變化mysql

  • 5.5 :innoDB做爲默認存儲引擎,支持版同步複製,主庫寫入binlog,從庫不必定可以被讀取
  • 5.6 innoDB支持全文索引,也使用是倒排序的社交,分詞完成後,詞彙將會存儲在獨立的索引表中。對進行分詞,同時先將分詞結果進入內存緩存,以後再刷入索引表中,避免一次寫入帶來大量的附加小規模的更改操做。 多線程複製,會對每一個數據庫開啓獨立的複製線程,對主從同步延遲有必定的改善,加入了GTID,能夠在方便宕機重啓後,進行位置的指向,這樣能夠自動恢復。
  • 5.7 innoDB 進一步加強,系統表默認仍是採用innoDB存儲引擎的表。 支持多源複製,能夠支持多個主庫的數據歸併到一個從庫的實例中。 而同步的機制主要採用channel的方式。 json的數據格式會支持,默認會把字符集改爲utf8mb4;對於安全這一塊增長了初始化安全工具。 innodb_buffer_pool_size能夠在線調整不須要重啓mysql.
  • 8.0 : 用戶角色的功能;加強了innoDB而且對於死鎖進行檢測,而且針對高併發來動態調整,提升特性,json的完善。
6.10 PHP的一些特性的介紹
6.10.1 HEREDOC介紹 是什麼東西,怎麼來使用?怎麼來實現的

答:HEARDOC其就是一個代碼塊。 裏面會忽略單引號或者雙引號,可是不會忽略變量的值。 在解析代碼塊的時候進行判斷,把引號保留,對於變量進行替換解析。linux

6.10.2 一些編譯php時的configure參數

答:configure 是對php的一些配置,包括php的bin路徑,php.ini文件還有php的根目錄的配置。 這樣在編譯和執行php源碼或者擴展的時候能夠直接使用configure來操做。還有一些編譯的條件,如編譯內存的限制,使用的線程nginx

6.10.3 mysql 裏面的常見的數據類型默認最大的字節是怎麼樣的?如int,char,varchar,datetime,text

答:int :8字節, char :1字節, varchar : 可伸縮的定義大小,最大65535, datetime : text :65535(2的16次方) 固定的大小 mediumtext 2的24次方, longtext 2的32次方 timestamp : 自動存儲記錄修改時間 datetime: 日期時間 '2008-12-2 22:06:44'

6.10.4 posix和perl標準的正則表達式區別

兩種不一樣的標準規範,一種是IEEE(電氣電子協會一套),另一套是perl核心庫中支持的。

6.10.5 Safe_mode 打開後哪些地方受限

答:這個在php5.3進行移除了。 safe_mode 主要是避免一些重要對目錄或者對system可以操做的權限。 還有一些禁用的函數。

6.10.6 寫代碼來解決多進程/線程同時讀寫一個文件的問題。

答:若是產生死鎖。

$ppid = posix_getpid();
$pid = pcntl_fork();
if($pid == -1) //父進程
{
    exit("create sub process fail!");
}else if($pid >0)
{
    echo "My process id :".$pid;
    
}else{
    
    $cpid = posix_getpid();
    echo "my child process:".$cpid;
}

複製代碼
6.10.7 介紹xdebug,apc,eAccelerator,Xcache,Zend opt的使用經驗。

答:xdebug 是php的調試擴展工具,客戶端發送http請求/或者命令行的CLI請求,xdebug會監聽請求的socket的端口和請求的地址信息,而後檢查breakpoint,斷點的具體位置,而後解析加載到內存的塊的變量信息和方法區的信息。 而且顯示在IDE出來。 每一步執行都會從新把內存區的變量信息用IDE進行打印出來。

apc: php加速緩存,能夠把php的代碼的字節碼文件緩存起來,並能夠設定失效的時間,若是php的過時時間沒有到,則這個緩存沒有失效。 這樣能夠提高線上環境的性能。一樣的在開發環境很容易形成代碼執行無效的狀況。

eAccelerator : 也是加速緩存,跟進動態內容進行緩存的操做。 php加速器,優化和動態內容緩存,提升了php腳本的緩存性能,

Xcache :字節碼緩存機制。 這意味着他可以提升您服務器上的 PHP 性能. 他經過把編譯 PHP 後的數據緩衝到共享內存從而避免重複的編譯過程, 可以直接使用緩衝區已編譯的代碼從而提升速度. 一般可以提升您的頁面生成速率 2 到5 倍, 下降服務器負載.

6.10.8 寫出一種排序算法(原理),並說出優化它的方法。基本排序算法要會寫,時間複雜度要會推算, 主要是冒泡排序, 快速排序, 選擇排序.

答:常見的排序算法有多種:(對於最小值進行作標記,若是有比它更小的,就進行插入)

  • 冒泡(比大小,下沉) Q的二次方,
  • 插入排序(將排序的元素插入到已經排序的序號地方,而後進行比較)
  • 快速排序(Q(nlogn)): 每次排序都分出來最小的一組和最大的一組,直到遞歸完成全部組的大小拆分,後而後進行合併輸出。
6.10.9 請介紹Session的原理,大型網站中Session方面應注意什麼?

答:Session 是爲了解決http協議的無狀態的狀況提供的一種方案。 http有cookie,可是cookie存儲在本地,這樣很容易產生數據的丟失,這樣就須要一個存儲到服務器的東西,方便http進行請求的時候來識別該用戶是已經登陸了。 還在線的狀態。 Session 就是會話,就是保持到服務器,這樣每次請求的時候須要檢查這個會話是否存在,存在表示這個用戶已經登陸了。 不然用戶進行從新的登陸。

在大型網站中,session的產生會很是多,而且須要保證的session可靠。 通常會對session進行分佈式管理。 session應用的時候要主要設置session的過時時間和在一些不一樣的應用場景關閉或者登出的時候都可以關閉會話。 常見的方案有:

  1. 使用session的複製,把全部的session所有放入到一臺機器進行處理,經過replication的機制,把全部的session複製到不一樣的服務器進行處理。 保證全部的機器的session的一致。可是這樣會加劇每臺服務器的session的量,而且產生大量的冗餘,因此通常對於這種的方式採用。session集羣,而後統一對session服務器進行管理。可是這樣在必定程度上會有必定的性能影響。 不過這樣也能夠構建sso,單點登陸的機制。 保證全部用戶的受權登陸後,並驗證session是否正常OK了。
6.10.10 介紹一下常見的SSO

答: SSO就是單點登陸的機制。機制:子系統跳到統一的驗證服務器,對帳號和密碼驗證後會返回一個惟一標識碼和這個用戶的帳號,而後子系統會把這個標識碼和帳號進行存儲(session的存儲)。 若是用戶在子系統登出這回銷燬session,並通知sso服務器session key 過時。 用戶從新登陸後有能夠從新獲取session的信息。 用戶有了session key 或者叫ticket 就能夠到支持該平臺的全部應用進行登陸。 而全部的接入的系統也會優先查詢下這個用戶的ticket是否失效,是否存在。

6.10.11 一個10G的文件,裏面存放關鍵字, 但內存只有10M, 問如何實現統計, 出現關鍵字次數最高的前100個

答:這是典型了map reduce的思路。

  1. 申請10M的內存空間,用於存放map,key和value的數據。
  2. 打開文件把每一個關鍵加載到map和value計數中。 寫滿了10M的內存文件,寫入1個文件中,並清空內存,輸出時要按單詞的字典序排序。最後會生成1000個文件。 而後
  3. 遞歸的方式這樣把10G的文件讀取完成,而且把這些單詞按照字典的排序方式來處理。這樣能夠根據字典填充的內容合併成文件,而後把字典單詞加載到最大堆中。
  4. 維護一個大小爲100的最大堆,並按單詞出現次數來組織堆。掃描一遍歸併後的文件,留在堆中的單詞便是最高頻的100個單詞。 複雜度O(nlogn)
6.10.12 堆的算法

答: 堆分爲最大堆和最小堆的方式。 最大堆排序:左邊大於右邊, 父節點大於子節點。 因此每次從父節點進行比較,若是比它小就自動向下找,若是比它大就進行拆堆,當前的節點當作父節點,父節點變成左節點這樣遞歸來拆分。

最小堆排序:根節點的值最小。 最左邊的節點最大。 因此元素的查找從最左邊查找,直到查找到須要的節點元素。

6.10.13 http1.0與http1.1的區別

答: http1.0 和http1.1的區別。 http1.0 主要仍是創建鏈接。相對http1.1來講沒有緩存的處理。這樣會耗費大量的鏈接消耗。 http1.1還支持keepalive ,長鏈接機制。 除了上面的區別還增長了,host的域處理。

  • 支持了keep-alive的長鏈接機制,能夠大量的節省http請求的開銷
  • 支持了host主機,1.0 只支持一個綁定一個IP, 而1.1 支持IP地址的虛擬化,能夠一次性綁定多個IP字段的處理
  • 100 的狀態能夠節省寬帶,能夠在100的寬帶請求判斷是否須要請求body的數據。 大量的節省http請求數據的消耗。
  • 在1.0 基礎上添加了一些緩存的特性。 提升資源的複用效果。 當緩存對象的Age超過Expire時變爲stale對象
  • 1.1 增長了Chunked transfer-coding發送方將消息分割成若干個任意大小的數據塊,每一個數據塊在發送時都會附上塊的長度,最後用一個零長度的塊做爲消息結束的標誌。
6.11 linux 負載值是怎麼計算的?

答:uptime 或者top出現了負載值的狀況。 這個值的來源有1分鐘,5分鐘,15分鐘統計的結果。 這個負載值是進程在指定時間內等待的長度。 進程的隊列的條件(處於等待的狀態):

  1. 沒有等待I/O的操做
  2. 沒有主動進入等待的狀態。
  3. 它沒有中止。
6.12 ssh @todo
6.12.1 ssh 的通訊/實現機制是什麼

答:ssh 是安全的xshell機制,主要仍是方便遠程登陸,它是簡單來講採用SSL加密傳輸。它支持的通訊方式包括帳號和密碼進行socket的鏈接服務,也支持基於RSA非對稱加密的方式進行處理。 主要是創建服務器鏈接的機制。 ssh 安全協議支持兩種方式:

  1. 方式一,主要是經過帳號和密碼的方式來創建tcp的鏈接。 而這種鏈接多是會對全部傳輸的數據進行加密,可是這種方式可能會存在中間人的狀況。 就是你把請求的帳號和口令發送到中間人機器,而後中間人把這些帳號和密碼跟服務器進行通訊。 這樣會存在被竊取的風險。
  2. 方式二:針對方式一的中的中間人的問題,提供了基於非對稱算法的方式來解決以上的問題。 它解決的方式,先服務器根據用戶信息生成一對祕鑰,把公鑰放到服務器中。 客戶端先發送公鑰請求,跟服務端進行匹配,若是成功後,服務端會把公鑰加密的「質詢」發送給客戶端,客戶端使用本身的私鑰進行解密。 若是成功,就能夠完成正常的數據的通訊。 而在通訊過程當中,使用散列hash(sha1+sha2+md5)來保證傳輸的信息不可以串改的操做。

其實https是在這個ssh加密的方式上作了擴展,支持了第三簽名也就是CA. 而證書的頒發也是第三方請求後發送的。 瀏覽器對證書的可靠性進行驗證。 看是否來於合法的二級加密算法中。

6.12.2 ssh1.0和ssh2.x的區別

答:ssh1.x 在加密算法上存在一些漏洞,因此後期升級到ssh2,如今主要仍是使用ssh2來進行加密的操做。

6.13 gdb,strace,valgrind的基本使用
  • GDB是一個由GNU開源組織發佈的、UNIX/LINUX操做系統下的、基於命令行的、功能強大的程序調試工具
  • strace經常使用來跟蹤進程執行時的系統調用和所接收的信號。必須由用戶態模式切換至內核態模式,經過系統調用訪問硬件設備。
  • Valgrind是一套Linux下,開放源代碼(GPL V2)的仿真調試工具的集合。Valgrind由內核(core)以及基於內核的其餘調試工具組成。內核相似於一個框架(framework),它模擬了一個CPU環境,
6.14 session與cookie的區別及如何解決session的跨域共享. 查看

答:session 和cookie在以前的地方已經提到,這裏就再也不贅述。那如何解決session的跨域共享的問題呢? session的跨域共享能夠經過造成session的獨立服務器,這樣全部的session都由通用的服務器進行管理,或者構建出恆sso的單點登陸的驗證服務器來解決不一樣域名的訪問都是正常的。

最好的仍是由通用的受權中心進行驗證和管理session的登陸機制。

6.15 php的垃圾回收機制, php變量,數組 c源代碼如何實現.

答:PHP的垃圾回收機制是根據時間來處理的。 在php5.2版本的時候垃圾回收機制採用了引用計數器,這個計數器的思路很是簡單,對於應用的變量或對象都會記錄一次,當引用的計數器的數量爲0時就清理該對象的應用。 可是這種計數器的方式很容易產生不少計數器的堆積。 基於此,使用了IBM的一套算法進行改進,思路以下:

  1. 若是是計數器等於0的,仍是跟以前同樣
  2. 若是是計數器在減小,而且減小的頻率很是快,這樣的計數器放入高速緩衝區中。咱們能夠對計數器能夠分類,一類是更新頻率比較快的能夠做爲新生代,另一類是更新比較慢的,咱們叫年老代。這樣對於新生代是更換比較頻繁的,天然計數器的變量回收的要更快些。 當新生代的技術器緩存區不夠處理的時候,把一些年老代的計數器變量同步到新生代計數器中。
6.16 php運行模式有幾種,分別是什麼?

答: PHP 咱們經常使用的運行模式有這同樣一些:

  1. CLI , 命令行能夠訪問php的命令。
  2. 一種是經過http的方式,經過fastcgi 進行請求。
  3. 基於web的請求的模式,最後仍是轉換成cgi的模式
  4. cgi的請求模式。
  5. ISAPI(Internet Server Application Program Interface)這種模式使用的比較少。
6.17 如何實現跨域請求? 跨域的原理和機制? 查看

答:

6.18 在正式服務器上, 如何操做一個存儲大數據表上增長一個字段或添加索引或改變數據字段類型?

答:方法一:在從庫添加字段,而後切換成爲主庫。 方法二:創建一張臨時表,把表結構和索引複製。最後把增量的數據根據移過來。 方法三:停服更新

6.19 mysql 執行計劃分析三看, explain,profiling,optimizer_trace

答:explain 能夠顯示sql的索引狀況,顯示sql命中的統計數據,而optiwozer_trace能夠查看到每條sql執行和解析的過程,能夠方便sql執行的調試操做。這種的狀況對於複雜sql的組合操做仍是很是的重要的。

6.20 mysql分庫分表策略, 如何解決增表,減表問題?

答:分表和分庫主要是對業務的拆分,把一個大的業務體系不斷的拆分紅小的數據庫和不一樣的表。對於怎麼來拆分庫和拆分表,須要考慮場景。咱們拆分表主要是根據時間,也有根據用戶,時間,廣告帳號等條件來拆分的。 數據的拆分也是把核心庫和非核心庫拆分,這樣核心庫的io不會受到非核心庫的大量產生阻塞做用。

怎麼來解決增表和減表的操做。這個要看具體的場景。若是咱們以前在分表的時候創建的邏輯數據庫訪問層的話。那麼須要調整邏輯策略和數據庫的遷移。 舉個例子, 若是是根據時間來增長表,如每一年一個表,那麼要增長表的時候,能夠定時任務,提早建立兩張表結構,若是是要刪除表,那麼能夠把表進行歸檔。並廢棄表。

除了時間分表,還能夠基於用戶的ID來+時間來拆分,如2018年用戶ID後兩位是01做爲一張表,這樣一年就有100張表進行存儲。一張表能夠存儲1kw的時候,那麼這樣的分表策略能夠支持一年1億條數據的存儲。


6.21 一致性hash原理是什麼?

答:一致性hash算法是memcached集羣使用的算法結構方式,他使用的方式是採用hash映射的方式,把2的32次方的hash節點映射成memcached沛澤集羣。而且集羣的memcahe須要解決集羣中的問題。包括,單一性原則即便增長和刪除節點均可以共享到數據;,平衡的原則保證,還有就是負載的原則,保證不一樣節點分配的存儲的節點內容是負載是均衡的。

一致性hash能夠來解決這類的問題,主要的思路:不一樣的節點的增長和刪除hashkeyi會順時針的遷移。其實一致性的hash充當是一個邏輯的分配。hash對物理的節點創建了虛擬的複製節點,能夠訪問節點的有副本。若是節點掛掉了會把複製節點的內容進行順時針的遷移操做。

6.22 如何統計日誌文件中訪問次數最多的十個ip地址

答:這個須要使用liunx的命令操做。

6.23 進程與線程的區別

答: 線程是進程中的一部分,他們的本質都是操做系統的任務,不過線程的的開啓和關閉的資源消耗低於進程。一個進程能夠開啓多個線程進行處理。 相對來講,進程更加的穩定和高效。 進程有本身的地址空間和資源,進程之間是相互獨立的,而線程之間是能夠相互的訪問的,也能夠獲取進程的共享資源。線程之間能夠互相影響存在不穩定的狀況,檢測起來也比較麻煩。因此對資源消耗大的優化能夠採用線程,反之對於穩定性高的可使用進程來處理。

6.24 高併發,高流量狀況下,如何設計秒殺或搶紅包架構?

答:秒殺系統,這種場景隨處能夠見到。有春運搶票,搶紅包。 主要須要考慮的幾個點:

  1. 隊列的長度要多長,也就是說商品的長度,設置一個最大容許接受的隊列長度
  2. 對於超過的最大的商品隊列的給予提示
  3. 針對秒殺能夠設計單獨的服務器,不影響現有的服務器的狀況,後臺能夠針對併發請求的流量進行分流/負載均衡。
  4. 對於秒殺的用戶進行商品的鎖定,而後用戶能夠進入支付系統進行處理器。
  5. 這裏對於用戶的重複請求須要考慮咪等性的提交處理。放入到緩存中,若是重複提交則不去進行處理。
  6. 對於秒殺的咱們採用cap原則,保證數據的最終一致性,系統的高可用和數據進行分區。對於不一樣副本的數據同步咱們增長了消息通知重試的機制,對於沒有處理失敗的請求咱們會設置超時時間,並嘗試重試處理。
6.25 騰訊面試的要求
6.25.1 異步事件回調機制

答:PHP增長了跟js同樣的事件回掉機制。這樣的好處在於,代碼執行完成後,能夠經過回掉機制進行異步提交,不須要等待提升效率。 其實異步回掉機制機制主要是把回掉函數封裝成對象傳入,當知足條件後,就能夠直接調用其回掉機制的方法進行處理了。

而異步回掉機制機制最後仍是依賴於操做中系統中的異步事件的註冊,而後系統會檢查是否存在知足條件的事件,若是知足就直接調用這個事件進行處理。

6.25.2 REST架構 機制

答:RESTful是輕量級的http服務架構,它對http進行了封裝,支持輕量級的調用和處理。包括對get,post ,put ,delete的支持,而且還支持了統一資源的路由方式,能夠直接經過ID獲取對象的資源。使得http的請求更加簡單和方便。 restful把互聯網看成資源池,經過uri的資源能夠獲取任何的資源。restful其實把整個網站做爲軟件,restful就是一種資源表現轉換的一種架構風格。

6.25.3 模板引擎機制

答:模版引擎,咱們是處處可見,常見的html本質上就是一個前端渲染模版。而咱們討論的版本引擎更多的是動態語言或者自定義語言封裝的模版引擎。如PHP view,smarty ,vectoty,這些模版首先會制定本身的模版渲染語法,常見的包括解析器的if,for switch等。從而能夠更快的渲染輸出結果。

6.25.4 中間件的原理? @todo

答:中間件自己是解決必定場景的問題的工具,通常跟具體的業務關係不大。如redis能夠做爲消息中間件,解決消息發佈和消費的過程。

中間的原理提供統一的輸入和輸出的接口,而後提供中間的配置,能夠接入業務系統,方便總體業務的對接。

中間件主要是在應用和操做系統層之間的調用,中間件須要解決平臺化和消息通訊,這樣通常要支持分佈式的處理。如分佈式消息中間件,分佈式事務中間件,還有其餘的事件處理。

中間件整體來講是解決多操做系統的複雜接口的封裝,提供統一的,標準的調用接口。極大的提升的開發的效率和解決了不一樣的操做系統和不一樣的組建之間的消息通訊的處理機制。

6.25.5 經常使用的設計模式有哪些?@todo

答:常見的設計模式包括,單例模式,工廠模式,適配器模式,還有模版模式,策略模式。這些模式都是開發中都是常見處理的。單例模式更多的是怎麼來處理對象的共享對象的處理,把構造函數私有化,這樣統一的建立對象方法能夠負責方法的建立。

工廠模式: 負責生產對象。而後消費者,只須要對象的產品的名稱,調用工廠對象就能夠生產出該對象或者查詢已經生產的對象。

適配器模式:咱們常見的是經過插口的方式進行處理。爲了知足方法接口的調用,對不能哦使用的對象進行封裝,並增長鬚要知足特性的接口,而後進行接口的調用。

模版模式: 一個抽象類把要作成事情的步驟出來,如把大象裝進冰箱裏面,能夠把找來大象和找來冰箱,而後打開冰箱,最後把大象裝進冰箱經過繼承的對象進行實現處理。從而實現模版模式。

策略模式:咱們經常使用的人物是應用的算法模式,好比說排序有多種算法,所排序的有的類都實現sort排序的方法,而後經過排序的算法名稱就能夠實現算法的調用。從而實現

6.25.6 面向對象的設計原則有哪些?

答: 總的設計原則是高內聚,低耦合。 常見的原則包括: 單一性原則,一個類只作一件事情 依賴倒置原則,抽象不依賴於具體的實現。 里氏原則:子類能夠替換父類全部的狀況。這樣父類儘量的設計的簡單和抽象。這樣子類能夠覆蓋父類的方法。 接口隔離原則:多個不一樣的場景實現,最好把多個接口分開實現進行調用。

接口的開閉原則:對擴張是支持開放的,這樣能夠擴展其特性,對修改進行關閉,這樣內部的修改,通常只有內部本身能夠完成修改操做。

6.25.7 網絡安全的理解

答:網絡的安全。這個話題真的有點大,我說下我我的的理解。互聯網整體來講是無數的主機經過網絡鏈接在一塊兒的。網絡的本質就是解決不一樣主機之間能夠通訊的問題。同時主機之間本質上都是獨立的不相認識的。默認的狀況主機通訊是沒有安全問題,可是隨着互聯網把人類的生活場景映射到互聯網的時候,就容易造成互聯網的維護者,另外一方面是破壞者。這樣網絡的安全問題就誕生了。 常見出現的網絡安全問題有:

  1. 假冒主機進行通訊,包括髮送信息和接受信息,騙子
  2. 在中間劫持核心和重要的數據,小偷
  3. 網絡的攻擊,使得你的系統不能正常的使用。強盜

解決網絡的安全問題主要有:

  1. 制定安全的傳輸協議,如ssl,tls協議,這就比如創建法律的條條框框。
  2. 增長認證機制,好比說第三方的證書認證。
  3. 加密技術的處理。
  4. 監控技術,監控規則。

而協議這一塊,基本上已經有了成熟的體系了。因此通常是創建在現有的安全協議上通訊。前面兩點在現有的體系有人負責處理了。咱們更多的是關注於加密技術和系統監控。 常見的加密有rsa非對稱加密,des,aes對稱加密,還有散列算法的加密,md5,sha1,sha2. 而系統的監控,能夠經過請求的特徵分析是否爲安全的。包括監控是否存在木馬,蠕蟲病毒的攻擊。

6.25.8 Mysql的存儲優化

答:mysql的存儲優化這裏能夠從兩個角度來講,一個是基於業務的數據庫,表的存儲優化,另一個是存儲引擎的優化。 從第一種狀況來看,mysql數據庫存儲要根據核心業務和非核心業務拆分,減小非核心業務庫都核心庫業務的i/o影響。這就是咱們常見的分庫。這個須要考慮業務的場景。若是是對錶進行優化的話,須要考慮表包含的三個點,表結構,表索引,表數據。能夠分別進行考慮,如是否存在廢棄的表,廢棄的大字段,是否存在存儲的大字段的拆分。 而後對錶的索引優化,能夠基於業務判斷,索引是否存在足夠的命中,同理索引是否存在大量的冗餘等。 表數據的優化主要考慮是否進行表拆分,一個大表拆分紅多個表。而後進行業務的使用。具體的拆分都須要跟具體的應用場景來講看。 另外一個說下對存儲引擎優化。咱們經常使用的存儲引擎基於事物的innodb,特別是最近的mysql5.5以後重點仍是對innodb的優化。對於innodb的優化主要集中在配置的優化,包括innodb的緩存大小,還有緩緩衝隊列的長度調整。具體也須要根據業務的場景來調整。

6.26 阿里巴巴
6.26.1 熟悉TCP/IP、HTTP協議相關知識,熟悉Unix/Linux環境和系統編程,深刻掌握服務器編程模型

答:詳見,服務器網絡編程的5種編程模型的操做。

6.26.2 熟悉高可用高併發的架構設計,曾主導或支撐過億級訪問量中等規模複雜度系統,說說大家的項目場景?處理億級別的系統設計場景能夠聊下

答:簡單聊聊高併發吧,高併發是在單位時間裏面可以支撐起流量的請求而且可以進行快速的處理。咱們常見的是用戶的請求,或者接口的調用。這些流量的大量的堆積在一塊兒,造成流量洪峯。在咱們搞的項目中有幾點應對的經驗能夠聊下:

  1. 流量的分流,常常會採用一些反向代理器或者負載均衡器。這些組件主要解決的是把流量均衡的分發到服務器進行處理。
  2. 流量的控流機制,要知道你服務器真正可以支撐多大的體量,通常會空流會進行設置設置不一樣的級別。對於超過的流量體系能夠儘早提示返回。
  3. 服務器的處理機制,通常採用異步事件機制。服務器會把要處理的流量事件註冊進行註冊,服務器能夠根據流量的洪峯進行啓動最大線程處理。好比說咱們使用nignx服務器,4核服務器開啓了4個work,而每一個work能夠開啓1wconnsection,
  4. 對於服務器的代碼處理,能夠優先把結果存儲到緩存中,對於查詢的流量儘可能在緩存中進行查詢,對於插入的事物,能夠先鎖定,而後放到消息隊列中,進行處理。咱們如今主要使用redis集羣進行處理。
  5. 咱們的流量主要來自於咱們的數據同步壓力。
6.26.4 你是怎麼理解敏捷開發的?

答:這個已經答了。在關閉這個窗口的時候就沒有序列化了。 本質是快速迭代,快速交互,小步快跑。

6.26.5 python 語言和PHP的區別

答:python也是一門腳本語言,而且愈來愈多的搞數學和算法的人選擇了這門語言,那爲何會出現了,有這門語言。它又相對PHP來講解決了什麼問題呢? 對於PHP的語言整體不是很高,PHP的基礎組件不是很完善,而主要仍是針對web的開發,這樣在必定程難度上很容易被侷限了。

php隨着web興起,對html的標籤支持的很是好,可是隨着web的興起和移動互聯網對開發的效率提升,天然拉昇了對PHP的需求。天然而然的PHP就更多人來開發和管理和使用了。可是PHP隨着基礎庫不夠完善和對於其餘的web平臺的開發就變得不是那麼的有競爭力。因此,就能夠真正的提升總體的體驗。

python隨着大數據和人工智能的發展,這門語言變的很是有必要進行開發和使用了。python語言仍是能夠嘗試學習下,而後進行必定的開發和調試操做。慢慢去解決存在的問題和遇到的問題。

6.26.6 Python 構建自動化的機制

答:python 也是一門腳本語言。 咱們採用的是behave的框架,這種框架是行爲驅動的測試場景,很是簡單的方式,就是能夠把一些測試用例的描述轉變成系統的開發測試經驗。從而保證系統的執行的效率。因此,能夠採用常常的數據庫的操做和方式的處理。只須要把測試用例的描述信息轉化成behave的制定的語法就能夠造成測試。本質就是測試關鍵字與語法的對應。

6.27 迅雷的招聘需求
6.27.1 優化共識機制

答:分佈式一致性的算法確認,在不一樣的分佈式結構過程當中

6.27.2 優化智能合約,開發底層合約應用

答:智能合約就是在知足數字協議的條件上進行自動執行合約的操做。

6.28 算法
6.28.1 冒泡算法

答:冒泡算法整體邏輯

  1. 當前元素跟後面的每個元素比較,若是後面元素比當前元素小則進行交換
  2. 遍歷全部的節點,最後會出現小的排在前面,大的值排在後面。
6.28.2 插入排序

答:插入排序,能夠前插入排序,也能夠後插入排序。前插入排序主要是

  1. 當前節點的後一個節點,跟前面節點比較,若是是比當前元素小則,繼續向前比較,若是比前面節點小比當前節點大,則後一個節點與當前節點交互。
  2. 遍歷全部的元素,都向前插入。最後造成順序的排序列表。
6.28.3 快速排序

答:快速排序的算法思路:

  1. 在排序前設置基準元素,能夠是第一個,也能夠是最後一個
  2. 根據基準元素進行比較,比基準元素大的放右邊,比基準元素小的放左邊。
  3. 按一樣的方式遞歸左邊的元素和右邊的元素。最後把這些遞歸結果數組進行合併。使用array_merge

6.29 數據結構
6.29.1 鏈表

答:什麼是鏈表?鏈表就是物理上是分離的,可是邏輯上經過指針連接各個節點的次序。 對鏈表就是節點的指針,包括頭節點,爲節點,經過指針進行鏈接/指向。 class Node{

public $val="";
public $name ="";
複製代碼

}

鏈表是物理上分散,邏輯上是連續的。 就比如,有不少珠子,那根線串起來就是鏈表。而每顆珠子都記錄下一顆珠子的引用。這樣就就能夠應用的位置找到下一個節點的地址塊,已經該節點的地址塊元素的值。同理,循環查找或者把地址的位置斷開,而後進行銜接。 開始要建立頭節點,頭節點能夠建立元素。next節點能夠爲null。 咱們採用節點指向的方式來處理。

  1. 頭節點要指向下一個節點。能夠先建立一個空節點,而後把頭節點指向的下一個位置設置爲空節點
  2. 把這個空節點設置值。
6.29.2 棧

答:這個是先進後出的,很是適合操做符或者一些變量和釋放。

6.29.3 隊列

答:先進先出,可使用數組做爲隊列,採用push,pop的方式進行處理。 也可使用雙向鏈表做爲做爲隊列的機制進行關聯和處理。

6.29.4 堆

答:最小堆和最大堆。左邊大於右邊。進行處理!

6.29.5 樹

答:樹的數據結構主要包含了跟節點和葉子結點。這樣就構成了樹的數據格式。 樹的格式包括左節點和右節點。

6.29.6 指針
6.29.7 引用

引用是對對象或者變量進行標識,能夠經過標識能夠獲取地址塊。而指針表示真實分配的地址塊,是物理內存中能夠查看到的。因此使用指針要防止指向的內存地址是否存在,這就是常見的空指針的狀況。

其實PHP的回收機制就很大程度上就是根據應用的地址來查看的。

相關文章
相關標籤/搜索