php面試題之三——PHP網絡編程(高級部分)


三、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的區別?
  1. COOKIE保存在客戶端,而SESSION則保存服務器端。
  2. 從安全性的角度來講,SESSION的安全性要高。
  3. 從保存內容的類型的角度來講,COOKIE只保存字符串(及能夠自動轉換成字符串),而session則可以保存所有的數據類型。
  4. 從保存內容的大小的角度來講,COOKIE保存的內容是有限制的,比較小,而SESSION基本上沒有這個限制。
  5. 從性能的角度來講,用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_maxlifetimegc_probabilitygc_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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM