2017面試遇到的一些面試題

分享一些今年所遇到的面試題。php

一、寫一個函數,儘量高效的,從一個標準url裏取出文件的擴展名例如: http://www.test.com.cn/abc/de/fg.PHP?id=1須要取出php或.phphtml

 1 第一種寫法:
 2 function getExt1($url){
 3     $arr = parse_url($url);
 4     $file = basename($arr['path']);
 5     $ext = explode('.',$file);
 6     return $ext[1];
 7 }
 8 第二種寫法:
 9 function getExt2($url){
10     $b=parse_url($url);
11     echo substr($b['path'],strpos($b['path'],'.'));
12 }
13 第三種寫法:
14 function getExt3($url){
15     $b=parse_url($url);
16     $ext = explode('.',$b['path']);
17     echo end($ext);
18 }
19 
20 $a="http://www.test.com.cn/abc/de/fg.php?id=1";
21 echo getExt($a);

二、使用五種以上方式獲取一個文件的擴展名

 1 function get_ext1($file_name){
 2     returnsubstr(strrchr($file_name, '.'),1);
 3 }
 4 function get_ext2($file_name){
 5     returnsubstr(substr($file_name, strrpos($file_name, '.')),1);
 6 }
 7 function get_ext3($file_name){
 8     $a=explode('.', $file_name);
 9     returnarray_pop($a);
10 }
11 function get_ext4($file_name){
12     returnpathinfo($file_name, PATHINFO_EXTENSION);
13 }
14 function get_ext5($file_name){
15     returnstrrev(substr(strrev($file_name), 0, strpos(strrev($file_name), '.')));
16 }

三、HTTP中POST、GET、PUT、DELETE方式的區別前端

HTTP定義了與服務器交互的不一樣的方法,最基本的是POST、GET、PUT、DELETE,與其比不可少的URL的全稱是資源描述符,咱們能夠這樣理解:url描述了一個網絡上資源,而post、get、put、delete就是對這個資源進行增、刪、改、查的操做!mysql

3.1表單中get和post提交方式的區別jquery

  • get是把參數數據隊列加到提交表單的action屬性所指的url中,值和表單內各個字段一一對應,從url中能夠看到;post是經過HTTPPOST機制,將表單內各個字段與其內容防止在HTML的head中一塊兒傳送到action屬性所指的url地址,用戶看不到這個過程
  • 對於get方式,服務器端用Request.QueryString獲取變量的值,對於post方式,服務器端用Request.Form獲取提交的數據
  • get傳送的數據量較小,post傳送的數據量較大,通常被默認不受限制,但在理論上,IIS4中最大量爲80kb,IIS5中爲1000k,get安全性很是低,post安全性較高
  • 3.2
  • GET請求會向數據庫發索取數據的請求,從而來獲取信息,該請求就像數據庫的select操做同樣,只是用來查詢一下數據,不會修改、增長數據,不會影響資源的內容,即該請求不會產生反作用。不管進行多少次操做,結果都是同樣的。
  • 與GET不一樣的是,PUT請求是向服務器端發送數據的,從而改變信息,該請求就像數據庫的update操做同樣,用來修改數據的內容,可是不會增長數據的種類等,也就是說不管進行多少次PUT操做,其結果並無不一樣。
  • POST請求同PUT請求相似,都是向服務器端發送數據的,可是該請求會改變數據的種類等資源,就像數據庫的insert操做同樣,會建立新的內容。幾乎目前全部的提交操做都是用POST請求的。
  • DELETE請求顧名思義,就是用來刪除某一個資源的,該請求就像數據庫的delete操做。

四、優化數據庫的方法nginx

1、選取適當的字段屬性。web

二、使用鏈接查詢代替子查詢。面試

三、使用聯合查詢代替手動建立的臨時表正則表達式

四、使用事務。sql

五、鎖定表。

六、使用外鍵。

七、使用索引

八、優化查詢語句

詳情能夠看我以前發表的《優化數據庫的八種方法

五、對於大流量網站,採用什麼方法來解決訪問量的問題

一、首先,確認服務器硬件是否足夠支持當前的流量

普通的P4服務器通常最多能支持天天10萬獨立IP,若是訪問量比這個還要大,那麼必須首先配置一臺更高性能的專用服務器才能解決問題,不然怎麼優化都不可能完全解決性能問題。

二、數據庫的讀寫分離,優化表結構;

讀寫分離:頻繁請求數據庫時會形成堵塞,增長數據的讀取與寫入時間。讀寫分離可以使不一樣的數據庫分擔不一樣的任務,減小每一個數據庫的鏈接數,加快數據讀取速度;

三、緩存技術的合理運用,減小數據庫的頻繁操做;

優化數據庫訪問前臺實現徹底的靜態化固然最好,能夠徹底不用訪問數據庫,不過對於頻繁更新的網站, 靜態化每每不能知足某些功能。
      緩存技術就是另外一個解決方案,就是將動態數據存儲到緩存文件中,動態網頁直接調用 這些文件,而沒必要再訪問數據庫,WordPress和Z-Blog都大量使用這種緩存技術      若是確實沒法避免對數據庫的訪問,那麼能夠嘗試優化數據庫的查詢SQL.避免使用 Select * from這樣的語句,每次查詢只返回本身須要的結果,避免短期內的大,儘可能作到"所查即所得" ,遵循以小表爲主,附表爲輔,查詢條件先索引,先小後大的原則,提升查詢效率.量SQL查詢。

四、程序功能規則,減小外部盜鏈;

外部網站的圖片或者文件盜鏈每每會帶來大量的負載壓力,所以應該嚴格限制外部對於自身的圖片或者文件盜鏈,好在目前能夠簡單地經過refer來控制盜鏈,Apache自 己就能夠經過配置來禁止盜鏈,IIS也有一些第三方的ISAPI能夠實現一樣的功能。固然,僞造refer也能夠經過代碼來實現盜鏈,不過目前蓄意僞造refer盜鏈的還很少, 能夠先不去考慮,或者使用非技術手段來解決,好比在圖片上增長水印。 

五、控制大文件的上傳與下載;

大文件的下載會佔用很大的流量,而且對於非SCSI硬盤來講,大量文件下載會消耗 CPU,使得網站響應能力降低。所以,儘可能不要提供超過2M的大文件下載,若是須要提供,建議將大文件放在另一臺服務器上。 

六、使用不一樣主機分流主要流量

將文件放在不一樣的主機上,提供不一樣的鏡像供用戶下載。好比若是以爲RSS文件佔用流量大,那麼使用FeedBurner或者FeedSky等服務將RSS輸出放在其餘主機上,這樣別人訪問的流量壓力就大多集中在FeedBurner的主機上,RSS就不佔用太多資源了

七、使用流量分析統計軟件

在網站上安裝一個流量分析統計軟件,能夠即時知道哪些地方耗費了大量流量,哪些頁面須要再進行優化,所以,解決流量問題還須要進行精確的統計分析才能夠。

六、數據庫中的事務是什麼?

事務(transaction)是做爲一個單元的一組有序的數據庫操做。若是組中的全部操做都成功,則認爲事務成功,即便只有一個操做失敗,事務也不成功。若是全部操做完成,事務則提交,其修改將做用於全部其餘數據庫進程。若是一個操做失敗,則事務將回滾,該事務全部操做的影響都將取消。ACID 四大特性,原子性、隔離性、一致性、持久性。

七、瞭解XSS攻擊嗎?如何防止?

XSS跨站腳本攻擊指攻擊者在網頁中嵌入客戶端腳本(例如JavaScript),當用戶瀏覽此網頁時,腳本就會在用戶的瀏覽器上執行,從而達到攻擊者的目的,好比獲取用戶的Cookie,導航到惡意網站,攜帶木馬等。

如何防止XSS跨站腳本攻擊:

原則:不相信用戶輸入的數據

  1. 將重要的cookie標記爲http only,這樣的話Javascript 中的document.cookie語句就不能獲取到cookie了
  2. 只容許用戶輸入咱們指望的數據。例如:年齡的textbox中,只容許用戶輸入數字,而數字以外的字符都過濾掉
  3. 對數據進行Html Encode 處理。< 轉化爲 &lt;、> 轉化爲 &gt;、& 轉化爲 &amp;、' 轉化爲 '、" 轉化爲 &quot;、空格 轉化爲 &nbsp;
  4. 過濾或移除特殊的Html標籤。例如:<script>、<iframe>、&lt; for <、&gt; for >、&quot for

5. 過濾JavaScript 事件的標籤。例如 「onclick=」、」onfocus」等等 
不少瀏覽器都加入了安全機制來過濾XSS

注意:攻擊代碼不必定在<script></script>

八、SQL注入漏洞產生的緣由?如何防止?

所謂SQL注入,就是經過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。

如何防止SQL注入:

  1. 永遠不要信任用戶的輸入。對用戶的輸入進行校驗,能夠經過正則表達式,或限制長度;對單引號和雙」-「進行轉換等。
  2. 永遠不要使用動態拼裝sql,可使用參數化的sql或者直接使用存儲過程進行數據查詢存取
  3. 永遠不要使用管理員權限的數據庫鏈接,爲每一個應用使用單獨的權限有限的數據庫鏈接
  4. 不要把機密信息直接存放,加密或者hash掉密碼和敏感的信息

應用的異常信息應該給出儘量少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝

九、對於關係型數據庫而言,索引是至關重要的概念,請回答有關索引的幾個問題:

a)、索引的目的是什麼?

  1. 快速訪問數據表中的特定信息,提升檢索速度
  2. 建立惟一性索引,保證數據庫表中每一行數據的惟一性。
  3. 加速表和表之間的鏈接
  4. 使用分組和排序子句進行數據檢索時,能夠顯著減小查詢中分組和排序的時間

b)、索引對數據庫系統的負面影響是什麼?

負面影響:
建立索引和維護索引須要耗費時間,這個時間隨着數據量的增長而增長;索引須要佔用物理空間,不光是表須要佔用數據空間,每一個索引也須要佔用物理空間;當對錶進行增、刪、改、的時候索引也要動態維護,這樣就下降了數據的維護速度。

c)、爲數據表創建索引的原則有哪些?

  1. 在最頻繁使用的、用以縮小查詢範圍的字段上創建索引。
  2. 在頻繁使用的、須要排序的字段上創建索引

d)、什麼狀況下不宜創建索引?

  1. 對於查詢中不多涉及的列或者重複值比較多的列,不宜創建索引。
  2. 對於一些特殊的數據類型,不宜創建索引,好比文本字段(text)等。

e)索引的反作用

(1)索引是有大量數據的時候才創建的,沒有大量數據反而會浪費時間,由於索引是使用二叉樹創建.
(2)當一個系統查詢比較頻繁,而新建,修改等操做比較少時,能夠建立索引,這樣查詢的速度會比之前快不少,同時也帶來弊端,就是新建或修改等操做時,比沒有索引或沒有創建覆蓋索引時的要慢。
(3)索引並非越多越好,太多索引會佔用不少的索引表空間,甚至比存儲一條記錄更多。
對於須要頻繁新增記錄的表,最好不要建立索引,沒有索引的表,執行insert、append都很快,有了索引之後,會多一個維護索引的操做,一些大表可能致使insert 速度很是慢。

十、簡述在MySQL數據庫中MyISAM和InnoDB的區別

區別於其餘數據庫的最重要的特色就是其插件式的表存儲引擎。切記:存儲引擎是基於表的,而不是數據庫。

MyISAM是MySQL的默認數據庫引擎(5.5版以前),由早期的ISAM(Indexed Sequential Access Method:有索引的順序訪問方法)所改良。雖然性能極佳,但卻有一個缺點:不支持事務處理(transaction)。不過,在這幾年的發展下,MySQL也導入了InnoDB(另外一種數據庫引擎),以強化參考完整性與併發違規處理機制,後來就逐漸取代MyISAM。

InnoDB,是MySQL的數據庫引擎之一,爲MySQL AB發佈binary的標準之一。InnoDB由Innobase Oy公司所開發,2006年五月時由甲骨文公司併購。與傳統的ISAM與MyISAM相比,InnoDB的最大特點就是支持了ACID兼容的事務(Transaction)功能,相似於PostgreSQL。目前InnoDB採用雙軌制受權,一是GPL受權,另外一是專有軟件受權。

MyISAMInnoDB的區別是什麼?

1存儲結構

MyISAM:每一個MyISAM在磁盤上存儲成三個文件。第一個文件的名字以表的名字開始,擴展名指出文件類型。.frm文件存儲表定義。數據文件的擴展名爲.MYD (MYData)。索引文件的擴展名是.MYI (MYIndex)。
InnoDB:全部的表都保存在同一個數據文件中(也多是多個文件,或者是獨立的表空間文件),InnoDB表的大小隻受限於操做系統文件的大小,通常爲2GB。

2存儲空間

MyISAM:可被壓縮,存儲空間較小。支持三種不一樣的存儲格式:靜態表(默認,可是注意數據末尾不能有空格,會被去掉)、動態表、壓縮表。
InnoDB:須要更多的內存和存儲,它會在主內存中創建其專用的緩衝池用於高速緩衝數據和索引。

3可移植性、備份及恢復

MyISAM:數據是以文件的形式存儲,因此在跨平臺的數據轉移中會很方便。在備份和恢復時可單獨針對某個表進行操做。
InnoDB:免費的方案能夠是拷貝數據文件、備份 binlog,或者用 mysqldump,在數據量達到幾十G的時候就相對痛苦了。

4事務支持

MyISAM:強調的是性能,每次查詢具備原子性,其執行數度比InnoDB類型更快,可是不提供事務支持。
InnoDB:提供事務支持事務,外部鍵等高級數據庫功能。 具備事務(commit)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)的事務安全(transaction-safe (ACID compliant))型表。

5 AUTO_INCREMENT

MyISAM:能夠和其餘字段一塊兒創建聯合索引。引擎的自動增加列必須是索引,若是是組合索引,自動增加能夠不是第一列,他能夠根據前面幾列進行排序後遞增。
InnoDB:InnoDB中必須包含只有該字段的索引。引擎的自動增加列必須是索引,若是是組合索引也必須是組合索引的第一列。

6表鎖差別

MyISAM:只支持表級鎖,用戶在操做myisam表時,select,update,delete,insert語句都會給表自動加鎖,若是加鎖之後的表知足insert併發的狀況下,能夠在表的尾部插入新的數據。
InnoDB:支持事務和行級鎖,是innodb的最大特點。行鎖大幅度提升了多用戶併發操做的新能。可是InnoDB的行鎖,只是在WHERE的主鍵是有效的,非主鍵的WHERE都會鎖全表的。

7全文索引

MyISAM:支持 FULLTEXT類型的全文索引
InnoDB:不支持FULLTEXT類型的全文索引,可是innodb可使用sphinx插件支持全文索引,而且效果更好。

8表主鍵

MyISAM:容許沒有任何索引和主鍵的表存在,索引都是保存行的地址。
InnoDB:若是沒有設定主鍵或者非空惟一索引,就會自動生成一個6字節的主鍵(用戶不可見),數據是主索引的一部分,附加索引保存的是主索引的值。

十一、解釋MySQL外鏈接、內鏈接與自鏈接的區別

先說什麼是交叉鏈接: 交叉鏈接又叫笛卡爾積,它是指不使用任何條件,直接將一個表的全部記錄和另外一個表中的全部記錄一一匹配。

內鏈接 則是隻有條件的交叉鏈接,根據某個條件篩選出符合條件的記錄,不符合條件的記錄不會出如今結果集中,即內鏈接只鏈接匹配的行。
外鏈接 其結果集中不只包含符合鏈接條件的行,並且還會包括左表、右表或兩個表中的全部數據行,這三種狀況依次稱之爲左外鏈接,右外鏈接,和全外鏈接。

左外鏈接,也稱左鏈接,左表爲主表,左表中的全部記錄都會出如今結果集中,對於那些在右表中並無匹配的記錄,仍然要顯示,右邊對應的那些字段值以NULL來填充。右外鏈接,也稱右鏈接,右表爲主表,右表中的全部記錄都會出如今結果集中。左鏈接和右鏈接能夠互換,mysql目前還不支持全外鏈接。

十二、列舉流行的Ajax 框架?說明 Ajax 實現原理是什麼及json在 Ajax 中起什麼做用?

流行的 Ajax 框架有 jQuery,Prototype,Dojo,MooTools。

Ajax 的工做原理是一個頁面的指定位置能夠加載另外一個頁面全部的輸出內容,這樣就實現了一個靜態頁面也能獲取到數據庫中的返回數據信息了。因此 Ajax 技術實現了一個靜態網頁在不刷新整個頁面的狀況下與服務器通訊,減小了用戶等待時間,同時也從而下降了網絡流量,加強了客戶體驗的友好程度。
在使用 Ajax 時,涉及到數據傳輸,即將數據從服務器返回到客戶端,服務器端和客戶端分別使用不一樣的腳步語言來處理數據,這就須要一種通用的數據格式,XML 和json就是最經常使用的兩種,而json比 XML 更簡單。

1三、談談你對MVC的認識

MVC是Model—View—Controler的簡稱。即模型—視圖—控制器。MVC是一種設計模式,它強制性的把應用程序的輸入、處理和輸出分開。

MVC中的模型、視圖、控制器它們分別擔負着不一樣的任務。

              視圖: 視圖是用戶看到並與之交互的界面。視圖向用戶顯示相關的數據,並接受用    戶的輸入。視圖不進行任何業務邏輯處理。

模型: 模型表示業務數據和業務處理。一個模型能爲多個視圖提供數據。這提升了應用程序的重用性。

控制器: 當用戶單擊Web頁面中的提交按鈕時,控制器接受請求並調用相應的模型去處理請求。而後根據處理的結果調用相應的視圖來顯示處理的結果。

MVC的處理過程:首先控制器接受用戶的請求,調用相應的模型來進行業務處理,並返回數據給控制器。控制器調用相應的視圖來顯示處理的結果。並經過視圖呈現給用戶。

1、MVC的優勢 
一、能夠爲一個模型在運行時同時創建和使用多個視圖。變化-傳播機制能夠確保全部相關的視圖及時獲得模型數據變化,從而使全部關聯的視圖和控制器作到行爲同步。 
二、視圖與控制器的可接插性,容許更換視圖和控制器對象,並且能夠根據需求動態的打開或關閉、甚至在運行期間進行對象替換。 
三、模型的可移植性。由於模型是獨立於視圖的,因此能夠把一個模型獨立地移植到新的平臺工做。須要作的只是在新平臺上對視圖和控制器進行新的修改。 
四、潛在的框架結構。能夠基於此模型創建應用程序框架,不只僅是用在設計界面的設計中。

MVC的不足 
MVC的不足體如今如下幾個方面: 
(1)增長了系統結構和實現的複雜性。對於簡單的界面,嚴格遵循MVC,使模型、視圖與控制器分離,會增長結構的複雜性,並可能產生過多的更新操做,下降運行效率。 
(2)視圖與控制器間的過於緊密的鏈接。視圖與控制器是相互分離,但確實聯繫緊密的部件,視圖沒有控制器的存在,其應用是頗有限的,反之亦然,這樣就妨礙了他們的獨立重用。 
(3)視圖對模型數據的低效率訪問。依據模型操做接口的不一樣,視圖可能須要屢次調用才能得到足夠的顯示數據。對未變化數據的沒必要要的頻繁訪問,也將損害操做性能。 
(4) 目前,通常高級的界面工具或構造器不支持MVC架構。改造這些工具以適應MVC須要和創建分離的部件的代價是很高的,從而形成使用MVC的困難。

1四、用過緩存技術嗎?說說對Memcache的理解

  概念

Memcache是一個高性能的分佈式的內存對象緩存系統。是個開源的軟件,能夠經過簡單的方法,管理數據庫在內存中的存取。簡單的說就是緩存數據庫查詢結果(數據)到內存中,而後從內存中讀取,從而大大提升讀取速度,減小數據庫訪問參數,以提升動態web應用的速度,提升可擴展性

 怎麼理解Memcache?

Memcache 是隻有一張表的數據庫,這張表有兩個字段分別是主鍵key 和value,value就是咱們要保存的數據,key就是這個數據的id,用來保證咱們查找時候的惟一性

  Memcache 使用場景

  非持久化存儲:對數據存儲要求不高,服務中止後,裏面的數據就會丟失

  分佈式存儲:單臺數據的內存容量有限,能夠在多個電腦上安裝memcache 服務

  Key/Value存儲:須要緩存的對象或數據以「key/value」對的形式保存在服務器端

  Memcache 在WEB中的應用

MemCache緩存系統最主要的就是爲了提升動態網頁應用,分擔數據庫檢索的壓力。對於網站流量比較大的,可使用memcache緩解數據庫的壓力,主要的焦點集中在如下兩個方面:

        1. 使用MemCache做爲中間緩存層減小數據庫的壓力。

        2. MemCache分佈式的應用

鏈接memcache

  實例化memcache類

  $memcache=new memcache;

  鏈接memcache服務器

  格式:$memcache->connect('127.0.0.1','11211');

  參數1:主機(必寫);

  參數2:Memcached服務的端口號,默認11211(可選)

  關閉服務器鏈接

$memcache->close()

1五、Memcache與Redis的區別

 

NoSQL因其優點,目前是大行其道,而Memcached和Redis更是NoSQL中的明星。兩者同爲Key-Value型,且一樣優秀,少不了一番比較。如下是一些簡單的比較,不涉及底層基礎等。

  1.存儲最大值

  Memcached的key最大爲250字節,value最大爲1MB;Redis的key和value最大都是512MB。

  2.數據類型

  Memcached存儲的類型僅支持key-value類型;Redis支持五種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

  3.數據備份

  Memcached不支持數據備份;Redis支持master-slave模式的數據備份,教程在此:Redis數據備份與恢復。

  4.災難恢復

  Memcached不可恢復,即restart以後數據也會清空;Redis能夠恢復。

  5.性能比較

  放上引用的一段話,連接地址會在下文給出:

因爲Redis只使用單核,而Memcached可使用多核,因此在比較上,平均每個核上 Redis在存儲小數據時Memcached性能更高。而在100k以上的數據中,Memcached性能要高於Redis,雖然Redis最近也在存儲大數據的性能上進行優化,可是比起Memcached,仍是稍有遜色。說了這麼多,結論是,不管你使用哪個,每秒處理請求的次數都不會成爲瓶頸。

  6.持久化

  這一點能夠說是兩者之間本質上的區別,同時也是上一點災難恢復的基礎。Memcached不能夠持久化,全部的數據都在內存中。Redis有兩種持久化的方式:RDB(快照)方式和AOF(追加)方式,教程在此:Redi持久化。

  7.使用場景

  私覺得,Memcached足以應對通常網站的緩存需求,此博客既是使用Memcached。若是有更多的需求,如持久化、可靠性或者更多數據類型,應當考慮Redis。

1六、Apache與Nginx的區別

nginx 相對 apache 的優勢:
輕量級,一樣起web 服務,比apache 佔用更少的內存及資源
抗併發,nginx 處理請求是異步非阻塞的,而apache 則是阻塞型的,在高併發下nginx 能保持低資源低消耗高性能
高度模塊化的設計,編寫模塊相對簡單
社區活躍,各類高性能模塊出品迅速啊

apache 相對nginx 的優勢:
rewrite ,比nginx 的rewrite 強大
模塊超多,基本想到的均可以找到
少bug ,nginx 的bug 相對較多
超穩定


存在就是理由,通常來講,須要性能的web 服務,用nginx 。若是不須要性能只求穩定,那就apache 吧。後者的各類功能模塊實現得比前者,例如ssl 的模塊就比前者好,可配置項多。


這裏要注意一點,epoll(freebsd 上是 kqueue )網絡IO 模型是nginx 處理性能高的根本理由,但並非全部的狀況下都是epoll 大獲全勝的,若是自己提供靜態服務的就只有寥寥幾個文件,apache 的select 模型或許比epoll 更高性能。固然,這只是根據網絡IO 模型的原理做的一個假設,真正的應用仍是須要實測了再說的。

一、做爲 Web 服務器:相比 Apache,Nginx 使用更少的資源,支持更多的併發鏈接,體現更高的效率,這點使 Nginx 尤爲受到虛擬主機提供商的歡迎。在高鏈接併發的狀況下,Nginx是Apache服務器不錯的替代品: Nginx在美國是作虛擬主機生意的老闆們常常選擇的軟件平臺之一. 可以支持高達 50000 個併發鏈接數的響應, 感謝Nginx爲咱們選擇了 epoll and kqueue 做爲開發模型. 
      Nginx做爲負載均衡服務器: Nginx 既能夠在內部直接支持 Rails 和 PHP 程序對外進行服務, 也能夠支持做爲 HTTP代理 服務器對外進行服務. Nginx採用C進行編寫, 不管是系統資源開銷仍是CPU使用效率都比 Perlbal 要好不少.

二、Nginx 配置簡潔, Apache 複雜 ,Nginx 啓動特別容易, 而且幾乎能夠作到7*24不間斷運行,即便運行數個月也不須要從新啓動. 你還可以不間斷服務的狀況下進行軟件版本的升級 . Nginx 靜態處理性能比 Apache 高 3倍以上 ,Apache 對 PHP 支持比較簡單,Nginx 須要配合其餘後端來使用 ,Apache 的組件比 Nginx 多. 
三、最核心的區別在於apache是同步多進程模型,一個鏈接對應一個進程;nginx是異步的,多個鏈接(萬級別)能夠對應一個進程 .
四、nginx的優點是處理靜態請求,cpu內存使用率低,apache適合處理動態請求,因此如今通常前端用nginx做爲反向代理抗住壓力,apache做爲後端處理動態請求

1七、用PHP寫出一個安全的用戶登陸系統須要注意哪些方面

一、密碼要使用MD5(密碼+字符串)進行加密
二、登陸表單的名稱不要跟數據庫字段同樣,以避免暴露表字段.
三、要使用驗證碼驗證登錄,以防止暴力破解
四、登錄後臺處理代碼數據庫部分可使用預處理,作好過濾,防止sql注入

1八、Composer是什麼,怎麼應用?

Composer 是 PHP5.3以上的一個依賴管理工具。它容許你申明項目所依賴的代碼庫,它會在你的項目中爲你安裝他們。Composer 不是一個包管理器。是的,它涉及 "packages" 和 "libraries",但它在每一個項目的基礎上進行管理,在你項目的某個目錄中(例如 vendor)進行安裝。默認狀況下它不會在全局安裝任何東西。所以,這僅僅是一個依賴管理。

1九、類的多繼承怎麼實現?

一:traits實現多繼承:

PHP 5.4.0 開始,PHP 實現了代碼複用的一個方法,稱爲 traits。

Traits 是PHP中一種相似多繼承的方法。Trait 爲了減小單繼承語言的限制,使開發人員可以自由地在不一樣層次結構內獨立的類中複用方法集。Traits 和類組合的語義是定義了一種方式來減小複雜性,避免傳統多繼承和混入類相關的典型問題。

Trait 和一個類類似,但僅僅旨在用細粒度和一致的方式來組合功能。Trait 不能經過它自身來實例化。它爲傳統繼承增長了水平特性的組合;

二:接口實現多繼承:

在PHP的接口中,接口能夠繼承接口。雖然PHP類只能繼承一個父類(單繼承),可是接口和類不一樣,接口能夠實現多繼承,能夠繼承一個或者多個接口。固然接口的繼承也是使用extends關鍵字,要多個繼承的話只要用逗號把繼承的接口隔開便可。
須要注意的是當你接口繼承其它接口時候,直接繼承父接口的靜態常量屬性和抽象方法,因此類實現接口時必須實現全部相關的抽象方法。

20、include與require的區別

·      require是無條件包含,也就是若是一個流程里加入require,不管條件成立與否都會先執行require,當文件不存在或者沒法打開的時候,會提示錯誤,而且會終止程序執行

·      include有返回值,而require沒有(可能由於如此require的速度比include快),若是被包含的文件不存在的化,那麼會提示一個錯誤,可是程序會繼續執行下去

注意:包含文件不存在或者語法錯誤的時候require是致命的,而include不是

require_once表示了只包含一次,避免了重複包含

2一、說說什麼是面向對象?什麼是面向過程?面向過程與面向對象的區別

「面向過程」是一種以過程爲中心的編程思想。
就是分析出解決問題所須要的步驟,而後用函數把這些步驟一步一步實現,使用的時候一個一個依次調用就能夠了。
「面向對象」(Object Oriented,簡稱OO)是一種以事物爲中心的編程思想。
就是把構成問題事務分解成各個對象,創建對象的目的不是爲了完成一個步驟,而是爲了描敘某個事物在整個解決問題的步驟中的行爲。

面向過程的優勢:流程化使得編程任務明確,在開發以前基本考慮了實現方式和最終結果;效率高,面向過程強調代碼的膽小精悍,善於結合數據結構來開發高效率的程序。。流程明確,具體步驟清楚,便於節點分析。缺點是:須要深刻的思考,耗費精力,代碼重用性低,擴展能力差,維護起來難度比較高,對複雜業務來講,面向對象的模塊話難度較高,耦合度也比較高。

面向對象的優勢:結構清晰,程序便於模塊化,結構化,抽象化,更加符合人類的思惟方式;封裝性,將事務高度抽象,從而便於流程中的行爲分析,也便於操做和自省; 容易擴展,代碼重用率高,可繼承,可覆蓋;實現簡單,可有效地減小程序的維護工做量,軟件開發效率高。面向對象的缺點:效率低,面向對象在面向過程的基礎上高度抽象,從而和代碼底層的直接交互很是少機會,從而不適合底層開發和遊戲甚至多媒體開發;複雜性,對於事務開發而言,事務自己是面向過程的,過分的封裝致使事務自己的複雜性提升。

2二、AJAX請求和普通HTTP請求區別

二者本質區別:

AJAX通xmlHttpRequest象請求服務器服務器接受請求返數據實現刷新交互

普通http請求通httpRequest象請求服務器接受請求返數據須要頁面刷新

AJAX請求頭會多一個x-requested-with參數,值爲XMLHttpRequest
String requestType = request.getHeader("X-Requested-With");  

2三、Thinkphp 5 新特性

1.支持 ComposerPHPunit(中大型項目必備的依賴管理和測試框架)
2.
使用同 yii2 同樣的類惰性加載(性能暴升)
3.
大量參考了 Laravel 風格,還保證了以往 ThinkPHP 簡單易學(優雅而且易學)
4.
引入了 php5.4 特性 Traits 拓展(多重繼承,之前的關聯模型,視圖模型混合一塊兒用)
5.
終於遵循 PSR 規範了!終於遵循 PSR 規範了!終於遵循 PSR 規範了!
符合PSR-4的自動加載規範(專門寫給CI黨:PSR-4 是命名空間的自動加載規範哦)
6.
之前單字母全局函數改爲了別名函數(MDSC等,除了易學好用還不會污染全局)
7.
兼容 php 7,局部兼容 hhvm

2四、HTTP狀態中302403 500代碼含義?

300重定向、403服務器拒絕訪問、500服務器內部錯誤。

2五、請問getpost方法有什麼區別?

咱們再網頁上填寫的表單信息均可以經過這兩個方法將數據傳遞到服務器上,當咱們使用get方法是,全部的信息都會出如今url地址中,而且使用get方法最多隻能傳遞1024個字符,因此若是在傳輸量小或者安全性不那麼重要的狀況下可使用get方法。說到post方法,最多能夠傳輸2mb字節的數據,並且能夠根據須要調節。

2六、php中獲取圖像尺寸大小的方法是什麼?

getimagesize () 獲取圖片的尺寸

imagesx () 獲取圖片的寬度

 

imagesy () 獲取圖片的高度

2七、如何用phpmysql上傳視頻?

咱們能夠在數據庫中存放視頻的地址,而不須要將真正的視頻數據存在數據庫中。能夠將視頻數據存放在服務器的指定文件夾下,上傳的默認大小是2mb,可是咱們也能夠在php.ini文件中修改max_file size選項來改變

2八、php中的錯誤類型有哪些?

php中遇到的錯誤類型大體有3類。

提示:這都是一些很是正常的信息,而非重大的錯誤,有些甚至不會展現給用戶。好比訪問不存在的變量。

警告:這是有點嚴重的錯誤,將會把警告信息展現給用戶,但不會影響代碼的輸出,好比包含一些不存在的文件。

錯誤:這是真正的嚴重錯誤,好比訪問不存在的php

2九、session機制與cookie機制?session與cookie區別?

參考session與cookie的區別與聯繫

30、引用傳值和非引用傳值的區別,何時該用引用傳值?何時該用非引用傳值?

答:按值傳遞:函數範圍內對值的改變在函數外都會被忽略。

按引用傳遞:函數範圍內對值的任何改變在函數外也將反應出這些修改。

 

按值傳遞時,php必須複製值,若是操做的是大型的對象和字符串,這將是一個代價很大的操做。按引用傳遞不須要複製值,所以對性能的提升有好處。

3一、寫幾個魔術方法並說明做用?

__call()當調用不存在的方法時會自動調用的方法

__autoload()在實例化一個還沒有被定義的類是會自動調用次方法來加載類文件

__set()當給未定義的變量賦值時會自動調用的方法

__get()當獲取未定義變量的值時會自動調用的方法

__construct()構造方法,實例化類時自動調用的方法

__destroy()銷燬對象時自動調用的方法

__unset()當對一個未定義變量調用unset()時自動調用的方法

__isset()當對一個未定義變量調用isset()方法時自動調用的方法

__clone()克隆一個對象

 

__tostring()當輸出一個對象時自動調用的方法

3二、$_REQUEST$_POST$_GET$_COOKIE$_SESSION$_FILE的意思是什麼?

答:它們都是PHP預約義變量。

$_REQUEST用來獲取postget方式提交的值

$_POST用來獲取post方式提交的值

$_GET用來獲取get方式提交的值

$_COOKIE用來獲取cookie存儲的值

$_SESSION用來獲取session存儲的值

$_FILE用來獲取上傳文件表單的值

3三、++ii++哪個效率高,爲何?

++i效率比i++的效率更高,由於++i少了一個返回i的過程。

3四、用過哪些版本控制器?說說SVN與GIT優缺點?

1SVN優缺點
優勢: 
1
、管理方便,邏輯明確,符合通常人思惟習慣。 
2
、易於管理,集中式服務器更能保證安全性。 
3
、代碼一致性很是高。 
4
、適合開發人數很少的項目開發。 
缺點: 
1
、服務器壓力太大,數據庫容量暴增。 
2
、若是不能鏈接到服務器上,基本上不能夠工做,看上面第二步,若是服務器不能鏈接上,就不能提交,還原,對比等等。 
3
、不適合開源開發(開發人數很是很是多,可是Google app engine就是用svn的)。可是通常集中式管理的有很是明確的權限管理機制(例如分支訪問限制),能夠實現分層管理,從而很好的解決開發人數衆多的問題。

2Git優缺點
優勢: 
1
、適合分佈式開發,強調個體。 
2
、公共服務器壓力和數據量都不會太大。 
3
、速度快、靈活。 
4
、任意兩個開發者之間能夠很容易的解決衝突。 
5
、離線工做。 
缺點: 
1
、學習週期相對而言比較長。 
2
、不符合常規思惟。 
3
、代碼保密性差,一旦開發者把整個庫克隆下來就能夠徹底公開全部代碼和版本信息。

3五、請問phpechoprint有什麼區別?

答:這兩個看起來很類似,由於它們都是將一些值打印在屏幕上。可是echoprint的本質區別在於:echo用來輸出字符串,顯示多個值的時候能夠用逗號隔開。只支持基本類型,print不只能夠打印字符串值,並且能夠打印函數的返回值。

 

先到這裏了,會持續更的,但願對有所須要的同行有所幫助。

相關文章
相關標籤/搜索