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