三、PHP網絡編程
[!!!]1.禁用COOKIE后SEESION還能用嗎?(51.com筆試題)
可以,COOKIE和SESSION都是用來實現會話機制的,由於http協議是無狀態的,所以要想跟蹤一個用戶在同一個網站之間不同頁面的狀態,需要有這么一個機制----會話機制。
COOKIE:將會話信息的保存到瀏覽器端。
SESSION:將會話信息保存到服務器端。
SESSION默認情況下是基於COOKIE的,對於SESSION來說,每生成一個SESSIONID,都會將其發送到瀏覽器端,讓后將其保存到cookie當中。
如果禁用了COOKIE,則基於COOKIE的SESSION不好使了,我們可以使用get,傳遞SID,或者直接開啟透明的SID(此時需要關閉基於cookie的SESSION配置項)。
[!!!]相關題目:SESSION與COOKIE的區別?
- COOKIE保存在客戶端,而SESSION則保存服務器端。
- 從安全性的角度來講,SESSION的安全性要高。
- 從保存內容的類型的角度來講,COOKIE只保存字符串(及能夠自動轉換成字符串),而session則可以保存所有的數據類型。
- 從保存內容的大小的角度來講,COOKIE保存的內容是有限制的,比較小,而SESSION基本上沒有這個限制。
- 從性能的角度來講,用SESSION的話,對服務器的壓力會更大一些。
2.請使用socket相關函數(非curl)實現如下功能:構造一個post請求,發送到指定httpserver的指定端口的指定請求路徑(如http://www.example.com:8080/test
)。請求中包含以下變量:
用戶名(username):溫柔一刀
密碼(pwd):&123=321&321=123&
個人簡介(intro):Hello world!
且該http server需要以下cookie來進行簡單的用戶動作跟蹤:
cur_query:you&me
last_tm:...(上次請求的unix時間戳,定為當前請求時間前10分鍾)
cur_tm:...(當前請求的unix時間戳)
設置超時為10秒,發出請求后,將http server的響應內容輸出(騰訊)
參考代碼:
<?php
if($fp = fsockopen('localhost','80')){
//連接成功
$request_data="POST/2.php HTTP/1.1"."\r\n";//請求行
$request_data.="Host:localhost"."\r\n";//host頭信息
$request_data.="User-Agent:Mozilla/5.0(compatible;MSIE 9.0;Windows NT 6.1;Trident/5.0)"."\r\n";//host頭信息
$request_content="username=".urlencode('溫柔一刀')
."&pwd=".urlencode('&123=321&321=123&')
."&intro=".urlencode("Hello world!");
$request_data.="Content-Type:application/x-www-form-urlencoded"."\r\n";
$request_data.="Content-Length:".strlen($request_content)."\r\n";
$cur_query=urlencode("you&me");
$last_tm=time()-10*60;
$cur_tm=time();
$request_data.="Cookie:cur_query=$cur_query;last_tm=$last_tm;cur_tm=$cur_tm"."\r\n";
$request_data.="\r\n";//請求頭信息結束時的空行
//請求主體數據部分
$request_data.=$request_content;
//利用建立好的通道,將數據發送過去
fwrite($fp,$request_data);//寫入數據(發送數據)
//讀取數據
while(!feof($fp)){//判斷是否沒有到文件末尾
$resp_data=fgets($fp);
echo$resp_data.'<br>';
}
}
?>
3.在HTTP 1.0中,狀態碼401的含義是________;如果返回“找不到文件”的提示,則可用header函數,其語句為__________;
未經授權:訪問由於憑據無效被拒絕
header("HTTP/1.0 404 Not Found")
[!!]4.如何修改SESSION的生存時間?
要注意這里的生存時間指的是什么?
由於session默認是基於cookie的,也就是說使用session會話技術,首先是將session數據保存到服務器端,其次會將sessionID保存到瀏覽器端,保存在服務器端的session文件生命周期由php.ini中的session.gc_maxlifetime、gc_probability和gc_divisor來決定,而保存在客戶端的sessionID由客戶端cookie來決定。
默認其生存周期直到瀏覽器關閉,它也可以通過php.ini中的設置session.cookie_lifetime來控制,二者共同來決定session的生存時間,二者中的其中任意一個失效了,就會造成session失效,要根據自己的需求來決定是要從哪方面來修改其生存時間。
參考1:將php.ini中的session.gc_maxlifetime設置為9999重啟apache
參考2:
$savePath="./session_save_dir/";
$lifeTime=小時*秒;
session_save_path($savePath);
session_set_cookie_params($lifeTime);
session_start();
參考3:
session_start();
$lifeTime=24*3600;//保存一天
setcookie(session_name(),session_id(),time()+$lifeTime,"/");
5.How can you get round the stateless nature of HTTP using PHP?(Yahoo)
最主要的兩個選擇是SESSION和COOKIE。使用SESSION的方法是在每一頁的開始加session_start(),然后利用$_SESSION來存取SESSION變量。至於COOKIE你只需記着一個原則:在輸出任何文字之前調用set_cookie()函數設置COOKIE,使用$_COOKIE獲取COOKIE變量。
6.PHP程序中如何設置當前頁面的編碼為utf-8?
header(“content-type:text/html;charset=utf-8”);
7.如何設置一個cookie的名字為username,值為jack,並且讓此cookie一周后失效?
setcookie(‘username’,’jack’,time()+7243600);
[!!]8.一個瀏覽器最多可以產生多少個cookie,每個cookie文件最大不能超過多少?
cookie的總數量沒有限制,但是每個域名的COOKIE數量和每個COOKIE的大小是有限制的!
IE每個域名限制為50個。
Firefox每個域名cookie限制為50個。
Opera每個域名cookie限制為30個。
Safari/webkit貌似沒有cookie限制。但是假如cookie很多,則會使header大小超過服務器的處理的限制,會導致錯誤發生。
不同瀏覽器間每個cookie文件大小也不同
Firefox和safari是4097個字節,包括名(name)、值(value)和等號。
Opera是4096個字節,包括:名(name)、值(value)和等號。
IE是4095個字節,包括:名(name)、值(value)和等號。
9.設置或讀取session之前,需要做什么?
session_start()前面不能有任何輸出,包括空行。
相關題目:使用setcookie函數前,需要注意什么?
前面不能有任何輸出,包括空行。
10.請描述出七層網絡模型的名稱,由下到上(可以使用中文描述)
物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層
11.說說下面這些這些協議的全稱和中文解釋(提示:都是工作在應用層)SMTP、POP3、HTTP、FTP、DNS(小米)
SMTP(Simple Mail Transfer Protocol)簡單郵件傳輸協議
POP3(Post Office Protocol 3)郵局協議第3版
HTTP(Hypertext Transfer Protocol)超文本傳輸協議
FTP(File Transfer Protocol)文件傳輸協議
DNS(Domain Name System and Domain Name Service protocol)域名系統(服務)協議
[!!]12.COOKIE、SESSION的聯系和區別,多台web服務器如何共享SESSION?
COOKIE和SESSION都是用於會話機制,COOKIE保存在客戶端,而SESSION則保存在服務器端。
在默認情況下,SESSION機制是基於COOKIE的,每生成一個SESSIONID,都會將其發送到瀏覽器端,讓后將其保存到COOKIE當中,在下次請求的時候,由瀏覽器攜帶這個COOKIE。
要想多台web服務器共享SESSION,可以利用MySQL數據庫存儲SESSION數據。
13.HTTP/1.0中,狀態碼200 301 304 403 404 500的含義(小米)
200 OK服務器成功處理了請求
301 Moved Permanently(重定向)請求的URL已移走
304 Not Modified(未修改)客戶的緩存資源是最新的,要客戶端使用緩存
403 Forbidden(禁止)請求被服務器拒絕了
404 Not Found未找到資源
Internal Server Error(內部服務器錯誤)服務器遇到一個錯誤,使其無法為請求提供服務
[!!!]14.請描述PHP(或其他語言)Session的運行機制,大型網站中Session方面應注意什么?(小米)
session機制是一種服務器端的機制,它將數據保存到服務器端。
當程序需要為某個客戶端的請求創建一個session的時候,服務器首先檢查這個客戶端的請求里是否已包含了一個session標識,稱為sessionid,如果已包含一個sessionid則說明以前已經為此客戶端創建過session,服務器就按照sessionid把這個session檢索出來使用(如果檢索不到,可能會新建一個),如果客戶端請求不包含sessionid,則為此客戶端創建一個session並且生成一個與此session相關聯的sessionid,sessionid的值應該是一個既不會重復,又不容易被找到規律以仿造的字符串,這個sessionid將被在本次響應中返回給客戶端以cookie的形式保存。
session在大訪問量網站上確實影響系統性能,影響性能的原因之一由文件系統設計造成,在同一個目錄下超過10000個文件時,文件的定位將非常耗時。另外就是小文件的效率問題,一般我們的session數據都不會太大(1~2K),如果有大量這樣1~2K的文件在磁盤上,IO效率肯定會很差,我們可以采用改寫session存儲機制,比如存放到數據庫中。
15.在子網掩碼為255.255.255.248的局域網中能夠同時使用的IP有多少個?(億郵)
6個,255.255.255.248換算成二進制就是11111111.11111111.11111111.11111000
后面的三位用來表示主機,前面的29位用來表示網絡。
三位表示主機,就是可以用來表示2^3=8個,再減去網絡地址和廣播地址,就是6個了。
16.簡述Tcp協議的三次握手過程。(億郵)
TCP是主機對主機層的傳輸控制協議,提供可靠的連接服務,采用三次握手確認建立一個連接:
第一次握手:建立連接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。
完成三次握手,客戶端與服務器開始傳送數據。
17.你會用哪個函數設置當前內容的Content-Type?(卓望)
header函數
18.通過頁面輸入用戶名abc和密碼123登錄到www.10086.cn,請寫出該次請求的HTTP協議報文(包括請求行、消息報頭、請求正文)。(卓望)
POST www.10086.cn HTTP/1.1
Accept:text/html,application/xhtml+xml,*/*
Referer:http://localhost/a.html
Accept-Language:zh-CN
User-Agent:Mozilla/5.0(compatible;MSIE 10.0;Windows NT 6.1;WOW64;Trident/6.0;
KB974487)
Content-Type:application/x-www-form-urlencoded
Accept-Encoding:gzip,deflate
Host:localhost
Content-Length:25
Connection:Keep-Alive
username=abc&password=123