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