PHP面試題之四 (高級部分)--- 2021-09-16

PHP網(wǎng)絡(luò)編程
[!!!]1.禁用COOKIE后SEESION還能用嗎?(51.com筆試題)
可以,COOKIE和SESSION都是用來實現(xiàn)會話機制的,由于http協(xié)議是無狀態(tài)的,所以要想跟蹤一個用戶在同一個網(wǎng)站之間不同頁面的狀態(tài),需要有這么一個機制----會話機制。
COOKIE:將會話信息的保存到瀏覽器端。
SESSION:將會話信息保存到服務(wù)器端。

SESSION默認(rèn)情況下是基于COOKIE的,對于SESSION來說,每生成一個SESSIONID,都會將其發(fā)送到瀏覽器端,讓后將其保存到cookie當(dāng)中。
如果禁用了COOKIE,則基于COOKIE的SESSION不好使了,我們可以使用get,傳遞SID,或者直接開啟透明的SID(此時需要關(guān)閉基于cookie的SESSION配置項)。

[!!!]相關(guān)題目:SESSION與COOKIE的區(qū)別?
COOKIE保存在客戶端,而SESSION則保存服務(wù)器端。
從安全性的角度來講,SESSION的安全性要高。
從保存內(nèi)容的類型的角度來講,COOKIE只保存字符串(及能夠自動轉(zhuǎn)換成字符串),而session則可以保存所有的數(shù)據(jù)類型。
從保存內(nèi)容的大小的角度來講,COOKIE保存的內(nèi)容是有限制的,比較小,而SESSION基本上沒有這個限制。
從性能的角度來講,用SESSION的話,對服務(wù)器的壓力會更大一些。
2.請使用socket相關(guān)函數(shù)(非curl)實現(xiàn)如下功能:構(gòu)造一個post請求,發(fā)送到指定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時間戳,定為當(dāng)前請求時間前10分鐘)
cur_tm:...(當(dāng)前請求的unix時間戳)
設(shè)置超時為10秒,發(fā)出請求后,將http server的響應(yīng)內(nèi)容輸出(騰訊)

參考代碼:

<?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";//請求頭信息結(jié)束時的空行

        //請求主體數(shù)據(jù)部分
        $request_data.=$request_content;
        //利用建立好的通道,將數(shù)據(jù)發(fā)送過去
        fwrite($fp,$request_data);//寫入數(shù)據(jù)(發(fā)送數(shù)據(jù))

        //讀取數(shù)據(jù)
        while(!feof($fp)){//判斷是否沒有到文件末尾
            $resp_data=fgets($fp);
            echo$resp_data.'<br>';
        }
    }
?>

3.在HTTP 1.0中,狀態(tài)碼401的含義是________;如果返回“找不到文件”的提示,則可用header函數(shù),其語句為__________;
未經(jīng)授權(quán):訪問由于憑據(jù)無效被拒絕
header("HTTP/1.0 404 Not Found")

4.如何修改SESSION的生存時間?
要注意這里的生存時間指的是什么?
由于session默認(rèn)是基于cookie的,也就是說使用session會話技術(shù),首先是將session數(shù)據(jù)保存到服務(wù)器端,其次會將sessionID保存到瀏覽器端,保存在服務(wù)器端的session文件生命周期由php.ini中的session.gc_maxlifetime、gc_probability和gc_divisor來決定,而保存在客戶端的sessionID由客戶端cookie來決定。
默認(rèn)其生存周期直到瀏覽器關(guān)閉,它也可以通過php.ini中的設(shè)置session.cookie_lifetime來控制,二者共同來決定session的生存時間,二者中的其中任意一個失效了,就會造成session失效,要根據(jù)自己的需求來決定是要從哪方面來修改其生存時間。

參考1:將php.ini中的session.gc_maxlifetime設(shè)置為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你只需記著一個原則:在輸出任何文字之前調(diào)用set_cookie()函數(shù)設(shè)置COOKIE,使用_COOKIE獲取COOKIE變量。

6.PHP程序中如何設(shè)置當(dāng)前頁面的編碼為utf-8?
header(“content-type:text/html;charset=utf-8”);

7.如何設(shè)置一個cookie的名字為username,值為jack,并且讓此cookie一周后失效?
setcookie(‘username’,’jack’,time()+7243600);

8.一個瀏覽器最多可以產(chǎn)生多少個cookie,每個cookie文件最大不能超過多少?
cookie的總數(shù)量沒有限制,但是每個域名的COOKIE數(shù)量和每個COOKIE的大小是有限制的!
IE每個域名限制為50個。
Firefox每個域名cookie限制為50個。
Opera每個域名cookie限制為30個。
Safari/webkit貌似沒有cookie限制。但是假如cookie很多,則會使header大小超過服務(wù)器的處理的限制,會導(dǎo)致錯誤發(fā)生。

不同瀏覽器間每個cookie文件大小也不同
Firefox和safari是4097個字節(jié),包括名(name)、值(value)和等號。
Opera是4096個字節(jié),包括:名(name)、值(value)和等號。
IE是4095個字節(jié),包括:名(name)、值(value)和等號。

9.設(shè)置或讀取session之前,需要做什么?
session_start()前面不能有任何輸出,包括空行。

相關(guān)題目:使用setcookie函數(shù)前,需要注意什么?
前面不能有任何輸出,包括空行。

10.請描述出七層網(wǎng)絡(luò)模型的名稱,由下到上(可以使用中文描述)
物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會話層、表示層、應(yīng)用層

11.說說下面這些這些協(xié)議的全稱和中文解釋(提示:都是工作在應(yīng)用層)SMTP、POP3、HTTP、FTP、DNS(小米)
SMTP(Simple Mail Transfer Protocol)簡單郵件傳輸協(xié)議
POP3(Post Office Protocol 3)郵局協(xié)議第3版
HTTP(Hypertext Transfer Protocol)超文本傳輸協(xié)議
FTP(File Transfer Protocol)文件傳輸協(xié)議
DNS(Domain Name System and Domain Name Service protocol)域名系統(tǒng)(服務(wù))協(xié)議

12.COOKIE、SESSION的聯(lián)系和區(qū)別,多臺web服務(wù)器如何共享SESSION?
COOKIE和SESSION都是用于會話機制,COOKIE保存在客戶端,而SESSION則保存在服務(wù)器端。
在默認(rèn)情況下,SESSION機制是基于COOKIE的,每生成一個SESSIONID,都會將其發(fā)送到瀏覽器端,讓后將其保存到COOKIE當(dāng)中,在下次請求的時候,由瀏覽器攜帶這個COOKIE。
要想多臺web服務(wù)器共享SESSION,可以利用MySQL數(shù)據(jù)庫存儲SESSION數(shù)據(jù)。

13.HTTP/1.0中,狀態(tài)碼200 301 304 403 404 500的含義(小米)
200 OK服務(wù)器成功處理了請求
301 Moved Permanently(重定向)請求的URL已移走
304 Not Modified(未修改)客戶的緩存資源是最新的,要客戶端使用緩存
403 Forbidden(禁止)請求被服務(wù)器拒絕了
404 Not Found未找到資源
Internal Server Error(內(nèi)部服務(wù)器錯誤)服務(wù)器遇到一個錯誤,使其無法為請求提供服務(wù)

14.請描述PHP(或其他語言)Session的運行機制,大型網(wǎng)站中Session方面應(yīng)注意什么?(小米)
session機制是一種服務(wù)器端的機制,它將數(shù)據(jù)保存到服務(wù)器端。
當(dāng)程序需要為某個客戶端的請求創(chuàng)建一個session的時候,服務(wù)器首先檢查這個客戶端的請求里是否已包含了一個session標(biāo)識,稱為sessionid,如果已包含一個sessionid則說明以前已經(jīng)為此客戶端創(chuàng)建過session,服務(wù)器就按照sessionid把這個session檢索出來使用(如果檢索不到,可能會新建一個),如果客戶端請求不包含sessionid,則為此客戶端創(chuàng)建一個session并且生成一個與此session相關(guān)聯(lián)的sessionid,sessionid的值應(yīng)該是一個既不會重復(fù),又不容易被找到規(guī)律以仿造的字符串,這個sessionid將被在本次響應(yīng)中返回給客戶端以cookie的形式保存。

session在大訪問量網(wǎng)站上確實影響系統(tǒng)性能,影響性能的原因之一由文件系統(tǒng)設(shè)計造成,在同一個目錄下超過10000個文件時,文件的定位將非常耗時。另外就是小文件的效率問題,一般我們的session數(shù)據(jù)都不會太大(1~2K),如果有大量這樣1~2K的文件在磁盤上,IO效率肯定會很差,我們可以采用改寫session存儲機制,比如存放到數(shù)據(jù)庫中。

15.在子網(wǎng)掩碼為255.255.255.248的局域網(wǎng)中能夠同時使用的IP有多少個?(億郵)
6個,255.255.255.248換算成二進制就是11111111.11111111.11111111.11111000
后面的三位用來表示主機,前面的29位用來表示網(wǎng)絡(luò)。
三位表示主機,就是可以用來表示2^3=8個,再減去網(wǎng)絡(luò)地址和廣播地址,就是6個了。

16.簡述Tcp協(xié)議的三次握手過程。(億郵)
TCP是主機對主機層的傳輸控制協(xié)議,提供可靠的連接服務(wù),采用三次握手確認(rèn)建立一個連接:
第一次握手:建立連接時,客戶端發(fā)送syn包(syn=j)到服務(wù)器,并進入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn);
第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶的SYN(ack=j+1),同時自己也發(fā)送一個SYN包(syn=k),即SYN+ACK包,此時服務(wù)器進入SYN_RECV狀態(tài);
第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務(wù)器進入ESTABLISHED狀態(tài),完成三次握手。
完成三次握手,客戶端與服務(wù)器開始傳送數(shù)據(jù)。

17.你會用哪個函數(shù)設(shè)置當(dāng)前內(nèi)容的Content-Type?(卓望)
header函數(shù)

18.通過頁面輸入用戶名abc和密碼123登錄到www.10086.cn,請寫出該次請求的HTTP協(xié)議報文(包括請求行、消息報頭、請求正文)。(卓望)
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

2.你用什么方法檢查PHP腳本的執(zhí)行效率(通常是腳本執(zhí)行時間)和數(shù)據(jù)庫SQL的效率(通常是數(shù)據(jù)庫Query時間),并定位和分析腳本執(zhí)行和數(shù)據(jù)庫查詢的瓶頸所在?(騰訊)
腳本執(zhí)行時間,啟用xdebug,使用WinCacheGrind分析。
數(shù)據(jù)庫查詢,mysql使用EXPLAIN分析查詢,啟用slow query log記錄慢查詢。

3.對于大流量的網(wǎng)站,您采用什么樣的方法來解決訪問量問題?
確認(rèn)服務(wù)器硬件能否支持當(dāng)前的流量
對于普通的pc server來說,它能夠獨立支持每天10萬個獨立ip訪問,如果訪問量過大,最好更好性能更高的專用服務(wù)器。
優(yōu)化數(shù)據(jù)庫的訪問服務(wù)器的負(fù)載過大,一個重要的原因就是CPU和內(nèi)存負(fù)載過高,而讀寫數(shù)據(jù)在這塊占據(jù)較多的資源??梢詮捻撁骒o態(tài)化、memcache緩存和mysql優(yōu)化幾個方面著手。
禁止外部盜鏈
占用較大的流量,防盜鏈,使用reference來判斷一下。如果是圖片的話,使用添加水印即可很好的防止。
控制大文件的下載
最好把文件下載的容量控制為相對較小的一個值,如果有大文件下載,最好使用專用的服務(wù)器。
使用多臺主機實現(xiàn)分流,集群
使用流量分析軟件進行分析統(tǒng)計谷歌和百度

6.請舉例說明在你的開發(fā)過程中用什么方法來加快頁面的加載速度。
要用到服務(wù)器資源時才打開,及時關(guān)閉服務(wù)器資源,數(shù)據(jù)庫添加索引,頁面可生成靜態(tài),圖片等大文件單獨服務(wù)器,使用代碼優(yōu)化工具等。
16.把一篇英文文檔中所有單詞的首字母轉(zhuǎn)為大寫,文檔存在doc.txt中。可以在多種編程語言中選擇(C\C++,JAVA,PHP...)寫出你的思路,盡量優(yōu)化你的程序。(百度)
str=file_get_contents('doc.txt');str=ucwords(str); file_put_contents('doc.txt',str);
17.防止SQL注射漏洞一般用_____函數(shù)
addslashes
19.請問cgi和fastcgi有什么不同,你在什么情況下會選擇哪個?(酷訊)
原理一樣,都是利用標(biāo)準(zhǔn)輸入輸出流處理HTTP之類的文本協(xié)議,都是通過多進程模式處理多請求。不同之處在于FastCGI的一個進程處理完一個請求之后重置狀態(tài)并掛起,待下一個請求來時繼續(xù)處理;而CGI的一個進程則處理完一個請求后退出,下一個請求來時再創(chuàng)建新進程。
21.列舉web開發(fā)中的安全性問題
sql注入攻擊。
數(shù)據(jù)庫操作安全,UPDATE、DELETE、INSERT的操作沒有限制用戶操作權(quán)限,這將是一件很危險的事情。
沒有驗證用戶http請求的方式POST或者GET,GET請求被合法通過。
沒有驗證表單來源的唯一性,不能識別是合法的表單提交還是黑客偽造的表單提交。
XSS攻擊。

[!]22.如何通過php程序防止外部頁面提交表單?編寫一段代碼

<?php
    session_start();
    if(isset($_POST['name'])&&!empty($_POST['name'])){
        if($_POST['check']==$_SESSION['check']){
            echo'正常訪問';
            }else{
            echo'外部訪問';
        }
    }
    $token=md5(uniqid(rand(),true));
    $_SESSION['check']=$token;
?>
<form method="post"action="">
<input type="text"name="name">
<input type="hidden"name="check"value="<?php echo$token;?>">
<input type="submit">
</form>

25.請簡述操作系統(tǒng)的線程與進程的區(qū)別。列舉LINUX下面你使用過的軟件?
進程是具有一定獨立功能的程序關(guān)于某個數(shù)據(jù)集合上的一次運行活動,進程是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位。
線程是進程的一個實體是CPU調(diào)度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。
進程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式。進程有獨立的地址空間,一個進程崩潰后,在保護模式下不會對其它進程產(chǎn)生影響,而線程只是一個進程中的不同執(zhí)行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等于整個進程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對于一些要求同時進行并且又要共享某些變量的并發(fā)操作,只能用線程,不能用進程。
Linux下常用軟件,vim,emacs,tar,openoffice,putty,wget,links,ssh等。

26.用戶在網(wǎng)站表單提交數(shù)據(jù)的時候,為了防止腳本攻擊(比如用戶輸入<script>alert(111);</script>),php端接收數(shù)據(jù)的時候,應(yīng)該如何處理?
可以對用戶輸入數(shù)據(jù)進行轉(zhuǎn)義,如htmlspecialchars($_POST[‘title’]);

[!!!]27.使用過Memcache緩存嗎,如果使用過,能夠簡單的描述一下它的工作原理嗎?
Memcahce是把所有的數(shù)據(jù)保存在內(nèi)存當(dāng)中,采用hash表的方式,每條數(shù)據(jù)由key和value組成,每個key是獨一無二的,當(dāng)要訪問某個值的時候先按照找到值,然后返回結(jié)果。
Memcahce采用LRU算法來逐漸把過期數(shù)據(jù)清除掉。
31.什么是Ajax?Ajax的原理是什么?Ajax的核心技術(shù)是什么?Ajax的優(yōu)缺點是什么?
Ajax是Asynchronous JavaScript and XML的縮寫,是JavaScript、XML、CSS、DOM等多個技術(shù)的組合。
Ajax的工作原理是一個頁面的指定位置可以加載另一個頁面所有的輸出內(nèi)容,這樣就實現(xiàn)了一個靜態(tài)頁面也能獲取到數(shù)據(jù)庫中的返回數(shù)據(jù)信息了。所以Ajax技術(shù)實現(xiàn)了一個靜態(tài)網(wǎng)頁在不刷新整個頁面的情況下與服務(wù)器通信,減少了用戶等待時間,同時也從而降低了網(wǎng)絡(luò)流量,增強了客戶體驗的友好程度。
Ajax的核心技術(shù)是XMLHttpRequest,它是JavaScript中的一個對象。
Ajax的優(yōu)點是:
(1).減輕了服務(wù)器端負(fù)擔(dān),將一部分以前由服務(wù)器負(fù)擔(dān)的工作轉(zhuǎn)移到客戶端執(zhí)行,利用客戶端閑置的資源進行處理;
(2).在只局部刷新的情況下更新頁面,增加了頁面反應(yīng)速度,使用戶體驗更友好。
Ajax的缺點是不利于SEO推廣優(yōu)化,因為搜索引擎無法直接訪問到Ajax請求的內(nèi)容。

32.請用PHP實現(xiàn)一個函數(shù),將一個2進制數(shù)的無符號非負(fù)電位字符串非浮點字符串轉(zhuǎn)成一個10進制數(shù),返回該10進制數(shù)。不許使用BIN等系統(tǒng)內(nèi)置函數(shù)(嘀嗒團)
題目意思有些模糊,題目本意可能是將一個無符號的2進制字符串轉(zhuǎn)成10進制數(shù),如'10100010',應(yīng)該得到10100010的十進制表示162。

<?php
function bin2dec(bin){temp = strrev(bin);result = 0;
for (i=0,len = strlen(temp);i < len;i++) {
result += pow(2,i) * temp[i];
}
return $result;
}

$a = '10100010';
echo bin2dec($a);//結(jié)果162

?>
33.請使用PHP設(shè)計一個函數(shù),對學(xué)生英語考試得分從高到低排序,輸入時所有學(xué)生的學(xué)號和考試得分,返回排好序的考試得分和對應(yīng)學(xué)生的學(xué)號??荚嚌M分為100,得分可能會有小數(shù),由于考試評分要求,小數(shù)位只會是0或0.5
要求:
請不要使用qsort等系統(tǒng)內(nèi)置排序函數(shù)
請使用你認(rèn)為最快最優(yōu)的方法實現(xiàn)該函數(shù)并使排序的性能最高。(嘀嗒團)

<?php
// 快速排序?qū)崿F(xiàn)
function array_sort(&arr,left,right){ if (left < right) {pivot = arr[left];
low =left;
high =right;

        while ($low < $high) {
            while ($low < $high && $arr[$high]['score'] >= $pivot['score']) {
                $high--;
            }
            $arr[$low] = $arr[$high];
            while ($low < $high && $arr[$low]['score'] <= $pivot['score']) {
                $low++;
            }
        }
        $arr[$low] = $pivot;
        array_sort($arr,$left,$low-1);
        array_sort($arr,$low+1,$right);
    }
}

$english = array(
        array('sid'=>1,'score'=>76),
        array('sid'=>2,'score'=>93),
        array('sid'=>3,'score'=>68.5),
        array('sid'=>4,'score'=>82.5),

    );
$left = 0;
$right = count($english) - 1;
array_sort($english,$left,$right);

print_r($english);

?>
34.需要設(shè)置一個有效期為31天,的memcach值,請補充下面的代碼(奇矩互動)
<?php
memcache_obj=new memcachememcache_obj->connect(‘memcache_host,11211’);
$memcache_obj->set(‘varKey’,’varValue’,0,____);
?>
time()+36002431

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

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

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