php 常見問題總結

1. Include 與 require的區別,require和require_once的效率哪個高?

  Php在遇到include時就解釋一次,如果頁面中出現10次include,php就解釋10次,而php遇到require時只解釋一次,即使頁面出現多次require也只解釋一次,因此require的執行表率比include高。

Php使用require包含文件時將被包含的文件當成當前文件的一個組成部分,如果被包含的文件中有語法錯誤或者被包含的文件不存在,則php腳本將不再執行,並提示錯誤。

Php使用include包含文件時相當於指定了這個文件的路徑,當被包含的文件有語法錯誤或者被包含的文件不存在時給出警告,不影響本身腳本的運行。

Include在包含文件時可以判斷文件是否包含,而require則不管任何情況都包含進來。

Require的效率比require_once的效率更高,因爲require_once在包含文件時要進行判斷文件是否已經被包含。

2. Cookie和session的區別,禁止了cookie後session能正常使用嗎?session的缺點是什麼?session在服務器端是存在哪裏的?是共有的還是私有的?

  COOKIE保存在客戶端,用戶通過手段可以進行修改,不安全,單個cookie允許的最大值是3k。而SESSION保存在服務器端,相對比較安全,大小沒有限制。

當客戶端的Cookie被禁用或出現問題時,PHP會自動把Session ID附着在URL中,這樣再通過Session ID就能跨頁使用Session變量了。但這種附着也是有一定條件的,即“php.ini中的session.use_trans_sid = 1“,或者編譯時打開打開了“--enable-trans-sid”選項。
    在php.ini文件中
session.use_trans_sid=1
session.use_only_cookies=0
session.use_cookies=1
或者 在php程序中
ini_set(“session.use_trans_sid”,”1″);
ini_set(“session.use_only_cookies”,0);
ini_set(“session.use_cookies”,1
瀏覽器禁用cookie之後還可以使用session。因爲cookie被禁止之後,可以通過url傳遞,在需要限制的頁面的URL中都加上sessionid。服務器端在get到這個sessionid後,在session_start之前,設置一下得到的id就可以和用戶進行關聯,效果和cookie存sessionid一樣。
    cookie分兩種,一種可以叫做session cookie,瀏覽器關閉就會丟失
一種可以叫做persistent cookie,就是我們通常意義上所說的cookie。
通常服務器端的session是藉助於seesion cookie來和客戶端交互的。
但如果客戶端禁用了cookie的話,session還可以藉助於url來和客戶端交互。
cookie 是在客戶端磁盤上存數據 session是存在服務器端的內存中

Session的缺點:保存在服務器端,每次讀取都從服務器進行讀取,對服務器有資源消耗。

Session保存在服務器端的文件或數據庫中,默認保存在文件中,文件路徑由php配置文件的session.save_path指定。

Session文件是公有的。

3. 怎麼防止sql注入?

1、過濾掉一些常見的數據庫操作關鍵字:select,insert,update,delete,and,*等

或者通過系統函數:addslashes(需要被過濾的內容)來進行過濾。

 2、在PHP配置文件中

Register_globals=off;設置爲關閉狀態 //作用將註冊全局變量關閉。

比如:接收POST表單的值使用$_POST['user'],如果將register_globals=on;直接使用$user可以接收表單的值。

 3、SQL語句書寫的時候儘量不要省略小引號(tab鍵上面那個)和單引號

 4、提高數據庫命名技巧,對於一些重要的字段根據程序的特點命名,取不易被猜到的

 5、對於常用的方法加以封裝,避免直接暴漏SQL語句

 6、開啓PHP安全模式

Safe_mode=on;

 7、打開magic_quotes_gpc來防止SQL注入

Magic_quotes_gpc=off;默認是關閉的,它打開後將自動把用戶提交的sql語句的查詢進行轉換,把'轉爲\',這對防止sql注入有重大作用。

因此開啓:magic_quotes_gpc=on;

 8、控制錯誤信息

關閉錯誤提示信息,將錯誤信息寫到系統日誌。

9、使用mysqli或pdo預處理。

4. 數據庫索引有幾類,分別是什麼?什麼時候該用索引

 普通索引、主鍵索引、唯一索引

  並非所有的數據庫都以相同的方式使用索引,作爲通用規則,只有當經常查詢列中的數據時才需要在表上創建索引。

5. 引用傳值和非引用傳值的區別,什麼時候該用引用傳值?什麼時候該用非引用傳值?

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

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

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

當需要在函數內改變源變量的值時用引用傳遞,如果不想改變原變量的值用傳值。

6. 寫幾個魔術方法並說明作用?

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

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

7. 數組中下標最好是什麼類型的,爲什麼?

數組的下標最好是數字類型的,數字類型的處理速度快。

8. ++i和i++哪一個效率高,爲什麼?

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

9.magic_quotes_gpc()、magic_quotes_runtime()的意思是什麼?

Magic_quotes_gpc()是php配置文件中的,如果設置爲on則會自動POST,GET,COOKIE中的字符串進行轉義,在'之前加\

Magic_quotes_runtime()是php中的函數,如果參數爲true則會數據庫中取出來的單引號、雙引號、反斜線自動加上反斜槓進行轉義。

10.寫幾個魔術方法並說明作用?

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

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

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

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

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

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

__clone()克隆一個對象

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

11.Echo()、print()、print_r()的區別?

Echo() 是PHP語法,可以輸出多個值,不能輸出數組,echo不是函數,沒有返回值。

Print() 是php的語言結構,是打印字符串,可以輸出單個簡單類型的變量值,是一個函數有返回值,所以如果只是輸出,echo會更快。

Print_r() 是php函數,可以打印出複雜類型變量的值,如數組,對象。

12.談談你對Mvc的認識

MVC是一種設計模式,強制使輸入、處理、輸出分開,MVC的三個核心部分:M模型,V視圖,C控制器。

視圖就是用戶看到並與之交互的界面。

模型就是程序的數據業務規則。

控制器接收用戶的數組調用模型和視圖去完成用戶需求。

使用MVC的優點:低耦合、高重用性、較低的生命週期成本、快速開發部署、可維護性、可擴展性,有利於軟件工程化管理。

MVC的缺點:沒有明確的定義,完全理解並不容易。小型項目不適合用MVC。

13.框架中什麼是單一入口和多入口,單一入口的優缺點

多入口就是通過訪問不同的文件來完成用戶請求。

單一入口只web程序所有的請求都指向一個腳本文件的。

單一入口更容易控制權限,方便對http請求可以進行安全性檢查。

缺點:URL看起來不那麼美觀,特別是對搜索引擎來說不友好。

14.打印一個用‘.’鏈接的字符串時候,還可以用什麼代替‘.’鏈接效率更高些?

可以用,代替.,效率更高。

15.提示類型200、404、502是什麼意思?

200是請求成功,404是文件未找到,502是服務器內部錯誤,300重定向,403服務器拒絕訪問,500服務器內部錯誤

16.編寫一個自定義函數提取這段路徑的的後綴名。

“Www/hello/test.php.html?a=3&b=4”

Function geturltype($url){

$info=parse_url($url);

Return end(explode('.',$info['path']));

}

17.你對Memcach的理解,優點有哪些?

Memcache是一種緩存技術,在一定的時間內將動態網頁經過解析之後保存到文件,下次訪問時動態網頁就直接調用這個文件,而不必在重新訪問數據庫。使用memcache做緩存的好處是:提高網站的訪問速度,減輕高併發時服務器的壓力。

Memcache的優點:穩定、配置簡單、多機分佈式存儲、速度快

18.談談你對php的基本認識

php是Hypertext Preprocessor(超文本預處理的簡稱),是一種用來開發動態網站的服務器端腳本語言

19.在一個頁面上有幾種方式添加css

三種:(1)引用外部css文件  (2)引用內部css文件  (3)引用內聯css樣式

20.PHP支持多繼承嗎?
不支持。PHP中只允許單繼承,父類可以被一個子類用關鍵字“extends”繼承。

21.表單中 get與post提交方法的區別?
get是發送請求HTTP協議通過url參數傳遞進行接收,而post是實體數據,可以通過表單提交大量信息.

22.數據庫中的事務是什麼?
事務(transaction)是作爲一個單元的一組有序的數據庫操作。如果組中的所有操作都成功,則認爲事務成功,即使只有一個操作失敗,事務也不成功。如果所有操作完成, 
事務則提交,其修改將作用於所有其他數據庫進程。如果一個操作失敗,則事務將回滾,該事務所有操作的影響都將取消。

23..解釋下PHP類中:protected,public,prtvate,interface,abstract ,final,static的含義?

protected受保護的,在本類和子類中有效.

public 公共的,在本類,子類中,類外都可以用

private私有的,只在本類中有用

interface定義一個接口時使用的關鍵字

abstract定義一個抽象類或者抽象方法時使用的關鍵字.

final用final申明的方法無法被覆蓋,用final申明的類不能被繼承

static定義一個靜態方法或者靜態屬性使用的關鍵字

24.描述下大流量高併發量網站的解決方案

確認服務器硬件是否足夠支持當前的流量

使用memcache緩存技術,將動態數據緩存到內存中,動態網直接調用這些文件不必再訪問數據庫

禁用外部盜鏈,外部網站的圖片或者文件盜鏈往往會帶來大量的負載壓力,因此應該嚴格限制外部對自身圖片或者文件盜鏈.目前可以簡單的通refer來控制盜鏈.apache自己就可以通過配置來禁止盜鏈.

控制大文件的下載,大文件下載會佔很大的流量.對於非SCSI硬盤來說會消耗,使得網站響應能力下降.

使用不迥的主機分流主要流量,使用流量統計軟件可以知道哪些地方不費大量流量,哪些頁面需要再進行優化

分庫分表

sphinx全文索引引擎

25.linux下建立壓縮包,解壓縮包的命令

壓縮:gzip tar -cvfz,zip,bzip2

解壓:gunzip,tar -zxvf,unzip,bunzip2

26.用PHP寫出顯示客戶端IP與服務器IP的代碼1分)

$_SERVER["REMOTE_ADDR"]
$_SERVER["SERVER_ADDR"]





 

 

 

 

 

 





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章