PHP面試題集錦(3)

1、$_GET,$_POST,$_REQUEST 三者的區(qū)別

從一個(gè)簡(jiǎn)單的理解來(lái)看在PHP中$_GET $_POST $_REQUEST都是接受數(shù)據(jù)了,get接受的是url參數(shù)而post可以說(shuō)是由表單post過(guò)來(lái)的數(shù)據(jù),而request是可以接受兩者的數(shù)據(jù),這個(gè)就是他們基礎(chǔ)的區(qū)別所在了,下面一起來(lái)看看它們的區(qū)別證明。

PHP中有$_REQUEST與$_POST、$_GET用于接受表單數(shù)據(jù)。

一、$_REQUEST與$_POST、$_GET的區(qū)別和特點(diǎn)

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

二、$_POST、$_GET的區(qū)別和特點(diǎn)

1. GET是從服務(wù)器上獲取數(shù)據(jù),POST是向服務(wù)器傳送數(shù)據(jù)。

2. GET是把參數(shù)數(shù)據(jù)隊(duì)列加到提交表單的ACTION屬性所指的URL中,值和表單內(nèi)各個(gè)字段一一對(duì)應(yīng),在URL中可以看到。POST是通過(guò)HTTP POST機(jī)制,將表單內(nèi)各個(gè)字段與其內(nèi)容放置在HTML HEADER內(nèi)一起傳送到ACTION屬性所指的URL地址。用戶(hù)看不到這個(gè)過(guò)程。

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

4. GET傳送的數(shù)據(jù)量較小,不能大于2KB。POST傳送的數(shù)據(jù)量較大,一般被默認(rèn)為不受限制。但理論上,一般認(rèn)為不能超過(guò)100KB。

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

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

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

在做數(shù)據(jù)查詢(xún)時(shí),建議用GET方式,而在做數(shù)據(jù)添加、修改或刪除時(shí),建議用POST方式。

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

2、$_SESSION,$_COOKIE 兩者的區(qū)別與聯(lián)系


1、cookie數(shù)據(jù)存放在客戶(hù)的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上。

2、cookie不是很安全,別人可以分析存放在本地的COOKIE并進(jìn)行COOKIE欺騙考慮到安全應(yīng)當(dāng)使用session。

3、session會(huì)在一定時(shí)間內(nèi)保存在服務(wù)器上。當(dāng)訪問(wèn)增多,會(huì)比較占用你服務(wù)器的性能考慮到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用COOKIE。

4、單個(gè)cookie保存的數(shù)據(jù)不能超過(guò)4K,很多瀏覽器都限制一個(gè)站點(diǎn)最多保存20個(gè)cookie。

cookie 和session 的聯(lián)系:

session是通過(guò)cookie來(lái)工作的

session和cookie之間是通過(guò)$_COOKIE['PHPSESSID']來(lái)聯(lián)系的,通過(guò)$_COOKIE['PHPSESSID']可以知道session的id,從而獲取到其他的信息。

3、include、require 有什么區(qū)別,include可以重復(fù)引入同一文件嗎?

:include如果引入的文件不存在,試圖繼續(xù)往下執(zhí)行,報(bào)一個(gè)warning

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

而require如果引入的文件不存在,報(bào)fatal error,不再繼續(xù)執(zhí)行.

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

4.Include/require 與 include_once /require_once的區(qū)別

_once 會(huì)自動(dòng)判斷文件是否已經(jīng)引入,如果引入,不再重復(fù)執(zhí)行.

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

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

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

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

可以用_once來(lái)控制,

但是,如果從文件的設(shè)計(jì)上,比較規(guī)范,能保證肯定不會(huì)出現(xiàn)多次包含的錯(cuò)誤,

這種情況下 建議用include

因?yàn)閕nclude_once要檢測(cè)之前有沒(méi)有包含,效率沒(méi)有include高

5、寫(xiě)一個(gè)函數(shù),顯示前天的時(shí)間 (年-月-日 時(shí):分:秒)

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

6、寫(xiě)一個(gè)函數(shù),驗(yàn)證郵箱的格式是否正確

function ?checkEmail($email){

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

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

}

7、有一個(gè)data.txt文件,一行作為一條記錄,請(qǐng)寫(xiě)一個(gè)函數(shù),分頁(yè)顯示data.txt文件的內(nèi)容,每頁(yè)10條記錄。

8、寫(xiě)一個(gè)自動(dòng)加載類(lèi)

9、寫(xiě)一個(gè)函數(shù),顯示當(dāng)前目錄下的文件及目錄

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、這是一個(gè)標(biāo)準(zhǔn)URL (http://127.0.0.1/test.php?type=1),請(qǐng)寫(xiě)一個(gè)函數(shù),用最高效的方式獲取所訪問(wèn)的文件的后綴名


11、mysql數(shù)據(jù)庫(kù)中,innodb 和 myisam 區(qū)別(只少5點(diǎn))


1、 存儲(chǔ)結(jié)構(gòu)

MyISAM:每個(gè)MyISAM在磁盤(pán)上存儲(chǔ)成三個(gè)文件。第一個(gè)文件的名字以表的名字開(kāi)始,擴(kuò)展名指出文件類(lèi)型。.frm文件存儲(chǔ)表定義。數(shù)據(jù)文件的擴(kuò)展名為.MYD (MYData)。索引文件的擴(kuò)展名是.MYI (MYIndex)。

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

2、 存儲(chǔ)空間

MyISAM:可被壓縮,存儲(chǔ)空間較小。支持三種不同的存儲(chǔ)格式:靜態(tài)表(默認(rèn),但是注意數(shù)據(jù)末尾不能有空格,會(huì)被去掉)、動(dòng)態(tài)表、壓縮表。

InnoDB:需要更多的內(nèi)存和存儲(chǔ),它會(huì)在主內(nèi)存中建立其專(zhuān)用的緩沖池用于高速緩沖數(shù)據(jù)和索引。


3、 事務(wù)支持

MyISAM:強(qiáng)調(diào)的是性能,每次查詢(xún)具有原子性,其執(zhí)行數(shù)度比InnoDB類(lèi)型更快,但是不提供事務(wù)支持。

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

4、 CURD操作

MyISAM:如果執(zhí)行大量的SELECT,MyISAM是更好的選擇。(因?yàn)闆](méi)有支持行級(jí)鎖),在增刪的時(shí)候需要鎖定整個(gè)表格,效率會(huì)低一些。相關(guān)的是innodb支持行級(jí)鎖,刪除插入的時(shí)候只需要鎖定改行就行,效率較高

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

5、 外鍵

MyISAM:不支持

InnoDB:支持

12、有一張?jiān)u論表comment(uid 用戶(hù)ID,post_id 評(píng)論ID,article_id 文章ID),請(qǐng)寫(xiě)一條sql語(yǔ)句查詢(xún)出提交評(píng)論最多的3個(gè)用戶(hù)id


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

13、怎么解決ajax跨域請(qǐng)求

1、允許單個(gè)域名訪問(wèn)

2、允許多個(gè)域名訪問(wèn)

3、允許所有域名訪問(wèn)

14、請(qǐng)講下你對(duì)MVC的理解


15、要實(shí)現(xiàn)一個(gè)在線倒計(jì)時(shí)搶購(gòu)功能,需要注意哪些問(wèn)題?怎么解決這些問(wèn)題?


16、請(qǐng)講下你對(duì)高并發(fā)大訪問(wèn)量的網(wǎng)站解決方案


首先,確認(rèn)服務(wù)器硬件是否足夠支持當(dāng)前的流量。

普通的P4服務(wù)器一般最多能支持每天10萬(wàn)獨(dú)立IP,如果訪問(wèn)量比這個(gè)還要大,那么必須首先配置一臺(tái)更高性能的專(zhuān)用服務(wù)器才能解決問(wèn)題,否則怎么優(yōu)化都不可能徹底解決性能問(wèn)題。

其次,優(yōu)化數(shù)據(jù)庫(kù)訪問(wèn)。

前臺(tái)實(shí)現(xiàn)完全的靜態(tài)化當(dāng)然最好,可以完全不用訪問(wèn)數(shù)據(jù)庫(kù),不過(guò)對(duì)于頻繁更新的網(wǎng)站,靜態(tài)化往往不能滿(mǎn)足某些功能。

緩存技術(shù)就是另一個(gè)解決方案,就是將動(dòng)態(tài)數(shù)據(jù)存儲(chǔ)到緩存文件中,動(dòng)態(tài)網(wǎng)頁(yè)直接調(diào)用這些文件,而不必再訪問(wèn)數(shù)據(jù)庫(kù),WordPress和Z-Blog都大量使用這種緩存技術(shù)。

如果確實(shí)無(wú)法避免對(duì)數(shù)據(jù)庫(kù)的訪問(wèn),那么可以嘗試優(yōu)化數(shù)據(jù)庫(kù)的查詢(xún)SQL.避免使用Select * from這樣的語(yǔ)句,每次查詢(xún)只返回自己需要的結(jié)果,避免短時(shí)間內(nèi)的大,盡量做到"所查即所得" ,遵循以小表為主,附表為輔,查詢(xún)條件先索引,先小后大的原則,提高查詢(xún)效率.

第三,禁止外部的盜鏈。

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

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

大文件的下載會(huì)占用很大的流量,并且對(duì)于非SCSI硬盤(pán)來(lái)說(shuō),大量文件下載會(huì)消耗CPU,使得網(wǎng)站響應(yīng)能力下降。因此,盡量不要提供超過(guò)2M的大文件下載,如果需要提供,建議將大文件放在另外一臺(tái)服務(wù)器上。

第五,使用不同主機(jī)分流主要流量

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




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


1.PHP執(zhí)行時(shí)間:??

$begin=microtime(true); //獲取程序開(kāi)始執(zhí)行的時(shí)間?

// some code here 待執(zhí)行的代碼

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

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

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

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

echo? ? ‘當(dāng)前腳本執(zhí)行時(shí)間:’.$etime-$stime.'微秒';

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

$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 '當(dāng)前腳本執(zhí)行時(shí)間:'.$runtime.'ms';

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,551評(píng)論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,673評(píng)論 18 399
  • 隨著房?jī)r(jià)壓力與日俱增,不少人抱著先有再置換的想法,買(mǎi)了小戶(hù)型的房子作為過(guò)渡,但即使房子小,但想要積極生活的心卻不減...
    居之使然閱讀 3,979評(píng)論 1 6
  • 最近經(jīng)??吹竭@句話(huà):你知道了很多,卻為什么過(guò)不好自己的人生?令我想到了另外一句話(huà):看不見(jiàn)的能量影響著看的見(jiàn)的人生。...
    谷應(yīng)閱讀 1,250評(píng)論 0 1

友情鏈接更多精彩內(nèi)容