2017面試遇到的一些面試題


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

1、寫一個函數,盡可能高效的,從一個標准url里取出文件的擴展名例如: http://www.test.com.cn/abc/de/fg.PHP?id=1需要取出php或.php

 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);

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

 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 }

3、HTTP中POST、GET、PUT、DELETE方式的區別

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

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

  • 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操作。

4、優化數據庫的方法

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

2、使用連接查詢代替子查詢。

3、使用聯合查詢代替手動創建的臨時表

4、使用事務。

5、鎖定表。

6、使用外鍵。

7、使用索引

8、優化查詢語句

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

5、對於大流量網站,采用什么方法來解決訪問量的問題

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

普通的P4服務器一般最多能支持每天10萬獨立IP,如果訪問量比這個還要大,那么必須首先配置一台更高性能的專用服務器才能解決問題,否則怎么優化都不可能徹底解決性能問題。

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

讀寫分離:頻繁請求數據庫時會造成堵塞,增加數據的讀取與寫入時間。讀寫分離可使不同的數據庫分擔不同的任務,減少每個數據庫的連接數,加快數據讀取速度;

3、緩存技術的合理運用,減少數據庫的頻繁操作;

優化數據庫訪問前台實現完全的靜態化當然最好,可以完全不用訪問數據庫,不過對於頻繁更新的網站, 靜態化往往不能滿足某些功能。
      緩存技術就是另一個解決方案,就是將動態數據存儲到緩存文件中,動態網頁直接調用 這些文件,而不必再訪問數據庫,WordPress和Z-Blog都大量使用這種緩存技術      如果確實無法避免對數據庫的訪問,那么可以嘗試優化數據庫的查詢SQL.避免使用 Select * from這樣的語句,每次查詢只返回自己需要的結果,避免短時間內的大,盡量做到"所查即所得" ,遵循以小表為主,附表為輔,查詢條件先索引,先小后大的原則,提高查詢效率.量SQL查詢。

4、程序功能規則,減少外部盜鏈;

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

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

大文件的下載會占用很大的流量,並且對於非SCSI硬盤來說,大量文件下載會消耗 CPU,使得網站響應能力下降。因此,盡量不要提供超過2M的大文件下載,如果需要提供,建議將大文件放在另外一台服務器上。 

6、使用不同主機分流主要流量

將文件放在不同的主機上,提供不同的鏡像供用戶下載。比如如果覺得RSS文件占用流量大,那么使用FeedBurner或者FeedSky等服務將RSS輸出放在其他主機上,這樣別人訪問的流量壓力就大多集中在FeedBurner的主機上,RSS就不占用太多資源了

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

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

6、數據庫中的事務是什么?

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

7、了解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>

8、SQL注入漏洞產生的原因?如何防止?

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

如何防止SQL注入:

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

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

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

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

  1. 快速訪問數據表中的特定信息,提高檢索速度
  2. 創建唯一性索引,保證數據庫表中每一行數據的唯一性。
  3. 加速表和表之間的連接
  4. 使用分組和排序子句進行數據檢索時,可以顯著減少查詢中分組和排序的時間

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

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

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

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

d)、什么情況下不宜建立索引?

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

e)索引的副作用

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

10、簡述在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字節的主鍵(用戶不可見),數據是主索引的一部分,附加索引保存的是主索引的值。

11、解釋MySQL外連接、內連接與自連接的區別

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

內連接 則是只有條件的交叉連接,根據某個條件篩選出符合條件的記錄,不符合條件的記錄不會出現在結果集中,即內連接只連接匹配的行。
外連接 其結果集中不僅包含符合連接條件的行,而且還會包括左表、右表或兩個表中的所有數據行,這三種情況依次稱之為左外連接,右外連接,和全外連接。

左外連接,也稱左連接,左表為主表,左表中的所有記錄都會出現在結果集中,對於那些在右表中並沒有匹配的記錄,仍然要顯示,右邊對應的那些字段值以NULL來填充。右外連接,也稱右連接,右表為主表,右表中的所有記錄都會出現在結果集中。左連接和右連接可以互換,mysql目前還不支持全外連接。

12、列舉流行的Ajax 框架?說明 Ajax 實現原理是什么及json在 Ajax 中起什么作用?

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

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

13、談談你對MVC的認識

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

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

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

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

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

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

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

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

14、用過緩存技術嗎?說說對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()

15、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。

16、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 模型的原理作的一個假設,真正的應用還是需要實測了再說的。

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

2、Nginx 配置簡潔, Apache 復雜 ,Nginx 啟動特別容易, 並且幾乎可以做到7*24不間斷運行,即使運行數個月也不需要重新啟動. 你還能夠不間斷服務的情況下進行軟件版本的升級 . Nginx 靜態處理性能比 Apache 高 3倍以上 ,Apache 對 PHP 支持比較簡單,Nginx 需要配合其他后端來使用 ,Apache 的組件比 Nginx 多. 
3、最核心的區別在於apache是同步多進程模型,一個連接對應一個進程;nginx是異步的,多個連接(萬級別)可以對應一個進程 .
4、nginx的優勢是處理靜態請求,cpu內存使用率低,apache適合處理動態請求,所以現在一般前端用nginx作為反向代理抗住壓力,apache作為后端處理動態請求

17、用PHP寫出一個安全的用戶登錄系統需要注意哪些方面

1、密碼要使用MD5(密碼+字符串)進行加密
2、登錄表單的名稱不要跟數據庫字段一樣,以免暴露表字段.
3、要使用驗證碼驗證登陸,以防止暴力破解
4、登陸后台處理代碼數據庫部分可以使用預處理,做好過濾,防止sql注入

18、Composer是什么,怎么應用?

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

19、類的多繼承怎么實現?

一: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表示了只包含一次,避免了重復包含

21、說說什么是面向對象?什么是面向過程?面向過程與面向對象的區別

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

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

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

22、AJAX請求和普通HTTP請求區別

兩者本質區別:

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

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

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

23、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

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

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

25、請問getpost方法有什么區別?

我們再網頁上填寫的表單信息都可以通過這兩個方法將數據傳遞到服務器上,當我們使用get方法是,所有的信息都會出現在url地址中,並且使用get方法最多只能傳遞1024個字符,所以如果在傳輸量小或者安全性不那么重要的情況下可以使用get方法。說到post方法,最多可以傳輸2mb字節的數據,而且可以根據需要調節。

26、php中獲取圖像尺寸大小的方法是什么?

getimagesize () 獲取圖片的尺寸

imagesx () 獲取圖片的寬度

 

imagesy () 獲取圖片的高度

27、如何用phpmysql上傳視頻?

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

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

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

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

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

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

29、session機制與cookie機制?session與cookie區別?

參考session與cookie的區別與聯系

30、引用傳值和非引用傳值的區別,什么時候該用引用傳值?什么時候該用非引用傳值?

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

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

 

按值傳遞時,php必須復制值,如果操作的是大型的對象和字符串,這將是一個代價很大的操作。按引用傳遞不需要復制值,因此對性能的提高有好處。

31、寫幾個魔術方法並說明作用?

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

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

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

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

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

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

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

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

__clone()克隆一個對象

 

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

32、$_REQUEST$_POST$_GET$_COOKIE$_SESSION$_FILE的意思是什么?

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

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

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

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

$_COOKIE用來獲取cookie存儲的值

$_SESSION用來獲取session存儲的值

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

33、++ii++哪一個效率高,為什么?

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

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

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

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

35、請問phpechoprint有什么區別?

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

 

先到這里了,會持續更的,希望對有所需要的同行有所幫助。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM