成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

2018 PHP面試真題(包括詳細(xì)解析)

pubdreamcc / 723人閱讀

摘要:以下題目和解析分別來(lái)源于我的新書程序員面試筆試寶典程序員面試筆試真題解析。類通過一個(gè)簡(jiǎn)單的外部接口與外界發(fā)生關(guān)系,對(duì)象與對(duì)象之間通過消息進(jìn)行通信。真題獲得實(shí)例化對(duì)象所屬類名字的函數(shù)是。

以下題目和解析分別來(lái)源于我的新書《PHP程序員面試筆試寶典》、《PHP程序員面試筆試真題解析》。

1、PHP??蓟A(chǔ)

1、PHP與ASP、JSP有什么區(qū)別?
ASP全名Active Server Pages,是一個(gè)基于Windows平臺(tái)的Web服務(wù)器端的開發(fā)環(huán)境,利用它可以產(chǎn)生和運(yùn)行動(dòng)態(tài)的、交互的、高性能的Web服務(wù)應(yīng)用程序,它只能在微軟平臺(tái)上使用,移植性不好。ASP采用腳本語(yǔ)言VB Script、JScript(JavaScript)作為自己的開發(fā)語(yǔ)言。國(guó)內(nèi)早期大部分網(wǎng)站都用它來(lái)開發(fā)。但因微軟全面轉(zhuǎn)向,ASP.NET放棄了ASP的Web開發(fā)模式,所以現(xiàn)在已經(jīng)被淘汰使用。
PHP是一種跨平臺(tái)的服務(wù)器端的嵌入式腳本語(yǔ)言。它大量地借用C、Java和Perl語(yǔ)言的語(yǔ)法,并耦合PHP自己的特性,使Web開發(fā)者能夠快速地寫出動(dòng)態(tài)生成頁(yè)面。它可嵌入HTML中,非常適合Web開發(fā),而且它支持目前絕大多數(shù)數(shù)據(jù)庫(kù)。除此以外,PHP是完全免費(fèi)的,不用花錢,開發(fā)人員就可以從PHP官方站點(diǎn)(http://www.php.net)自由下載。而且開發(fā)人員可以不受限制地獲得源碼,甚至可以從中加入自己需要的特色,開發(fā)效率高,成本低。
JSP是Sun公司推出的一種網(wǎng)絡(luò)編程語(yǔ)言,跨平臺(tái)運(yùn)行,安全性高,運(yùn)行效率也高。它的開發(fā)語(yǔ)言主要基于Java。
ASP、JSP、PHP三者都提供在 HTML 代碼中混合某種程序代碼、由語(yǔ)言引擎解釋執(zhí)行,但JSP代碼被編譯成 Servlet并由Java虛擬機(jī)解釋執(zhí)行,這種編譯操作僅在對(duì)JSP頁(yè)面的第一次請(qǐng)求時(shí)發(fā)生。在ASP、PHP、JSP環(huán)境下,HTML代碼主要負(fù)責(zé)描述信息的顯示樣式,而程序代碼則用來(lái)描述處理邏輯。普通的HTML頁(yè)面只依賴于Web服務(wù)器,而ASP、PHP、JSP頁(yè)面需要附加的語(yǔ)言引擎分析和執(zhí)行程序代碼。程序代碼的執(zhí)行結(jié)果被重新嵌入HTML代碼中,然后一起發(fā)送給瀏覽器。ASP、PHP、JSP三者都是面向 Web 服務(wù)器的技術(shù),客戶端瀏覽器不需要任何附加的軟件支持。

2、在PHP中,單引號(hào)和雙引號(hào)所包圍的字符串的區(qū)別是( )。
A.單引號(hào)解析其中rt等轉(zhuǎn)義字符,而雙引號(hào)不解析
B.雙引號(hào)速度快,單引號(hào)速度慢
C.單引號(hào)速度快,雙引號(hào)速度慢
D.雙引號(hào)解析其中以$開頭的變量,而單引號(hào)不解析
參考答案:D。
分析:雙引號(hào)是可以解析$符開頭的變量和轉(zhuǎn)義字符的,而單引號(hào)不解析也不轉(zhuǎn)義字符。所以,選項(xiàng)A錯(cuò)誤,選項(xiàng)D正確。
對(duì)于選項(xiàng)B和選項(xiàng)C,由于題目中明確說(shuō)了引號(hào)內(nèi)包含的是字符串,因此不需要對(duì)變量進(jìn)行解析,在這種情況下雙引號(hào)和單引號(hào)的效率是相同的。選項(xiàng)B和選項(xiàng)C都是錯(cuò)誤的。

3、面向?qū)ο笈c面向過程有什么區(qū)別?
面向?qū)ο笫钱?dāng)今軟件開發(fā)方法的主流方法之一,它是把數(shù)據(jù)及對(duì)數(shù)據(jù)的操作方法放在一起,作為一個(gè)相互依存的整體,即對(duì)象。對(duì)同類對(duì)象抽象出其共性,即類,類中的大多數(shù)數(shù)據(jù),只能被本類的方法進(jìn)行處理。類通過一個(gè)簡(jiǎn)單的外部接口與外界發(fā)生關(guān)系,對(duì)象與對(duì)象之間通過消息進(jìn)行通信。程序流程由用戶在使用中決定。例如,站在抽象的角度,人類具有身高、體重、年齡、血型等一些特稱,人類會(huì)勞動(dòng)、會(huì)直立行走、會(huì)吃飯、會(huì)用自己的頭腦去創(chuàng)造工具等這些方法,人類僅僅只是一個(gè)抽象的概念,它是不存在的實(shí)體,但是所有具備人類這個(gè)群體的屬性與方法的對(duì)象都稱為人,這個(gè)對(duì)象人是實(shí)際存在的實(shí)體,每個(gè)人都是人這個(gè)群體的一個(gè)對(duì)象。
而面向過程是一種以事件為中心的開發(fā)方法,就是自頂向下順序執(zhí)行,逐步求精,其程序結(jié)構(gòu)是按功能劃分為若干個(gè)基本模塊,這些模塊形成一個(gè)樹狀結(jié)構(gòu),各模塊之間的關(guān)系也比較簡(jiǎn)單,在功能上相對(duì)獨(dú)立,每一模塊內(nèi)部一般都是由順序、選擇和循環(huán)三種基本結(jié)構(gòu)組成,其模塊化實(shí)現(xiàn)的具體方法是使用子程序,而程序流程在寫程序時(shí)就已經(jīng)決定。例如五子棋,面向過程的設(shè)計(jì)思路就是首先分析問題的步驟:第一步,開始游戲;第二步,黑子先走;第三步,繪制畫面;第四步,判斷輸贏;第五步,輪到白子;第六步,繪制畫面;第七步,判斷輸贏;第八步,返回步驟二;第九步,輸出最后結(jié)果。把上面每個(gè)步驟用分別的函數(shù)來(lái)實(shí)現(xiàn),就是一個(gè)面向過程的開發(fā)方法。
具體而言,二者主要有以下幾個(gè)方面的不同之處。
1)出發(fā)點(diǎn)不同。面向?qū)ο笫怯梅铣R?guī)思維方式來(lái)處理客觀世界的問題,強(qiáng)調(diào)把問題域的要領(lǐng)直接映射到對(duì)象及對(duì)象之間的接口上。而面向過程方法則不然,它強(qiáng)調(diào)的是過程的抽象化與模塊化,它是以過程為中心構(gòu)造或處理客觀世界問題的。
2)層次邏輯關(guān)系不同。面向?qū)ο蠓椒▌t是用計(jì)算機(jī)邏輯來(lái)模擬客觀世界中的物理存在,以對(duì)象的集合類作為處理問題的基本單位,盡可能地使計(jì)算機(jī)世界向客觀世界靠攏,以使問題的處理更清晰直接,面向?qū)ο蠓椒ㄊ怯妙惖膶哟谓Y(jié)構(gòu)來(lái)體現(xiàn)類之間的繼承和發(fā)展。面向過程方法處理問題的基本單位是能清晰準(zhǔn)確地表達(dá)過程的模塊,用模塊的層次結(jié)構(gòu)概括模塊或模塊間的關(guān)系與功能,把客觀世界的問題抽象成計(jì)算機(jī)可以處理的過程。
3)數(shù)據(jù)處理方式與控制程序方式不同。面向?qū)ο蠓椒▽?shù)據(jù)與對(duì)應(yīng)的代碼封裝成一個(gè)整體,原則上其他對(duì)象不能直接修改其數(shù)據(jù),即對(duì)象的修改只能由自身的成員函數(shù)完成,控制程序方式上是通過“事件驅(qū)動(dòng)”來(lái)激活和運(yùn)行程序。而面向過程方法是直接通過程序來(lái)處理數(shù)據(jù),處理完畢后即可顯示處理結(jié)果,在控制程序方式上是按照設(shè)計(jì)調(diào)用或返回程序,不能自由導(dǎo)航,各模塊之間存在著控制與被控制、調(diào)用與被調(diào)用。
4)分析設(shè)計(jì)與編碼轉(zhuǎn)換方式不同。面向?qū)ο蠓椒ㄘ灤┸浖芷诘姆治?、設(shè)計(jì)及編碼之間是一種平滑過程,從分析到設(shè)計(jì)再到編碼是采用一致性的模型表示,即實(shí)現(xiàn)的是一種無(wú)縫連接。而面向過程方法強(qiáng)調(diào)分析、設(shè)計(jì)及編碼之間按規(guī)則進(jìn)行轉(zhuǎn)換,貫穿軟件生命周期的分析、設(shè)計(jì)及編碼之間,實(shí)現(xiàn)的是一種有縫的連接。

4、在PHP中,自定義一個(gè)類的方式是( )。
A.
B.
C.
D.
參考答案:B。
分析:定義一個(gè)類是使用class關(guān)鍵字加類名來(lái)定義的,定義格式為:class 類名{}。實(shí)例化一個(gè)類的格式為:$object=new 類名();。
【真題11】 獲得實(shí)例化對(duì)象所屬類名字的函數(shù)是( )。
A.get_class() B.get_object_vars()
C.get_class_methods() D.get_classname()
參考答案:A。
分析:對(duì)于選項(xiàng)A,get_class()函數(shù)用于返回一個(gè)對(duì)象的類的名稱。所以,選項(xiàng)A正確。
對(duì)于選項(xiàng)B,get_object_vars()函數(shù)用于得到給定對(duì)象的屬性。所以,選項(xiàng)B錯(cuò)誤。
對(duì)于選項(xiàng)C,get_class_methods()函數(shù)用于獲取類方法的名字。所以,選項(xiàng)C錯(cuò)誤。
對(duì)于選項(xiàng)D,PHP中沒有該方法。所以,選項(xiàng)D錯(cuò)誤。

5、以下有關(guān)PHP面向?qū)ο蟮恼f(shuō)法中,不正確的是( )。
A.要實(shí)現(xiàn)一個(gè)接口,使用 implements操作符,類中必須實(shí)現(xiàn)接口中定義的所有方法,否則會(huì)報(bào)一個(gè)致命錯(cuò)誤
B.類名可以是任何非 PHP保留字的合法標(biāo)簽,漢字也可以作為PHP的類名
C.如果PHP的子類中定義了構(gòu)造函數(shù),則創(chuàng)建子類的對(duì)象時(shí),會(huì)隱式地調(diào)用其父類的構(gòu)造函數(shù)
D.序列化一個(gè)對(duì)象將會(huì)保存對(duì)象的所有變量,但是不會(huì)保存對(duì)象的方法,只會(huì)保存類的名字
參考答案:C。
分析:子類定義的構(gòu)造函數(shù)會(huì)覆蓋父類的構(gòu)造函數(shù),如果要子類的構(gòu)造函數(shù)執(zhí)行,同時(shí)也執(zhí)行父類的構(gòu)造函數(shù),那么必須顯式地使用parent::__construct();去調(diào)用。所以,選項(xiàng)C錯(cuò)誤。

6、下面關(guān)于PHP抽象類的描述中,錯(cuò)誤的是( )。
A.PHP中抽象類使用abstract關(guān)鍵字定義
B.沒有方法體的方法叫抽象方法,包含抽象方法的類必須是抽象類
C.抽象類中必須有抽象方法,否則不叫抽象類
D.抽象類不能實(shí)例化,也就是不可以new成對(duì)象
參考答案:C。
分析:抽象類可以是個(gè)空類,也就是不一定需要有抽象方法。但抽象方法只能存在抽象類中。所以,選項(xiàng)C錯(cuò)誤。

7、什么是多態(tài)?
多態(tài)是面向?qū)ο蟪绦蛟O(shè)計(jì)中代碼重用的一個(gè)重要機(jī)制,它表示當(dāng)同一個(gè)操作作用在不同的對(duì)象的時(shí)候,會(huì)有不同的語(yǔ)義,從而會(huì)產(chǎn)生不同的結(jié)果。例如,同樣是“+”操作,3+4用來(lái)實(shí)現(xiàn)整數(shù)相加,而“3”+“4”卻實(shí)現(xiàn)了字符串的連接。一般而言,多態(tài)有兩種實(shí)現(xiàn)方式:覆蓋和重載。

8、 include與require有什么區(qū)別?
require和include有著相似的功能:將指定文件中的所有代碼/文本/標(biāo)記復(fù)制到使用require或include語(yǔ)句的文件中。通常被用在數(shù)據(jù)、文件或代碼需要被共享的場(chǎng)景。通過把需要被共享的代碼或數(shù)據(jù)放到一個(gè)多帶帶PHP文件中,在需要使用的文件中通過require或include來(lái)引用。require()和include()也不是真正的函數(shù),因此,require()和include()語(yǔ)句也可以不加圓括號(hào)而直接加參數(shù)。

9、下列代碼的輸出是( )。

A.Error B.5 C.10 D.15
參考答案:B。
分析:在PHP中,define函數(shù)用于定義一個(gè)常量,而常量的值在設(shè)定以后,是無(wú)法更改的。本題中,x的值始終為5。所以,選項(xiàng)B正確。

10、如何對(duì)變量進(jìn)行引用?
可以在變量的前面加&符號(hào)對(duì)變量進(jìn)行引用,變量的引用相當(dāng)于給變量起了個(gè)別名,通過不同的名字訪問同一個(gè)變量?jī)?nèi)容,所以改變其中一個(gè)變量的值,另一個(gè)變量也會(huì)跟著改變。

【真題54】 有如下代碼:

程序的運(yùn)行結(jié)果為( )
A.hello B.world C.NULL D.unset
參考答案:A。
分析:這個(gè)代碼的執(zhí)行過程如下圖所示。

1)首先執(zhí)行$b= &$a后,a和b引用同一個(gè)字符串變量“hello”。
2)接著執(zhí)行unset($b),這個(gè)函數(shù)可以斷開這個(gè)引用關(guān)系。此時(shí)由于a仍然指向字符串“hello”,也就是說(shuō),這個(gè)字符串仍然被a使用,因此這個(gè)字符串不會(huì)被回收。
3)接著執(zhí)行$b="world",此時(shí),b指向一個(gè)新的字符串“world”,這并不會(huì)影響a的值。因此輸出結(jié)果為hello。

2、PHP??歼M(jìn)階
11、請(qǐng)寫一個(gè)函數(shù)驗(yàn)證電子郵件的格式是否正確。
參考答案:

function checkEmail($email)
{
    $pregEmail= "/^([0-9A-Za-z-_.]+)@([0-9a-z]+.[a-z]{2,3}(.[a-z]{2})?)$/i";
    return preg_match($pregEmail,$email);  
}

分析:首尾兩個(gè)斜杠/是正則表達(dá)式的限定符,這是Perl正則的標(biāo)準(zhǔn),而PHP與Perl有相同的正則的規(guī)范。兩個(gè)斜杠之間表示的是正則內(nèi)容,后面的i表示忽略大小寫。
這個(gè)正則表達(dá)式表示的含義如下:
1)必須以([0-9A-Za-z-_.]+)開頭,也就是說(shuō),郵件地址以多個(gè)字母、數(shù)組、“-”或“.”開頭。
2)緊接著是字符“@”。
3)然后接著是多個(gè)字母或數(shù)字的字符串,接著是一個(gè)字符“.”,接著是兩個(gè)或三個(gè)字母;然后接下來(lái)一部分可有可無(wú)的:一個(gè)“.”后面跟著兩個(gè)字母。
4)郵件的結(jié)束符是滿足3)的字符串。

12、以下可以匹配中國(guó)居民身份證號(hào)碼的正則表達(dá)式是( )。
A.d{15} B.d{18}
C.d D.(^d{15}$)|(^d{18}$)|(^d{17}(d|X|x)$)
參考答案:D。
分析:d表示0~9任意數(shù)字。

13、【真題96】 一個(gè)函數(shù)的參數(shù)不能是對(duì)變量的引用,除非在php.ini中把( )設(shè)為on。
參考答案:allow_call_time_pass_reference。
分析:在PHP函數(shù)調(diào)用的時(shí)候,基本數(shù)據(jù)類型默認(rèn)會(huì)使用值傳遞,而不是引用傳遞。allow_call_time_pass_reference?選項(xiàng)的作用為是否啟用在函數(shù)調(diào)用時(shí)強(qiáng)制參數(shù)被按照引用傳遞。如果把a(bǔ)llow_call_time_pass_reference?配置為on,那么在函數(shù)調(diào)用的時(shí)候會(huì)默認(rèn)使用引用傳值。但是不推薦使用這種方法,原因是該方法在未來(lái)的版本中很可能不再支持。如果想使用引用傳遞,那么推薦在函數(shù)調(diào)用的時(shí)候顯式地使用&進(jìn)行引用傳遞。

14、文件讀操作
讀取文件前,通常會(huì)判斷文件能否讀取,例如,是否有讀權(quán)限,可以使用is_readable函數(shù);示例代碼如下:

當(dāng)然也需要判斷文件是否存在,可以使用file_exists()函數(shù)。示例代碼如下:

讀取文件的方法有很多種,此處列舉最常用的按行讀取方法,示例代碼如下:

需要注意的是,讀取文件的length參數(shù)是可選項(xiàng),如果忽略,則將繼續(xù)從流中讀取數(shù)據(jù)直到行結(jié)束。指定最大行的長(zhǎng)度在利用資源上更為有效。此外,還有fread、file_get_contents等讀取文件的方法,此處不再贅述。

15、什么是異常處理與錯(cuò)誤處理?
當(dāng)運(yùn)行的程序發(fā)生異常被拋出時(shí),程序不會(huì)繼續(xù)執(zhí)行異常處后面的代碼,PHP 會(huì)嘗試查找匹配的“catch”代碼塊。如果異常沒有被捕獲,那么將會(huì)發(fā)生嚴(yán)重的錯(cuò)誤,程序會(huì)終止或者不受控制地執(zhí)行。示例代碼如下:

 10)
        {
            throw new Exception("Exception ocur");
        }
        return true;
    }
    GetNum(100);
?>

程序的運(yùn)行結(jié)果為
Uncaught exception "Exception" with message "Exception ocur"

從這個(gè)例子可以看出,如果不對(duì)異常進(jìn)行處理,那么當(dāng)程序有異常拋出的時(shí)候就會(huì)結(jié)束執(zhí)行。而對(duì)于對(duì)象方法的異常處理,還有另外一種處理方法,下面介紹在PHP中當(dāng)調(diào)用一些不存在的對(duì)象方法時(shí)的異常處理,從而保證程序正常運(yùn)行。這主要是通過__call方法來(lái)實(shí)現(xiàn)的。
方法聲明為__call($funname,$arr_value),當(dāng)被調(diào)用方法不存在的時(shí)候會(huì)默認(rèn)調(diào)用這個(gè)方法。
示例代碼如下:

class My {
    function __call($n,$v) {
        echo "錯(cuò)誤的方法名:".$n;
        echo "錯(cuò)誤的參數(shù):".$v;
    }
}

16、什么是內(nèi)存管理?
內(nèi)存管理主要是指程序運(yùn)行時(shí)對(duì)計(jì)算機(jī)內(nèi)存資源的分配、使用和釋放等技術(shù),內(nèi)存管理的目標(biāo)是高效、快速地分配內(nèi)存同時(shí)及時(shí)地釋放和回收內(nèi)存資源。內(nèi)存管理主要包括是否有足夠的內(nèi)存供程序使用,從內(nèi)存池中獲取可用內(nèi)存,使用后及時(shí)銷毀并重新分配給其他程序使用。
在PHP開發(fā)過程中,如果遇到大數(shù)組等操作,那么可能會(huì)造成內(nèi)存溢出等問題。一些常見的處理方法如下:
1)通過ini_set("memory_limit","64M")方法重置php可以使用的內(nèi)存大小,一般在遠(yuǎn)程主機(jī)上是不能修改php.ini文件的,只能通過程序設(shè)置。注:在safe_mode(安全模式)下,ini_set會(huì)失效。
2)另一方面可以對(duì)數(shù)組進(jìn)行分批處理,及時(shí)銷毀無(wú)用的變量,盡量減少靜態(tài)變量的使用,在需要數(shù)據(jù)重用時(shí),可以考慮使用引用(&)。同時(shí)對(duì)于數(shù)據(jù)庫(kù)、文件操作完要及時(shí)關(guān)閉,對(duì)象使用完要及時(shí)調(diào)用析構(gòu)函數(shù)等。
3)及時(shí)使用unset()函數(shù)釋放變量,使用時(shí)需要注意以下兩點(diǎn):
① unset()函數(shù)只能在變量值占用內(nèi)存空間超過256字節(jié)時(shí)才會(huì)釋放內(nèi)存空間。
② 只有當(dāng)指向該變量的所有變量都銷毀后,才能成功釋放內(nèi)存。

17、與MySQL一樣,Redis在使用過程中,也會(huì)碰到很多的問題,適當(dāng)?shù)募记珊蛢?yōu)化將大大提高Redis的使用性能,提高服務(wù)的質(zhì)量。現(xiàn)將常見的一些問題總結(jié)如下:
1.停止使用keys *操作
keys*操作執(zhí)行速度將會(huì)變慢。因?yàn)閗eys命令的時(shí)間復(fù)雜度是O(n),其中n是要返回的keys的個(gè)數(shù),由此可見這個(gè)命令的復(fù)雜度就取決于數(shù)據(jù)量的大小了。當(dāng)數(shù)據(jù)量比較大時(shí),在這個(gè)操作執(zhí)行期間,其他任何命令在實(shí)例中都無(wú)法執(zhí)行,嚴(yán)重影響了性能。
可以使用scan命令來(lái)代替,scan命令通過增量迭代的方式來(lái)掃描數(shù)據(jù)庫(kù)。
2.定位Redis速度降低的原因
使用INFO commandstats命令來(lái)查看所有命令的統(tǒng)計(jì)情況,如命令執(zhí)行了多少次,執(zhí)行命令所耗費(fèi)的毫秒數(shù)等信息。

18、Memcache的特征和特性
Memcache的特征如下:
1)協(xié)議簡(jiǎn)單。
2)基于libevent的事件處理。
3)內(nèi)置內(nèi)存存儲(chǔ)方式。
4)Memcached不互相通信的分布式。
Memcache的特性如下:
(1)單個(gè)item 最大的數(shù)據(jù)為1MB。
(2)單進(jìn)程最大的使用內(nèi)存為2GB,需要更多內(nèi)存時(shí)可開多個(gè)端口。
(3)Memcached是多線程,非阻塞io復(fù)用的網(wǎng)絡(luò)模型,Redis是單線程。
(4)鍵長(zhǎng)最大為250字節(jié)。

19、下面可以用于服務(wù)器共享session的方式有( )。
A.利用NFS共享Session數(shù)據(jù) B.基于數(shù)據(jù)庫(kù)的Session共享
C.基于Cookie的Session共享 D.使用類似BIG-IP的負(fù)載設(shè)備來(lái)實(shí)現(xiàn)資源共享
參考答案:A、B、C、D。
分析:共享Session的方式主要有以下幾種:
1)基于NFS的Session共享。NFS(Network? File System)最早由Sun公司為解決Unix網(wǎng)絡(luò)主機(jī)間的目錄共享而研發(fā)。僅需將共享目錄服務(wù)器mount到其他服務(wù)器的本地session目錄即可。
2)基于數(shù)據(jù)庫(kù)的Session共享。
3)基于Cookie的Session共享。原理是將全站用戶的Session信息加密、序列化后以Cookie的方式,統(tǒng)一種植在根域名下(如:.host.com),利用瀏覽器訪問該根域名下的所有二級(jí)域名站點(diǎn)時(shí),會(huì)傳遞與之域名對(duì)應(yīng)的所有Cookie內(nèi)容的特性,從而實(shí)現(xiàn)用戶的Cookie化Session 在多服務(wù)間的共享訪問。
4)基于緩存(Memcache)的Session共享。Memcache是一款基于Libevent多路異步I/O技術(shù)的內(nèi)存共享系統(tǒng),簡(jiǎn)單的key + value數(shù)據(jù)存儲(chǔ)模式使得代碼邏輯小巧高效,因此在并發(fā)處理能力上占據(jù)了絕對(duì)優(yōu)勢(shì),目前能達(dá)到2000/s平均查詢,并且服務(wù)器CPU消耗依然不到10%。
所以,本題的答案為A、B、C、D。

20、如何預(yù)防各類安全性問題?
常見的安全性問題主要包括以下方面:
1)SQL注入攻擊。所謂SQL注入式攻擊,就是攻擊者把SQL命令插入Web表單的域或頁(yè)面請(qǐng)求的查詢字符串中,欺騙服務(wù)器執(zhí)行惡意的SQL命令。在某些表單中,用戶輸入的內(nèi)容直接用來(lái)構(gòu)造動(dòng)態(tài)SQL命令,或作為存儲(chǔ)過程的輸入?yún)?shù),這類表單特別容易受到SQL注入式攻擊。例如,對(duì)于一個(gè)站點(diǎn)http://www.shuaiqi100.com/New...,id是查詢參數(shù),通過id獲取顯示某條信息,在JSP程序中,用SQL語(yǔ)句來(lái)讀取該條新聞:“select * from news where id =”+ id,正常執(zhí)行的話,只需要將id替換為參數(shù)2即可,沒有任何問題,但是當(dāng)非法用戶將id的參數(shù)變?yōu)閕d=2;drop database news時(shí),則執(zhí)行的SQL語(yǔ)句除了讀取對(duì)應(yīng)的新聞信息外,還會(huì)執(zhí)行drop database news信息,可是后面這條語(yǔ)句是非法的。
由于SQL注入攻擊利用的是合法的SQL語(yǔ)句,使得這種攻擊不能被防火墻檢查,而且由于對(duì)任何基于SQL語(yǔ)言標(biāo)準(zhǔn)的數(shù)據(jù)庫(kù)都適用,所以危害特別大。盡管如此,目前防止SQL注入攻擊的方法也非常多,具體而言,有以下一些方法:使用預(yù)處理語(yǔ)句和參數(shù)分別發(fā)送到數(shù)據(jù)庫(kù)服務(wù)器進(jìn)行解析,參數(shù)將會(huì)被當(dāng)作普通字符處理。使用這種方式后,攻擊者無(wú)法注入惡意的SQL。那么如何防止SQL注入攻擊呢,下面介紹常用的一些方法:
① 預(yù)處理語(yǔ)句和參數(shù)分別發(fā)送到數(shù)據(jù)庫(kù)服務(wù)器進(jìn)行解析。
② 使用函數(shù)addslashes()轉(zhuǎn)義提交的內(nèi)容。
③ PHP配置文件中開啟magic_quotes_gpc=on;將自動(dòng)轉(zhuǎn)換用戶查詢的SQL語(yǔ)句,對(duì)防止SQL注入有重大作用。
④ 在PHP配置文件中,將register_globals設(shè)置為off,關(guān)閉全局變量注冊(cè)。
⑤ 在PHP配置文件中,開啟安全模式safe_mode=on;。
⑥ SQL語(yǔ)句的書寫盡量不要省略小引號(hào)與單引號(hào)。
⑦ 提高數(shù)據(jù)庫(kù)表和字段的命名技巧,對(duì)一些重要的字段根據(jù)程序的特點(diǎn)命名,取不易被猜到的名字。
⑧ 控制錯(cuò)誤信息,關(guān)閉錯(cuò)誤信息的輸出,將錯(cuò)誤信息寫到日志文件中,不要在網(wǎng)站暴露錯(cuò)誤信息。
2)數(shù)據(jù)庫(kù)操作安全問題。例如,未對(duì)用戶的權(quán)限進(jìn)行限制,update、delete、insert等誤操作造成系統(tǒng)安全性問題。
解決方法為給不同的用戶授不同的權(quán)限,這樣能夠保證只有有權(quán)限的用戶才能進(jìn)行特定的操作。
3)沒有驗(yàn)證用戶http請(qǐng)求方式。惡意的用戶可以模擬http對(duì)網(wǎng)站進(jìn)行請(qǐng)求產(chǎn)生惡意攻擊,為了防止這種攻擊需要檢查用戶的http請(qǐng)求中的訪問來(lái)源是否可信,對(duì)http頭中的referer進(jìn)行過濾,只允許本域站點(diǎn)訪問。
4)沒有驗(yàn)證表單來(lái)源的唯一性,不能識(shí)別是合法的表單提交還是黑客偽造的表單提交。
為了防止黑客偽造表單提交,可以使用一次性令牌Token。通過服務(wù)器端以某種策略生成隨機(jī)字符串作為令牌保存在Session里,然后發(fā)出請(qǐng)求的頁(yè)面時(shí),把該令牌以隱藏域一類的形式,與其他信息一并發(fā)出,在接收頁(yè)面中把接收到的信息中的令牌與Session中的令牌比較,一致才處理請(qǐng)求,否則拒絕請(qǐng)求,以此保證表單的來(lái)源唯一,防止黑客偽造的表單提交。

21、PHP的開發(fā)框架有哪些?
CodeIgniter是一個(gè)輕量級(jí)的PHP開發(fā)框架,具有快速開發(fā)、靈活性高等優(yōu)點(diǎn),它特別適合互聯(lián)網(wǎng)公司的快速迭代場(chǎng)景,因此很受歡迎,據(jù)說(shuō)騰訊、去哪兒網(wǎng)等應(yīng)用場(chǎng)景都使用了這個(gè)框架。CodeIgniter具有動(dòng)態(tài)實(shí)例化、松耦合、組件單一性等很多優(yōu)點(diǎn)。動(dòng)態(tài)實(shí)例化是指組件的導(dǎo)入和函數(shù)在執(zhí)行時(shí)才會(huì)生效。松耦合是指系統(tǒng)模塊之間的關(guān)聯(lián)依賴很少,確保系統(tǒng)具有很好的重用性和靈活性。框架內(nèi)的類和功能都是高度自治的,具有非常好的組件單一性。
在CodeIgniter中,模型代表數(shù)據(jù)結(jié)構(gòu),包含取出、插入、更新數(shù)據(jù)庫(kù)的這些功能。視圖通常是一個(gè)網(wǎng)頁(yè),但是在CodeIgniter中,一個(gè)視圖也可以是一個(gè)頁(yè)面片段,如頭部、頂部HTML代碼片段。它還可以是一個(gè)RSS頁(yè)面,或其他任一頁(yè)面??刂破飨喈?dāng)于一個(gè)指揮者,或者說(shuō)是一個(gè)“中介”,它負(fù)責(zé)聯(lián)系視圖和模型,以及其他任何處理HTTP請(qǐng)求和產(chǎn)生網(wǎng)頁(yè)的資源。
Zend Framework是完全基于PHP語(yǔ)言的針對(duì)Web應(yīng)用開發(fā)的框架,與眾多的其他PHP開發(fā)框架相比,Zend Framework是一個(gè)PHP“官方”的框架,它由Zend公司負(fù)責(zé)開發(fā)和維護(hù)。Zend Framework同樣基于MVC模式,Zend Framework采用了ORM(Object Relational Mapping,對(duì)象關(guān)系映射)思路,這是一種為了解決面向?qū)ο缶幊膛c關(guān)系數(shù)據(jù)庫(kù)存在的互不匹配現(xiàn)象的技術(shù)。簡(jiǎn)單地說(shuō),這種技術(shù)將數(shù)據(jù)庫(kù)中的一個(gè)表映射為程序中的一個(gè)對(duì)象,表中的字段映射為對(duì)象的屬性,然后通過提供的方法完成對(duì)數(shù)據(jù)庫(kù)的操作。就這一點(diǎn)而言,Zend Framework很相似于現(xiàn)在流行的非PHP的開發(fā)框架Ruby on Rails。
ThinkPHP是一個(gè)快速、兼容而且簡(jiǎn)單的輕量級(jí)國(guó)產(chǎn)PHP開發(fā)框架,誕生于2006年初,原名FCS,2007年元旦正式更名為ThinkPHP,其遵循Apache2開源協(xié)議發(fā)布,從Struts結(jié)構(gòu)移植過來(lái)并做了改進(jìn)和完善,同時(shí)也借鑒了國(guó)外很多優(yōu)秀的框架和模式,使用面向?qū)ο蟮拈_發(fā)結(jié)構(gòu)和MVC模式,融合了Struts的思想和TagLib(標(biāo)簽庫(kù))、RoR的ORM映射和ActiveRecord模式。
此外,還有FleaPHP、CakePHP等很多優(yōu)秀的框架,此處就不一一列舉,它們本質(zhì)上都是基于MVC的架構(gòu),下面著重介紹一下在互聯(lián)網(wǎng)公司使用比較廣泛的CI框架。

3、PHP+mysql

1、問題:設(shè)教務(wù)管理系統(tǒng)中有三個(gè)基本表:
學(xué)生信息表S(SNO, SNAME, AGE, SEX),其屬性分別表示學(xué)號(hào)、學(xué)生姓名、年齡和性別。
選課信息表SC(SNO, CNO, SCGRADE),其屬性分別表示學(xué)號(hào)、課程號(hào)和成績(jī)。
課程信息表C(CNO, CNAME, CTEACHER),其屬性分別表示課程號(hào)、課程名稱和任課老師姓名。
1)把SC表中每門課程的平均成績(jī)插入另外一個(gè)已經(jīng)存在的表SC_C(CNO, CNAME, AVG_GRADE)中,其中AVG_GRADE表示的是每門課程的平均成績(jī)。
INSERT INTO SC_C(CNO, CNAME, AVG_GRADE)
SELECT SC.CNO, C.CNAME, AVG(SCGRADE) FROM SC, C WHERE SC.CNO = C.CNO GROUP BY SC.CNO

2)規(guī)定女同學(xué)選修何昊老師的課程成績(jī)都應(yīng)該在80分以上(包含80分)。
ALERT TABLE SC, S, C
ADD CONSTRAINT GRADE CHECK(SCGRADE>=80)
WHERE SC.CNO=C.CNO AND SC.SNO=S.SNO AND C.CTEACHER="何昊" AND S.SEX=

"女"

3)從SC表中把何昊老師的女學(xué)生選課記錄刪除。
DELETE FROM SC WHERE CNO=(SELECT CNO FROM C WHERE C.CTEACHER ="何昊") AND SNO IN (SELECT SNO FROM S WHERE SEX="女")

4)找出沒有選修過“何昊”老師講授課程的所有學(xué)生姓名。
SELECT SNAME FROM S
WHERE NOT EXISTS(
SELECT * FROM SC,C WHERE SC.CNO=C.CNO AND CNAME="何昊" AND SC.SNO=S.SNO)

5)列出有兩門以上(含兩門)不及格課程(成績(jī)小于60)的學(xué)生姓名及其平均成績(jī)。
SELECT S.SNO,S.SNAME,AVG_SCGRADE=AVG(SC.SCGRADE)

    FROM S,SC,(
    SELECT SNO FROM SC WHERE SCGRADE<60 GROUP BY SNO
    HAVING COUNT(DISTINCT CNO)>=2)A WHERE S.SNO=A.SNO AND SC.SNO = A.SNO
    GROUP BY S.SNO,S.SNAME

6)列出既學(xué)過“1”號(hào)課程,又學(xué)過“2”號(hào)課程的所有學(xué)生姓名。
SELECT S.SNO,S.SNAME
FROM S,(SELECT SC.SNO FROM SC,C
WHERE SC.CNO=C.CNO AND C.CNAME IN("1","2")

GROUP BY SNO
HAVING COUNT(DISTINCT CNO)=2

)SC WHERE S.SNO=SC.SNO

7)列出“1”號(hào)課成績(jī)比“2”號(hào)同學(xué)該門課成績(jī)高的所有學(xué)生的學(xué)號(hào)。
SELECT S.SNO,S.SNAME
FROM S,(
SELECT SC1.SNO
FROM SC SC1,C C1,SC SC2,C C2
WHERE SC1.CNO=C1.CNO AND C1.NAME="1"
AND SC2.CNO=C2.CNO AND C2.NAME="2"
AND SC1.SCGRADE>SC2.SCGRADE
)SC WHERE S.SNO=SC.SNO

8)列出“1”號(hào)課成績(jī)比“2”號(hào)課成績(jī)高的所有學(xué)生的學(xué)號(hào)及其“1”號(hào)課和“2”號(hào)課的成績(jī)。
SELECT S.SNO,S.SNAME,SC.[1號(hào)課成績(jī)],SC.[2號(hào)課成績(jī)]

FROM S,(
SELECT SC1.SNO,[1號(hào)課成績(jī)]=SC1.SCGRADE,[2號(hào)課成績(jī)]=SC2.SCGRADE

FROM SC SC1,C C1,SC SC2,C C2
WHERE SC1.CNO=C1.CNO AND C1.NAME="1"
AND SC2.CNO=C2.CNO AND C2.NAME="2"

AND SC1.SCGRADE>SC2.SCGRADE
)SC WHERE S.SNO=SC.SNO

2、UNION和UNION ALL有什么區(qū)別?
UNION在進(jìn)行表求并集后會(huì)去掉重復(fù)的元素,所以會(huì)對(duì)所產(chǎn)生的結(jié)果集進(jìn)行排序運(yùn)算,刪除重復(fù)的記錄再返回結(jié)果。
而UNION ALL只是簡(jiǎn)單地將兩個(gè)結(jié)果合并后就返回。因此,如果返回的兩個(gè)結(jié)果集中有重復(fù)的數(shù)據(jù),那么返回的結(jié)果集就會(huì)包含重復(fù)的數(shù)據(jù)。
從上面的對(duì)比可以看出,在執(zhí)行查詢操作的時(shí)候,UNION ALL要比UNION快很多,所以,如果可以確認(rèn)合并的兩個(gè)結(jié)果集中不包含重復(fù)的數(shù)據(jù),那么最好使用UNION ALL。例如,如下有兩個(gè)學(xué)生表Table1和Table2。
Table1
C1 C2
1 1
2 2
3 3

Table2
C1 C2
3 3
4 4
1 1
select from Table1 union select from Table2 的查詢結(jié)果為
C1 C2
1 1
2 2
3 3
4 4
select from Table1 union all select from Table2 的查詢結(jié)果為
C1 C2
1 1
2 2
3 3
3 3
4 4
1 1

3、什么是數(shù)據(jù)庫(kù)三級(jí)封鎖協(xié)議?
眾所周知,基本的封鎖類型有兩種:排它鎖(X鎖)和共享鎖(S鎖)。所謂X鎖是事務(wù)T對(duì)數(shù)據(jù)A加上X鎖時(shí),只允許事務(wù)T讀取和修改數(shù)據(jù)A。所謂S鎖是事務(wù)T對(duì)數(shù)據(jù)A加上S鎖時(shí),其他事務(wù)只能再對(duì)數(shù)據(jù)A加S鎖,而不能加X鎖,直到T釋放A上的S鎖。若事務(wù)T對(duì)數(shù)據(jù)對(duì)象A加了S鎖,則T就可以對(duì)A進(jìn)行讀取,但不能進(jìn)行更新(S鎖因此又稱為讀鎖),在T釋放A上的S鎖以前,其他事務(wù)可以再對(duì)A加S鎖,但不能加X鎖,從而可以讀取A,但不能更新A。
在運(yùn)用X鎖和S鎖對(duì)數(shù)據(jù)對(duì)象加鎖時(shí),還需要約定一些規(guī)則,例如,何時(shí)申請(qǐng)X鎖或S鎖、持鎖時(shí)間、何時(shí)釋放等,稱這些規(guī)則為封鎖協(xié)議(Locking Protocol)。對(duì)封鎖方式規(guī)定不同的規(guī)則,就形成了各種不同的封鎖協(xié)議。一般使用三級(jí)封鎖協(xié)議,也稱為三級(jí)加鎖協(xié)議。該協(xié)議是為了保證正確的調(diào)度事務(wù)的并發(fā)操作。三級(jí)加鎖協(xié)議是事務(wù)在對(duì)數(shù)據(jù)庫(kù)對(duì)象加鎖、解鎖時(shí)必須遵守的一種規(guī)則。下面分別介紹這三級(jí)封鎖協(xié)議。
一級(jí)封鎖協(xié)議:事務(wù)T在修改數(shù)據(jù)R之前必須先對(duì)其加X鎖,直到事務(wù)結(jié)束才釋放。事務(wù)結(jié)束包括正常結(jié)束(COMMIT)和非正常結(jié)束(ROLLBACK)。一級(jí)封鎖協(xié)議可以防止丟失修改,并保證事務(wù)T是可恢復(fù)的。使用一級(jí)封鎖協(xié)議可以解決丟失修改問題。在一級(jí)封鎖協(xié)議中,如果僅僅是讀數(shù)據(jù)不對(duì)其進(jìn)行修改,是不需要加鎖的,它不能保證可重復(fù)讀和不讀“臟”數(shù)據(jù)。
二級(jí)封鎖協(xié)議:一級(jí)封鎖協(xié)議加上事務(wù)T在讀取數(shù)據(jù)R之前必須先對(duì)其加S鎖,讀完后方可釋放S鎖。二級(jí)封鎖協(xié)議除防止了丟失修改,還可以進(jìn)一步防止讀“臟”數(shù)據(jù)。但在二級(jí)封鎖協(xié)議中,由于讀完數(shù)據(jù)后即可釋放S鎖,所以它不能保證可重復(fù)讀。
三級(jí)封鎖協(xié)議:一級(jí)封鎖協(xié)議加上事務(wù)T在讀取數(shù)據(jù)R之前必須先對(duì)其加S鎖,直到事務(wù)結(jié)束才釋放。三級(jí)封鎖協(xié)議除防止了丟失修改和不讀“臟”數(shù)據(jù)外,還進(jìn)一步防止了不可重復(fù)讀。

4、以下關(guān)于mysql_pconnect的說(shuō)法中,正確的是( )。
A.與數(shù)據(jù)庫(kù)進(jìn)行多連接 B.與mysql_connect功能相同
C.與@mysql_connect功能相同 D.與數(shù)據(jù)庫(kù)建立持久連接
參考答案:D。
分析:mysql_pconnect()函數(shù)打開一個(gè)到 MySQL 服務(wù)器的持久連接。
mysql_pconnect()和mysql_connect()非常相似,雖然只多了一個(gè)p,但它們有兩個(gè)主要區(qū)別:當(dāng)連接的時(shí)候本函數(shù)將先嘗試尋找一個(gè)在同一個(gè)主機(jī)上用同樣的用戶名和密碼已經(jīng)打開的(持久)連接,如果找到,則返回此連接標(biāo)識(shí)而不打開新連接。其次,當(dāng)腳本執(zhí)行完畢后到SQL服務(wù)器的連接不會(huì)被關(guān)閉,此連接將保持打開以備以后使用(mysql_close()不會(huì)關(guān)閉由mysql_pconnect()建立的連接)。所以,選項(xiàng)D正確。

【真題204】 PDO通過執(zhí)行SQL查詢與數(shù)據(jù)庫(kù)進(jìn)行交互,可以分為多種不同的策略,使用哪一種方法取決于你要做什么操作。如果向數(shù)據(jù)庫(kù)發(fā)送DML語(yǔ)句,那么下面最合適的方式是( )。
A.使用PDO對(duì)象中的exec()方法
B.使用PDO對(duì)象中的query()方法
C.使用PDO對(duì)象中的prepare()和PDOStatement對(duì)象中的execute()兩個(gè)方法結(jié)合
D.以上方式都可以
參考答案:A。
分析:PDO->exec()方法主要是針對(duì)沒有結(jié)果集合返回的操作,例如INSERT、UPDATE、DELETE 等操作,它返回的結(jié)果是當(dāng)前操作影響的列數(shù)。所以,選項(xiàng)A正確。

5、PHP的mysql系列函數(shù)中常用的遍歷數(shù)據(jù)的函數(shù)是( )。
A.mysql_fetch_row,mysql_fetch_assoc,mysql_affetced_rows
B.mysql_fecth_row,mysql_fecth_assoc,mysql_affetced_rows
C.mysql_fetch_rows,mysql_fetch_array,mysql_fetch_assoc
D.mysql_fecth_row,mysql_fecth_array,mysql_fecth_assoc
參考答案:D。
分析:最常用的mysql系列函數(shù)常用的遍歷數(shù)據(jù)函數(shù)有mysql_fetch_row、mysql_fetch_ array和mysql_fetch_assoc等三個(gè)函數(shù),但不存在mysql_fetch_rows。
所以,本題的答案為D。

6、更改表字段名的標(biāo)準(zhǔn)語(yǔ)法為( )。
A.a(chǎn)lter table 表名 add 字段字類型[first|after]
B.a(chǎn)lter table 表名 drop 字段[first|after]
C.a(chǎn)lter table 表名 change 原名新名新類型[first|after]
D.a(chǎn)lter table 表名 modify 原名字段類型[first|after]
參考答案:C。
分析:修改表字段名的語(yǔ)法:alter table 表名change 原字段名新字段名類型;。
修改字段類型的語(yǔ)法:alter table 表名modify 字段名類型;。
增加一個(gè)字段:alter table 表名add column 字段名類型 not null(或default null);新增一個(gè)字段默認(rèn)不為空(默認(rèn)為空)。
刪除一個(gè)字段:alter table 表名drop column 新字段名;。

更多的PHP面試真題可以關(guān)注公眾號(hào)“琉憶編程庫(kù)”獲取。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/29792.html

相關(guān)文章

  • 活動(dòng):送兩本《PHP 程序員面試筆試真題解析

    摘要:程序員面試筆試真題解析歷時(shí)一年,由機(jī)械工業(yè)出版社出版,在年月問世。讓你在面試時(shí)順利的通過這些相關(guān)的真題現(xiàn)免費(fèi)送出本程序員面試筆試真題解析,具體參與規(guī)則如下在本文下留言即可參與,并且一個(gè)用戶的多次留言只算作一次。 考慮到近期是面試找工作潮,想搞個(gè)小活動(dòng)。你好,是我琉憶。 《 PHP 程序員面試筆試真題解析》歷時(shí)一年,由機(jī)械工業(yè)出版社出版,在 2018 年 11 月問世。本書的適用群體:剛...

    Kerr1Gan 評(píng)論0 收藏0
  • 個(gè)人建議之PHP面試的準(zhǔn)備

    摘要:個(gè)人也建議不要滿足于自己當(dāng)下所知道的,多去拓展自己,多去學(xué)新的東西。作為一個(gè)面試者來(lái)說(shuō),知識(shí)點(diǎn)的記憶準(zhǔn)備為的是更好的應(yīng)對(duì)面試中技術(shù)面中問到的各種問題。 你好,是我琉憶——PHP程序員面試筆試系列圖書的作者。 隨著越來(lái)越多的人開始邁入PHP開發(fā)工程師的隊(duì)列,不管是一個(gè)PHP新手還是一個(gè)有一兩年開發(fā)經(jīng)驗(yàn)的PHPer都不得不去面對(duì)找工作前面試這件事。 我現(xiàn)在以個(gè)人對(duì)面試的經(jīng)歷和見解來(lái)全面的對(duì)...

    macg0406 評(píng)論0 收藏0
  • PHP面試常考內(nèi)容之Memcache和Redis(3)

    摘要:自己整理了一篇不同等級(jí)面試都問什么的文章,關(guān)注公眾號(hào)琉憶編程庫(kù),回復(fù)等級(jí),我發(fā)給你。 你好,是我琉憶。今天是周五了,再上一天班就周末了,提前祝大家周末愉快。嘿嘿。這篇文章是本周Memcache和Redis內(nèi)存數(shù)據(jù)庫(kù)??嫉膶n}。本周一和周三更新的文章路徑:PHP面試??純?nèi)容之Memcache和Redis(1)PHP面試??純?nèi)容之Memcache和Redis(2)本周(2019.2-18至...

    Lionad-Morotar 評(píng)論0 收藏0
  • PHP面試??純?nèi)容之Memcache和Redis(3)

    摘要:自己整理了一篇不同等級(jí)面試都問什么的文章,關(guān)注公眾號(hào)琉憶編程庫(kù),回復(fù)等級(jí),我發(fā)給你。 你好,是我琉憶。今天是周五了,再上一天班就周末了,提前祝大家周末愉快。嘿嘿。這篇文章是本周Memcache和Redis內(nèi)存數(shù)據(jù)庫(kù)??嫉膶n}。本周一和周三更新的文章路徑:PHP面試常考內(nèi)容之Memcache和Redis(1)PHP面試??純?nèi)容之Memcache和Redis(2)本周(2019.2-18至...

    zhaochunqi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<