PHP面試題集錦(3)

1、$_GET,$_POST,$_REQUEST 三者的區別

從一個簡單的理解來看在PHP中$_GET $_POST $_REQUEST都是接受數據了,get接受的是url參數而post可以說是由表單post過來的數據,而request是可以接受兩者的數據,這個就是他們基礎的區別所在了,下面一起來看看它們的區別證明。

PHP中有$_REQUEST與$_POST、$_GET用于接受表單數據。

一、$_REQUEST與$_POST、$_GET的區別和特點

$_REQUEST[]具用$_POST[] $_GET[]的功能,但是$_REQUEST[]比較慢。通過POST和GET方法提交的所有數據都可以通過$_REQUEST數組獲得。

二、$_POST、$_GET的區別和特點

1. GET是從服務器上獲取數據,POST是向服務器傳送數據。

2. GET是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,值和表單內各個字段一一對應,在URL中可以看到。POST是通過HTTP POST機制,將表單內各個字段與其內容放置在HTML HEADER內一起傳送到ACTION屬性所指的URL地址。用戶看不到這個過程。

3. 對于GET方式提交表單數據,服務器端用$_GET[‘name’]獲取變量的值,對于POST方式提交表單數據,服務器端用$_POST[‘name’]獲取提交的數據,當然,兩者都可以通過$_REQUEST[‘name’]獲得表單數據。對于REQUEST方式提交表單數據,服務器端用$_REQUEST[‘name’]獲取變量的值,但這種方式很少用。

4. GET傳送的數據量較小,不能大于2KB。POST傳送的數據量較大,一般被默認為不受限制。但理論上,一般認為不能超過100KB。

5. GET安全性非常低,POST安全性較高。

6. GET表單值可以通過_GET獲取;但通過action的url設置的參數總是獲取不到的,<form method="get" action="a.asp?b=b"></form>

跟<form method="get"action="a.asp"></form>是一樣的,也就是說,在這種情況下,GET方式會忽略action頁面后邊帶的參數列表。POST表單值可以通過_POST獲取;但通過action的url參數設置的參數則可以不能通過_POST獲取到。action=test.php?id=1這種就是GET方式傳值,可以用$_REQUEST和$_GET接受傳值,但不能用POST方式獲取到值,即使表單是POST方式提交。所在,在提交表單時,如果action中同時有參數,最好只能通過POST表單方式,對于表單內數據,直接通過POST獲取,對于action中參數,童工GET獲取。

在做數據查詢時,建議用GET方式,而在做數據添加、修改或刪除時,建議用POST方式。

request是先讀取 get再讀post 的, 同時存在, 即覆蓋掉前面的變量。

2、$_SESSION,$_COOKIE 兩者的區別與聯系


1、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。

2、cookie不是很安全,別人可以分析存放在本地的COOKIE并進行COOKIE欺騙考慮到安全應當使用session。

3、session會在一定時間內保存在服務器上。當訪問增多,會比較占用你服務器的性能考慮到減輕服務器性能方面,應當使用COOKIE。

4、單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。

cookie 和session 的聯系:

session是通過cookie來工作的

session和cookie之間是通過$_COOKIE['PHPSESSID']來聯系的,通過$_COOKIE['PHPSESSID']可以知道session的id,從而獲取到其他的信息。

3、include、require 有什么區別,include可以重復引入同一文件嗎?

:include如果引入的文件不存在,試圖繼續往下執行,報一個warning

(如果你不介意之前的內容是否被包含,之后的內容都要執行,就使用include)

而require如果引入的文件不存在,報fatal error,不再繼續執行.

(如果之前的內容一定要被包含,才允許繼續執行之后的代碼,就使用require)

4.Include/require 與 include_once /require_once的區別

_once 會自動判斷文件是否已經引入,如果引入,不再重復執行.

即:保證被包含文件只可能被引入一次.

(如果包含的文件里有定義函數,那么被包含的文件只能被包含一次,如果多次包含,就會出現函數重定義的錯誤,php是不運行函數重定義的,會出現致命錯誤,之后代碼不在運行)

=======================================================

有的文件不允許被包含多次?

可以用_once來控制,

但是,如果從文件的設計上,比較規范,能保證肯定不會出現多次包含的錯誤,

這種情況下 建議用include

因為include_once要檢測之前有沒有包含,效率沒有include高

5、寫一個函數,顯示前天的時間 (年-月-日 時:分:秒)

$a = date("Y-m-d H:i:s", strtotime("-1 day"));

6、寫一個函數,驗證郵箱的格式是否正確

function ?checkEmail($email){

? ? ? ? ? $pregEmail="/([\w\-]+\@[\w\-]+\.[\w\-]+)/";

? ? ? ? ? return ? ?preg_match($pregEmail,$email);

}

7、有一個data.txt文件,一行作為一條記錄,請寫一個函數,分頁顯示data.txt文件的內容,每頁10條記錄。

8、寫一個自動加載類

9、寫一個函數,顯示當前目錄下的文件及目錄

function ? ? my_scandir($dir)

{

? ? ? ? ? ? ?$files=array();

? ? ? ? ? ? ? if($handle= opendir($dir) ) {

? ? ? ? ? ? ? ? ? ? ? ? while( ($file= readdir($handle)) !== false ) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if($file!=".."&&$file!=".") {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if(is_dir($dir."/".$file) ) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?$files[$file] = scandir($dir."/".$file);

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?$files[] =$file;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ? ? ? ? closedir($handle);

? ? ? ? ? ? ? ? ? ? ? return$files;

? ? ? ? ? ? ? ? }

}

10、這是一個標準URL (http://127.0.0.1/test.php?type=1),請寫一個函數,用最高效的方式獲取所訪問的文件的后綴名


11、mysql數據庫中,innodb 和 myisam 區別(只少5點)


1、 存儲結構

MyISAM:每個MyISAM在磁盤上存儲成三個文件。第一個文件的名字以表的名字開始,擴展名指出文件類型。.frm文件存儲表定義。數據文件的擴展名為.MYD (MYData)。索引文件的擴展名是.MYI (MYIndex)。

InnoDB:所有的表都保存在同一個數據文件中(也可能是多個文件,或者是獨立的表空間文件),InnoDB表的大小只受限于操作系統文件的大小,一般為2GB。

2、 存儲空間

MyISAM:可被壓縮,存儲空間較小。支持三種不同的存儲格式:靜態表(默認,但是注意數據末尾不能有空格,會被去掉)、動態表、壓縮表。

InnoDB:需要更多的內存和存儲,它會在主內存中建立其專用的緩沖池用于高速緩沖數據和索引。


3、 事務支持

MyISAM:強調的是性能,每次查詢具有原子性,其執行數度比InnoDB類型更快,但是不提供事務支持。

InnoDB:提供事務支持事務,外部鍵等高級數據庫功能。 具有事務(commit)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)的事務安全(transaction-safe (ACID compliant))型表。

4、 CURD操作

MyISAM:如果執行大量的SELECT,MyISAM是更好的選擇。(因為沒有支持行級鎖),在增刪的時候需要鎖定整個表格,效率會低一些。相關的是innodb支持行級鎖,刪除插入的時候只需要鎖定改行就行,效率較高

InnoDB:如果你的數據執行大量的INSERT或UPDATE,出于性能方面的考慮,應該使用InnoDB表。DELETE 從性能上InnoDB更優,但DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的刪除,在innodb上如果要清空保存有大量數據的表,最好使用truncate table這個命令。

5、 外鍵

MyISAM:不支持

InnoDB:支持

12、有一張評論表comment(uid 用戶ID,post_id 評論ID,article_id 文章ID),請寫一條sql語句查詢出提交評論最多的3個用戶id


select ?user_id ,count(post_id) as sum_post ?from comment ?group by user_id ?order by sum_post ?desc

13、怎么解決ajax跨域請求

1、允許單個域名訪問

2、允許多個域名訪問

3、允許所有域名訪問

14、請講下你對MVC的理解


15、要實現一個在線倒計時搶購功能,需要注意哪些問題?怎么解決這些問題?


16、請講下你對高并發大訪問量的網站解決方案


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

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

其次,優化數據庫訪問。

前臺實現完全的靜態化當然最好,可以完全不用訪問數據庫,不過對于頻繁更新的網站,靜態化往往不能滿足某些功能。

緩存技術就是另一個解決方案,就是將動態數據存儲到緩存文件中,動態網頁直接調用這些文件,而不必再訪問數據庫,WordPress和Z-Blog都大量使用這種緩存技術。

如果確實無法避免對數據庫的訪問,那么可以嘗試優化數據庫的查詢SQL.避免使用Select * from這樣的語句,每次查詢只返回自己需要的結果,避免短時間內的大,盡量做到"所查即所得" ,遵循以小表為主,附表為輔,查詢條件先索引,先小后大的原則,提高查詢效率.

第三,禁止外部的盜鏈。

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

第四,控制大文件的下載。

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

第五,使用不同主機分流主要流量

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




17.你用什么方法檢查 PHP 腳本的執行效率(通常是腳本執行時間)和數據庫 SQL 的效率(通常是數據庫 Query 時間), 并定位和分析腳本執行和數據庫查詢的瓶頸所在?


1.PHP執行時間:??

$begin=microtime(true); //獲取程序開始執行的時間?

// some code here 待執行的代碼

?$stop=microtime(true);?//獲取程序執行結束的時間?

list($m0,$s0)=explode(" ",$begin);

?list($m1,$s1)=explode(" ",$stop);

?$runtime=($s1+$m1-$s0-$m0)*1000;?

echo? ? ‘當前腳本執行時間:’.$etime-$stime.'微秒';

?2.SQL執行時間(其實和上面一樣):??

$begin=microtime();

?mysql_query($sql);

?$stop=microtime();?

list($m0,$s0)=explode(" ",$begin);

?list($m1,$s1)=explode(" ",$stop);?

$runtime=round(($s1+$m1-$s0-$m0)*1000,4);?

echo '當前腳本執行時間:'.$runtime.'ms';

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,991評論 19 139
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,778評論 18 399
  • 隨著房價壓力與日俱增,不少人抱著先有再置換的想法,買了小戶型的房子作為過渡,但即使房子小,但想要積極生活的心卻不減...
    居之使然閱讀 3,864評論 1 6
  • 最近經常看到這句話:你知道了很多,卻為什么過不好自己的人生?令我想到了另外一句話:看不見的能量影響著看的見的人生。...
    谷應閱讀 1,202評論 0 1