日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

PHP面试

發(fā)布時間:2023/12/20 php 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PHP面试 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.什么是面向?qū)ο?#xff1f;??????

面向?qū)ο笫浅绦虻囊环N設(shè)計方式,它利于提高程序的重要性,使程序更加清晰。

主要特征:封裝、繼承、多態(tài)。

三大特點:

a.封裝性:也稱為信息隱藏,就是將一個類的使用和實現(xiàn)分開,只保留部分接口和方法與外部聯(lián)系,或者說只公開了一些供開發(fā)人員使用的方法。于是開發(fā)人員只需要關(guān)注這個類如何使用,不用去關(guān)心具體的實現(xiàn)過程,這樣就能實現(xiàn)MVC的分工合作,也可以有效的避免程序之間相互依賴,從而實現(xiàn)代碼模塊之間的松耦合。

b.繼承性:子類自動繼承父類中的屬性和方法,并且可以添加新的屬性和方法或者對父類的部分屬性和方法進行重寫。繼承增加了代碼的可重用性。PHP只支持單繼承,一個子類只能繼承一個父類。

c.多態(tài)性:子類繼承了父類中的屬性和方法,并對其中部分方法進行重寫。于是多個子類中雖然都具有用一個方法,但是這些子類實例化的對象調(diào)用這些相同的方法后可以得到不同的結(jié)果,這就是多態(tài)性。

2.面向?qū)ο蟮钠叽笤瓌t:

  • 單一職責(zé)原則

? ? ? ? 一個類只負責(zé)一項職責(zé)。

  • 開放封閉原則

? ? ? ? 一個軟件實體,如類、模塊和函數(shù)應(yīng)該對擴展開放,對修改關(guān)閉

  • 里式替換原則

? ? ? ? 子類可擴展父類功能,但不能改變父類原有的功能。

  • 依賴倒置原則

? ? ? ? 高層模塊不應(yīng)該依賴底層模塊,二者都應(yīng)該依賴細節(jié),細節(jié)應(yīng)該依賴抽象。

  • 接口隔離原則

? ? ? ? 客戶端不應(yīng)該依賴它不需要的接口,并盡力實現(xiàn)單一職責(zé)原則。例:訂單接口可分為下單接口、發(fā)貨接口、退貨接口等,而不能將訂單相關(guān)的方法都定義到一個接口中。

  • 迪米特原則

? ? ? ? 又稱為 最少知道法則,只與朋友通信,表示一個對象應(yīng)該對其他對象表示最少的了解,也就是一個類除了提供公共方法,不對外泄露任何信息。

  • 合成/聚合復(fù)用原則

????????它要求在軟件復(fù)用時,要盡量先使用組合或者聚合等關(guān)聯(lián)關(guān)系來實現(xiàn),其次才考慮使用繼承關(guān)系來實現(xiàn)。

? ? ? ? 如果要使用繼承關(guān)系,則必須嚴格遵循里式替換原則。合成復(fù)用原則同里氏替換原則相輔相成的,兩者都是開閉原則的具體實現(xiàn)規(guī)范。

????????

3.合并兩個數(shù)組有幾種方式,比較他們的異同

方式:

array_merge()、+、array_merge_recursive()

異同:

array_merge()簡單的合并數(shù)組;

array_merge_recursive()合并兩個數(shù)組,如果數(shù)組中有完全一樣的數(shù)據(jù),將它們遞歸合并;array_merge()和‘+’:合并兩個數(shù)組,前者將值作為新數(shù)組的鍵。

4.PHP的is_writeable()函數(shù)存在bug,無法準(zhǔn)確判斷一個目錄/文件是否可寫,請寫一個函數(shù)來判斷目錄/文件是否絕對可寫

答:其中bug存在兩個方面,

1.在Windows中,當(dāng)文件只有只讀屬性時,is_writeable()函數(shù)才返回FALSE,當(dāng)返回TRUE時,改文件不一定是可寫的。

如果是目錄,在目錄中新建文件并通過打開文件來判斷;

如果是文件,可通過打開文件(fopen),來測試文件是否可寫。

2.在Unix中,當(dāng)PHP配置文件中開啟safe_mode時(safe_mode=on),is_writeable()同樣不可用。

函數(shù):?

function is_really_writable($file) {if (DIRECTORY_SEPARATOR === '/') {return is_writable($file);}if (is_dir($file)) {$file = rtrim($file, '/') . '/' . md5(mt_rand());if (($fp = @fopen($file, 'ab')) === FALSE) {return FALSE;}fclose($fp);@chmod($file, 0777);@unlink($file);return TRUE;} elseif (!is_file($file) OR ($fp = @fopen($file, 'ab')) === FALSE) {return FALSE;}fclose($fp);return TRUE; }

?5.PHP的垃圾收集機制是怎樣的?

PHP可以自動進行內(nèi)存管理,清除不再需要的對象。

PHP使用了引用計數(shù)(reference counting)這種單純的垃圾回收(garbage collection)機制。

每個對象都內(nèi)含一個引用計數(shù)器,每個reference連接到對象,計數(shù)器加1。當(dāng)reference離開生存空間或被設(shè)為null,計數(shù)器減1。當(dāng)某個對象的引用計數(shù)器為零時,PHP知道你將不再需要這個對象,就會釋放所占的內(nèi)存空間。

6.寫一個函數(shù),盡可能高效的,從一個標(biāo)準(zhǔn)的URL里提取出文件的擴展名

例如:http://www.abc.com/de/wander.php?id=001 需要取出 ‘php’ 或者 ‘.php’

//方案一 function getExt1($url){$arr = parse_url($url);//Array([scheme]=>http [host]=>www.abc.com [path]=>/de/wander.php [query]=>id=001)$file = basename($arr['path']); //wander.php?id=001$ext = explode('.',$file);return $ext[count($ext)-1]; }//方案二 function getExt2($url){$url = basename($url); //wander.php?id=001$pos1 = strpos($url,'.'); //6$pos2 = strpos($url,'?'); //10if (strstr($url,'?')) {return substr($url,$pos1+1,$pos2-$pos1-1); } else {return substr($url,$pos1);}}$url= "http://www.abc.cn/de/wander.php?id=001";echo getExt1($path);echo "<br />";echo getExt2($path);

7.使用正則表達式提取一段表示語言(html或XML)

代碼段中指定標(biāo)簽的指定屬性值(需要考慮屬性值不規(guī)則的情況,如大小寫不敏感,屬性名值與等號之間有空格等)此處假設(shè)需要提取test標(biāo)簽的attr屬性值,請自行構(gòu)建改標(biāo)簽的串(騰訊)

代碼如下:

<?phpheader("content-type:text/html;charset=utf-8");function getAttrValue($str,$tagName,$attrName){$pattern1="/<".$tagName."(s+w+s*=s*(['"]?)([^'"]*)())*s+".$attrName."s*=s*(['"]?)([^'"]*)()(s+w+s*=s*(['"]?)([^'"]*)(9))*s*>/i";$arr=array();$re=preg_match($pattern1,$str,$arr);if($re){echo"<br/>$arr[6]={$arr[6]}";}else{echo"<br/>沒找到。";}}// 示例$str1="<test attr='ddd'>";getAttrValue($str1,"test","attr");//找test標(biāo)簽中attr屬性的值,結(jié)果為ddd$str2="<test2 attr='ddd'attr2='ddd2't1="t1 value"t2='t2 value'>";getAttrValue($str2,"test2","t1");//找test2標(biāo)簽中t1屬性的值,結(jié)果為t1 value?>

8.php中web上傳文件的原理是什么,如何限制上傳文件的大小?

上傳文件的表單使用post方式,并且要在form中添加enctype=“multipart/form-data“。

一般可以加上隱藏域:<input type= hidden name = 'MAX_FILE_SIZE'? value=1024>,位置在file域前面。value的值一般是上傳文件的客戶端字節(jié)限制。可以避免用戶在花時間等待上傳大文件之后才發(fā)現(xiàn)文件上傳過大失敗的麻煩。

使用file文件域來選擇上傳的文件,當(dāng)點擊提交按鈕之后,文件會被上傳到服務(wù)器的臨時目錄,在腳本運行結(jié)束時會被銷毀,所以應(yīng)該在在腳本結(jié)束之前,將其移動到服務(wù)器的某個目錄下,可以通過函數(shù)move_uploaded_file()來移動臨時文件,獲取臨時文件的信息可以使用 $_FILES。

限制文件大小的因素有:

客服端隱藏域的MAX_FILE_SIZE的數(shù)值(可以被繞開)

服務(wù)器端的upload_max_filesize,post_max_size和memory_limit。這幾項不能夠用腳本來設(shè)置。

自定義文件大小限制邏輯。即使服務(wù)器的限制是能夠自己決定,也會有特殊情況考慮,所以這個限制方式經(jīng)常是必要的。

9.請說明PHP中傳值和傳引用的區(qū)別,什么時候傳值什么時候引用?

按值傳遞:函數(shù)范圍內(nèi)對值的任何改變在函數(shù)外部都會被忽略。

按引用傳遞:函數(shù)范圍內(nèi)對值的任何改變在函數(shù)外部也能反映出這些修改

優(yōu)缺點:按值傳遞時,PHP必須復(fù)制值。特別是對于大型的字符串和對象來說,這將會是一個代價很大的操作。按引用傳遞不需要復(fù)制值。對于性能提高很有好處。

10.mysql數(shù)據(jù)庫中的字段類型varchar和char的主要區(qū)別是什么?

char:

  • char表示定長字符串,長度是固定的;
  • 如果插入數(shù)據(jù)的長度小于char的固定長度時,則用空格填充;
  • 因為長度固定,所以存取速度要比varchar快很多,甚至能快50%,但正因為其長 度固定,所以會占據(jù)多余的空間,是空間換時間的做法;
  • 對于char來說,最多能存放的字符個數(shù)為255,和編碼無關(guān)
  • varchar:

  • varchar表示可變長字符串,長度是可變的; 插入的數(shù)據(jù)是多長,就按照多長來存儲;
  • varchar在存取方面與char相反,它存取慢,因為長度不固定,但正因如此,不占 據(jù)多余的空間,是時間換空間的做法;
  • 對于varchar來說,最多能存放的字符個數(shù)為65532
  • 日常的設(shè)計,對于長度相對固定的字符串,可以使用char,對于長度不確定的,使用 varchar更合適一些。

    11.php7的新特性

    標(biāo)量類型聲明:PHP7中的函數(shù)的形參類型聲明可以為標(biāo)量。在PHP5中只能是類名、接口、array或者callable(PHP5.4,既可以是函數(shù),包括匿名函數(shù)),現(xiàn)在能使用string、int、float、和bool。

    返回值類型聲明:增加了對返回值類型聲明的支持。類似于參數(shù)類型聲明,返回值類型聲明指明了函數(shù)返回值的類型。可用的類型與參數(shù)聲明中可用的類型相同。

    null合并運算符:由于日常使用中大量同時使用三元表達式和isset()的情況,null合并運算符使得變量存在且值不為null,它就會返回自身值,否則返回它的第二個操作數(shù)。

    use加強:從同一namespace導(dǎo)入的類、函數(shù)和常量現(xiàn)在可以通過單個use語句一次性導(dǎo)入匿名類,現(xiàn)在支持通過new class 來實例化一個匿名類。

    12.如何處理負載,高并發(fā)?

    1、html靜態(tài)化

    ?效率最高、消耗最少的就是純靜態(tài)化的HTML頁面,所有我們盡可能使我們的網(wǎng)站頁面采用靜態(tài)化實現(xiàn),這個最簡單的方法其實也是最有效的方法。

    2、圖片服務(wù)器分離

    把圖片單獨存儲,盡可能減收圖片等大流量的開銷,可以放在一些相關(guān)的平臺上,如七牛云、騰訊云等。

    3、數(shù)據(jù)庫集群和庫表散列及緩存

    數(shù)據(jù)庫的并發(fā)鏈接為100,一臺數(shù)據(jù)庫遠遠不夠,可以從讀寫分離、主從復(fù)制,數(shù)據(jù)庫集群方面來入手。另外盡量減少數(shù)據(jù)庫的訪問,可以使用緩存數(shù)據(jù)庫如memcache、redis等。

    4、鏡像

    盡量減少下載,可以把不同的請求分發(fā)到多個鏡像端。

    5、負載均衡

    Apache的最大并發(fā)連接為1500,只能增加服務(wù)器,可以從硬件上著手,如F5服務(wù)器,當(dāng)然硬件的成本比較高,我們往往是從軟件方面著手。

    13.常見的PHP安全性攻擊SQL注入:

    用戶利用在表單字段輸入SQL語句的方式來影響正常SQL的執(zhí)行。

    防止:使用mysql_real_escape_string()過濾數(shù)據(jù) 手動檢查每一數(shù)據(jù)是否為正確的數(shù)據(jù)類型,使用預(yù)處理語句并綁定變量。

    參數(shù)化SQL: 是指在設(shè)計與數(shù)據(jù)庫鏈接并訪問數(shù)據(jù)時,需要再填入數(shù)值或數(shù)據(jù)的地方,試用參數(shù)(parameter)來給值,用@或?來表示參數(shù)。

    XSS攻擊:跨站點腳本攻擊,由用戶輸入一些數(shù)據(jù)到你的網(wǎng)站,其中包括客戶端腳本(通常JavaScript)。如果你沒有過濾就輸出數(shù)據(jù)到另一個web頁面,這個腳本將被執(zhí)行。

    防止:為了防止xss攻擊,使用PHP的htmlentitles()函數(shù)過濾在輸出到瀏覽器。

    CSRF:跨站點請求偽造,是指一個頁面發(fā)出的請求,看起來像網(wǎng)站的信任用戶,但是是偽造的。

    防止:一般來說,確保用戶來自你的表單,并且匹配每一個你發(fā)出去的表單。有兩點一定要記住:對用戶會話采用適當(dāng)?shù)陌踩胧?#xff0c;例如:每一個會話更新id和用戶使用SSL。生成另一個一次性的令牌并將其嵌入表單,保存在會話中(一個會話變量),在提交時檢查它。如laravel中的_token。

    代碼注入:代碼注入是利用計算機漏洞通過無效數(shù)據(jù)造成的。問題在于,當(dāng)你不小心執(zhí)行任意代碼,通常通過文件包含。寫的很糟糕的代碼可以允許一個遠程文件包含并執(zhí)行。如許多PHP函數(shù),如require可以包含URL或文件名。

    防止:過濾用戶輸入,在php.ini中設(shè)置禁用allow_url_fopen和allow_url_include。這將禁用require、include、fopen的遠程文件。

    14.靜態(tài)化如何實現(xiàn)?偽靜態(tài)如何實現(xiàn)?

    1、靜態(tài)化是指頁面靜態(tài)化,就是實實在在的靜態(tài)化文件,不需要查詢數(shù)據(jù)庫就可以直接從文件中獲取數(shù)據(jù),指的是真靜態(tài)。

    實現(xiàn)方式主要有兩種:

    a、我們在添加信息入庫的時候就生成的靜態(tài)文件,也成為模本替換技術(shù)。

    b、用戶在訪問我們的頁面時先判斷是否有對應(yīng)的緩存文件存在,如果存在直接讀取緩存,不存在就讀取數(shù)據(jù)庫,同時生成緩存文件。

    2、偽靜態(tài)不是真正意義上的靜態(tài)化,之所以使用偽靜態(tài),主要是為了SEO推廣,搜索引擎對動態(tài)的文件獲取難度大,不利于網(wǎng)站推廣。

    實現(xiàn)原理:基于Apache或Nginx的rewrite。

    方式主要有兩種:

    a、直接在配置虛擬機的位置配置偽靜態(tài),這個每次修改都要重啟web服務(wù)器。

    b、采用分布式的,可以在網(wǎng)站的根目錄上創(chuàng)建‘.htaccess’的文件,在里面配置相應(yīng)的重寫規(guī)則來實現(xiàn)偽靜態(tài),這種方式重寫時不需要重啟web服務(wù)器,且結(jié)構(gòu)上比較清晰。

    15、說說對SQL語句優(yōu)化有哪些方法?

    1、where子句中:where表之間的連接必須寫在其他where條件之前,那些可以過濾最大數(shù)量記錄的條件必須寫在where子句的末尾,having寫在最后。

    2、用exists代替in、用not exists代替 not in。

    3、避免在索引列上使用計算。

    4、避免在索引列上使用is null 和is not null 。

    5、對查詢進行優(yōu)化,應(yīng)該盡量避免全表掃描,首先應(yīng)該考慮在where及order by 涉及的列上建立索引。

    6、應(yīng)該盡量避免在where子句中對字段進行null值判斷,否則將導(dǎo)致引擎放棄使用而進行全表掃描。

    7、應(yīng)盡量避免在where子句中對字段進行表達式操作,這將導(dǎo)致引擎放棄使用索引而進行全表掃描。

    8、應(yīng)盡量避免在 where 子句中使用 or 來連接條件,否則將導(dǎo)致引擎放棄使用索引而進行全表掃描。

    如:

    select id from t where num=10 or num=20#可以這樣查詢:select id from twhere num=10union allselect id from twhere num=20

    9、索引并不是越多越好,索引固然可以提高相應(yīng)的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。一個表的索引數(shù)最好不要超過6個,若太多則應(yīng)考慮一些不常使用到的列上建的索引是否有必要。

    10、在新建臨時表時,如果一次性插入數(shù)據(jù)量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果數(shù)據(jù)量不大,為了緩和系統(tǒng)表的資源,應(yīng)先create table,然后insert。

    16、MySQL數(shù)據(jù)庫作發(fā)布系統(tǒng)的存儲,一天五萬條以上的增量,預(yù)計運維三年,怎么優(yōu)化?

    1、設(shè)計良好的數(shù)據(jù)庫結(jié)構(gòu),允許部分數(shù)據(jù)冗余,盡量避免join查詢,提高效率。

    2、選擇合適的表字段數(shù)據(jù)類型和存儲引擎,適當(dāng)?shù)奶砑铀饕?/p>

    3、做mysql的主從復(fù)制讀寫分離。

    4、對數(shù)據(jù)表進行分表,減少表單中的數(shù)據(jù)提高查詢速度。

    5、添加緩存機制,如Redis,memcached等。

    6、對不經(jīng)常改動的頁面,生成靜態(tài)頁面(比如做ob緩存)。

    7、書寫高效率SQL。比如select*from tabel 改為 select field_1,field_2? from table。

    17、對于大流量的網(wǎng)站,采用什么樣的方法來解決各頁面訪問量統(tǒng)計問題?

    1、確認服務(wù)器是否能支持當(dāng)前訪問量。

    2、優(yōu)化數(shù)據(jù)庫訪問。

    3、禁止外部訪問鏈接(盜鏈),比如圖片盜鏈。

    4、控制文件下載。

    5、做負載均衡,使用不同主機分流。

    6、使用瀏覽統(tǒng)計軟件,了解訪問量,有針對性的進行優(yōu)化。

    18、談?wù)勀銓ysql引擎中的MyISAM與InnoDB的區(qū)別理解?

    1、存儲結(jié)構(gòu)

    MyISAM:每個MyISAM在磁盤上存儲成三個文件。第一個文件的名字以表的名字開始,擴展名指出文件類型。.frm文件存儲表定義。數(shù)據(jù)文件的擴展名為.MYD(MYData)。索引文件的擴展名是.MYI(MYIndex)。

    InnoDB:所有的表都保存在弄一個數(shù)據(jù)文件中(也可能是多個文件,或者獨立的表空間文件),InnoDB表的大小只受限于操作系統(tǒng)文件的大小,一般為2GB。

    2、存儲空間

    MyISAM:可被壓縮,存儲空間較小。支持三種不同的存儲格式:靜態(tài)表(默認,但是注意數(shù)據(jù)末尾不能有空格,會被去掉)、動態(tài)表、壓縮表。

    InnoDB:需要更多地內(nèi)存和存儲,它會在主內(nèi)存中建立其專用的緩沖池用于高速緩沖數(shù)據(jù)和索引。

    3、可移植性、備份及恢復(fù)

    MyIASM:數(shù)據(jù)是以文件的形式存儲,所以在跨平臺的數(shù)據(jù)轉(zhuǎn)移中會很方便。在備份和恢復(fù)時可單獨針對某個表進行操作。

    InnoDB:免費的方案可以是拷貝數(shù)據(jù)文件、備份binlog,或者用mysqldump,在數(shù)據(jù)量達到幾十G的時候就相對痛苦了。

    4、事務(wù)支持

    MyIASM:強調(diào)的是性能,每次查詢都具有原子性,其執(zhí)行速度比InnoDB類型更快。但是不提供事務(wù)支持。

    InnoDB:提供事務(wù)支持事務(wù),外部鍵等高級數(shù)據(jù)庫功能。具有事務(wù)(commit)、回滾(rollback)和崩潰修復(fù)能力(crash recovery capabilities)的事務(wù)安全(transaction-safe(ACID compliant))型表。

    5、AUTO_INCREMENT

    MyISAM:可以和其他字段一起建立聯(lián)合索引。引擎的自動增長列必須是索引,如果是組合索引,自動增長可以不是第一列,他可以根據(jù)前面幾列進行排序后遞增。

    InnoDB:InnoDB中必須包含該字段的索引。引擎的自動增長列必須是索引,如果是組合索引也必須是組合索引的第一列。

    6、表鎖差異

    MyISAM:只支持表級鎖,用戶在操作myisam表時,select,update,delete,insert語句都會給表自動加鎖,如果加鎖以后的表滿足insert并發(fā)的情況下,可以在表的尾部插入新的數(shù)據(jù)。

    InnoDB:支持事務(wù)和行級鎖,是innodb的最大特色。行鎖大幅度提高了多用戶并發(fā)操作的新能。但是InnoDB的行鎖,只是在WHERE的主鍵是有效的,非主鍵的WHERE都會鎖全表的。

    7、全文索引

    MyISAM:支持 FULLTEXT類型的全文索引

    InnoDB:不支持FULLTEXT類型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。

    8、表主鍵

    MyISAM:允許沒有任何索引和主鍵的表存在,索引都是保存行的地址。

    InnoDB:如果沒有設(shè)定主鍵或者非空唯一索引,就會自動生成一個6字節(jié)的主鍵(用戶不可見),數(shù)據(jù)是主索引的一部分,附加索引保存的是主索引的值。

    9、表的具體行數(shù)

    MyISAM:保存有表的總行數(shù),如果select count(*) from table;會直接取出出該值。

    InnoDB:沒有保存表的總行數(shù),如果使用select count(*) from table;就會遍歷整個表,消耗相當(dāng)大,但是在加了wehre條件后,myisam和innodb處理的方式都一樣。

    10、CURD操作

    MyISAM:如果執(zhí)行大量的SELECT,MyISAM是更好的選擇。

    InnoDB:如果你的數(shù)據(jù)執(zhí)行大量的INSERT或UPDATE,出于性能方面的考慮,應(yīng)該使用InnoDB表。DELETE 從性能上InnoDB更優(yōu),但DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的刪除,在innodb上如果要清空保存有大量數(shù)據(jù)的表,最好使用truncate table這個命令。

    11、外鍵

    MyISAM:不支持

    InnoDB:支持

    通過上述的分析,基本上可以考慮使用InnoDB來替代MyISAM引擎了,原因是InnoDB自身很多良好的特點,比如事務(wù)支持、存儲 過程、視圖、行級鎖定等等,在并發(fā)很多的情況下,相信InnoDB的表現(xiàn)肯定要比MyISAM強很多。另外,任何一種表都不是萬能的,只用恰當(dāng)?shù)尼槍I(yè)務(wù)類型來選擇合適的表類型,才能最大的發(fā)揮MySQL的性能優(yōu)勢。如果不是很復(fù)雜的Web應(yīng)用,非關(guān)鍵應(yīng)用,還是可以繼續(xù)考慮MyISAM的,這個具體情況可以自己斟酌。

    19.Redis和memcached緩存的區(qū)別?

    總結(jié)一:

    1、數(shù)據(jù)類型

    Redis數(shù)據(jù)類型豐富,支持set list 等類型

    memcached支持簡單數(shù)據(jù)類型,需要客戶端自己處理復(fù)雜對象

    2、持久性

    Redis支持數(shù)據(jù)落地持久化存儲

    memcached不支持數(shù)據(jù)持久存儲

    3、分布式存儲

    Redis支持master-slave復(fù)制模式

    memcached可以使用一致性hash做分布式

    value大小不同

    memcache是一個內(nèi)存緩存,key的長度小于250字符,單個item存儲要小于1M,不適合虛擬機使用,

    4、數(shù)據(jù)一致性不同

    Redis使用的是單線程模型,保證了數(shù)據(jù)按順序提交。

    memcache需要使用cas保證數(shù)據(jù)一致性。CAS(Check and Set)是一個確保并發(fā)一致性的機制,屬于‘樂觀鎖’范圍;原理和簡單:拿到版本號,操作,對比版本號,如果一致就操作,不一致就放棄任何操作。

    5、cup利用

    Redis單線程模型只能使用一個cup,可以開啟多個Redis進程。

    總結(jié)二:

    1、Redis中,并不是所有的數(shù)據(jù)都一直存儲在內(nèi)存中的,這是和Memcache相比一個最大的區(qū)別。

    2、Redis不僅僅支持簡單的k/v類型的數(shù)據(jù),同時還提供list、set、hash等數(shù)據(jù)結(jié)構(gòu)的存儲。

    3、Redis支持數(shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。

    4、Redis支持數(shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中,重啟的時候可以再次加載進行使用。

    我個人認為最本質(zhì)的不同是Redis在很多方面具備數(shù)據(jù)庫的特征,或者說就是一個數(shù)據(jù)庫系統(tǒng),而memcached只是簡單的k/v緩存。

    總結(jié)三:

    Redis和memcached的不同在于:

    1、存儲方式:

    memcached把數(shù)據(jù)全部存在之中,斷點后會掛掉,數(shù)據(jù)不能超過內(nèi)存大小

    Redis有部分存在硬盤上,這樣能保證數(shù)據(jù)的持久性。

    2、數(shù)據(jù)支持類型:

    Redis在數(shù)據(jù)支持上要比memcached多的多。

    3、使用底層模型不同:

    新版本的Redis直接自己構(gòu)建了VM機制,因為一般的系統(tǒng)調(diào)用系統(tǒng)函數(shù)的話,會浪費一定的時間去移動和請求。

    4、運行環(huán)境不同:

    Redis目前官方只支持Linux上運行,從而省去了對于其他系統(tǒng)的支持,這樣的話可以把更好的把精力用于本系統(tǒng)環(huán)境上的優(yōu)化,雖然后來微軟有一個小組為其寫了補丁。但是沒有放到主干上。

    redis的內(nèi)容是可以落地的,就是說跟MongoDB有些類似,然后redis也可以作為緩存,并且可以設(shè)置master-slave

    20、Redis消息隊列先進先出需要注意什么?

    答:通常使用一個list來實現(xiàn)隊列操作,這樣有一個小限制,所有的任務(wù)統(tǒng)一都是先進先出,如果想優(yōu)先處理某個任務(wù)就不太好處理了,這就需要讓隊列有優(yōu)先級的概念,我們就可以優(yōu)先處理高級別的任務(wù),實現(xiàn)方式有以下幾種方式:

    1)單一列表實現(xiàn):隊列正常的操作是左進右出(lpush,rpop)為了先處理高優(yōu)先級任務(wù),在遇到高級別任務(wù)時,可以直接插隊,直接放入隊列頭部(rpush),這樣,從隊列頭部(右側(cè))獲取任務(wù)時,取到的就是高優(yōu)先級的任務(wù)(rpop)。

    2)使用兩個隊列,一個普通隊列,一個高級隊列,針對任務(wù)的級別放入不同的隊列,獲取任務(wù)時也很簡單,redis的BRPOP命令可以按順序從多個隊列中取值,BRPOP會按照給出的 key 順序查看,并在找到的第一個非空 list 的尾部彈出一個元素,redis> BRPOP list1 list2 0

    list1 做為高優(yōu)先級任務(wù)隊列l(wèi)ist2 做為普通任務(wù)隊列這樣就實現(xiàn)了先處理高優(yōu)先級任務(wù),當(dāng)沒有高優(yōu)先級任務(wù)時,就去獲取普通任務(wù)方式1 最簡單,但實際應(yīng)用比較局限,方式3可以實現(xiàn)復(fù)雜優(yōu)先級,但實現(xiàn)比較復(fù)雜,不利于維護方式2 是推薦用法,實際應(yīng)用最為合適

    21、Redis如何防止高并發(fā)?

    答:其實Redis是不會存在并發(fā)問題的,因為它是單線程的,再多的命令都是一個接一個的去執(zhí)行的。我們用的時候,可能會出現(xiàn)并發(fā)問題,比如獲得和設(shè)定這一對。

    Redis的為什么有高并發(fā)問題?

    Redis是一種單線程機制的nosql數(shù)據(jù)庫,基于key-value,數(shù)據(jù)可持久化落盤。由于單線程所以redis本身并沒有鎖的概念,多個客戶端連接并不存在競爭關(guān)系,但是利用jedis等客戶端對redis進行并發(fā)訪問時會出現(xiàn)問題。發(fā)生連接超時、數(shù)據(jù)轉(zhuǎn)換錯誤、阻塞、客戶端關(guān)閉連接等問題,這些問題均是由于客戶端連接混亂造成。

    同時,單線程的天性決定,高并發(fā)對同一個鍵的操作會排隊處理,如果并發(fā)量很大,可能造成后來的請求超時。

    在遠程訪問redis的時候,因為網(wǎng)絡(luò)等原因造成高并發(fā)訪問延遲返回的問題。

    解決辦法:

    在客戶端將連接進行池化,同時對客戶端讀寫Redis操作采用內(nèi)部鎖synchronized。

    服務(wù)器角度,利用setnx變向?qū)崿F(xiàn)鎖機制。

    22、PHP與那些編程語言相似?

    Perl、C

    23、PHP的全程?

    hypwetext Perprocessor (超文本預(yù)處理器)

    24、PHP是否支持多繼承?

    PHP只支持單繼承。使用關(guān)鍵字extends。

    25、使用final修飾的類和方法代表什么意思?

    final修飾的類不允許被繼承,修飾的方法不允許被重寫。

    26、PHP中如何比較兩個對象?

    可以使用 ‘==’ 來比較兩個對象是否為同一實例,并且擁有相同的屬性和屬性值。

    27、PHP和JavaScript是如何交互的?

    PHP和JavaScript無法直接進行交互,因為PHP是一種服務(wù)器端語言,而JavaScript是一種瀏覽器語言。但是可以交換變量,因為PHP可以生成將由瀏覽器執(zhí)行的JavaScript代碼,并且通過URL將特定的變量傳遞回PHP。

    28、PHP處理圖片需要添加什么擴展?

    需要添加GD庫執(zhí)行處理圖片功能。

    29、獲取圖片屬性(size、width和height)的函數(shù)是什么?

    • 獲取圖片大小size:gettimagesize()?
    • 獲取圖片寬度width: imagesx()
    • 獲取圖片高度height:imagesy()

    30、include() 和 require()? 在執(zhí)行失敗的情況下有什么不同?

    • include() 會產(chǎn)生一個禁告,不影響后去程序的執(zhí)行
    • require() 會產(chǎn)生一個致命錯誤,后去程序停止執(zhí)行

    31、函數(shù)的作用?

    • is_numeric():檢查是否為數(shù)字。
    • ctype_alnum():檢查是否為字母數(shù)字字符。
    • empty():檢查變量是否具有值。
    • unlink():用于文件系統(tǒng)處理,刪除文件。
    • unset():用于變量管理,可以是變量變?yōu)槲炊x。
    • stripslash():刪除字符串中的轉(zhuǎn)義字符。
    • get_magic_quotes_gpc():告訴我們魔術(shù)引號

    32、怎么在PHP中定義常量?

    • 使用define()函數(shù)定義,語法“define(常量名, 常量值,是否大小寫敏感)”;
    • 使用const關(guān)鍵字定義,語法“const 常量名 = 常量值;”。

    33、如何在PHP中強制轉(zhuǎn)化類型?

    ? ? ?1.?(int) (bool) (float) (string) (array) (object)

    ? ? ?2. intval() floatval() strval()

    ?????3.settype()

    ????????

    ?

    34、PHP中三元運算符如何使用?

    (條件)? (返回值1) : (返回值2)

    若條件為真,則返回值1,

    若條件為假,則返回值2.

    35、函數(shù)func_num_args()的作用是什么?

    函數(shù) func_num_args() 用于提供傳遞給函數(shù)的參數(shù)數(shù)量

    ?

    36、如果變量$var1 = 10,變量$var2 = 'var1' ,那么$$var2的值為多少?

    $$var2 = $var1 ,$var1 = 10?

    所有 $$var2 值為10

    37、通過 ::訪問意味著什么?

    :: 用于訪問不需要對象初始化的靜態(tài)方法。

    38、永久性cookie的含義是什么?

    永久性的cookie存儲在瀏覽器計算機的cookie文件中,默認情況下,cookie是臨時的,關(guān)閉瀏覽器后,cookie會被刪除。

    39、會話合適結(jié)束?

    會話在PHP建表完成時自動結(jié)束,也可以使用session_write_close()手動結(jié)束。

    40、session_unregister()和session_unset()有什么區(qū)別?

    • session_unregister():從當(dāng)前會話中注銷全局變量
    • session_unset():釋放所有會話變量

    41、$_FILES['userfile']['name']和$_FILES['userfile']['tmp_name']有什么區(qū)別?

    • $_FILES['userfile']['name'] :表示客戶端上傳文件原始名稱
    • $_FILES['userfile']['tmp_name']:表示服務(wù)器上存儲的文件的臨時文件名

    42、上傳文件出問題時,如何獲取錯誤信息?

    $_FILES['userfile']['error'] 包括了上傳文件有關(guān)的錯誤代碼。

    43、如何更改上傳文件大小的最大值?

    通過修改php.ini中的upload_max_filesize來修改上傳文件大小的最大值。

    44、函數(shù)strstr() 和函數(shù)stristr() 有什么區(qū)別?

    函數(shù)?strstr ($haystack, $needle, $before_needle = null)?

    區(qū)別:stristr() 除了不區(qū)分大小寫之外,與 strstr() 完全相同。

    45、PHP中默認會話時間是什么?

    PHP中默認會話時間是直到瀏覽器關(guān)閉為止。

    46、http狀態(tài)碼

    1、狀態(tài)碼分類:

    • 1××:信息,服務(wù)器收到請求
    • 2××:成功
    • 3××:重定向
    • 4××:客戶端錯誤
    • 5××:服務(wù)端錯誤

    2、常用狀態(tài)碼

    • 200:請求成功
    • 301:永久重定向
    • 302:臨時移動
    • 400 bad request:客戶端請求語法錯誤
    • 401 unauthorized:客戶端沒有權(quán)限
    • 403 forbidden :服務(wù)器拒絕客戶端請求
    • 404 not found :客戶端請求資源不存在
    • 500 Internal Server Error?: 服務(wù)器內(nèi)部錯誤
    • 502 bad gateway :作為網(wǎng)關(guān)或者代理工作的服務(wù)器嘗試執(zhí)行請求時,從上游服務(wù)器接受到無效的響應(yīng)。
    • 503 service unavailable :超載或系統(tǒng)維護
    • 504 Gateway timeout :網(wǎng)關(guān)超時

    3、502的原因及解決辦法

    原因:Nginx將請求提交給網(wǎng)關(guān)(php-fpm)處理異常導(dǎo)致

    1)fastcgi 緩沖區(qū)設(shè)置過小

    fastcgi_buffer_size 32k;

    2)php-cgi的進程數(shù)設(shè)置過少

    查看FastCgi進程數(shù):netstat -anpo | grep "php-cgi"| wc -l

    調(diào)整參數(shù)最大子進程數(shù):max_children

    一般按照單個進程20M計算需要需要設(shè)置的子進程數(shù)

    3)max_requests(內(nèi)存溢出或頻繁重啟)

    參數(shù)指明每個children最多能處理的請求數(shù)量,到達最大值之后會重啟children。

    設(shè)置過小可能導(dǎo)致頻繁重啟children:

    php將請求輪詢給每個children,在大流量的場景下,每一個children 到達最大值的時間差不多,如果設(shè)置過小可能多個children 在同一時間關(guān)閉,nginx無法將請求轉(zhuǎn)發(fā)給php-fpm,cpu降低,負載變高。

    設(shè)置過大可能導(dǎo)致內(nèi)存泄露

    4)php執(zhí)行時間超過nginx等待時間

    fastcgi_connect_timeout

    fastcgi_send_timeout

    fastcgi_read_timeout

    5)fastcgi執(zhí)行時間

    max_execution_time

    47、http和HTTPS的區(qū)別

  • 端口:http:80? ? ? ? ? ?HTTPS:443
  • http無狀態(tài) ,https是http+ssl構(gòu)建的可進行加密傳輸?shù)膮f(xié)議
  • http明文傳輸 ,HTTPS加密傳輸
  • http更快 ,三次握手三個包,HTTPS需要12個包(3個tcp包和9個ssl握手包)
  • 48、mysql的幾個概念

    • 主鍵(primary key):能夠唯一表示表中某一行的屬性或?qū)傩越M。一個表只能有一個主鍵,但可以有多個候選索引。主鍵常常與外鍵構(gòu)成參照完整性約束,防止數(shù)據(jù)不一致。主鍵可以保證記錄的唯一和主鍵域非空,數(shù)據(jù)庫管理系統(tǒng)對于主鍵自動生成唯一索引,所以主鍵也是一個特殊的索引。
    • 外鍵(foreign key):是用于建立和加強兩個表數(shù)據(jù)之間的鏈接的一列或多列。外鍵約束主要用來維護兩個表之間數(shù)據(jù)的一致性。簡言之,表的外鍵就是另一表的主鍵,外鍵將兩表聯(lián)系起來。一般情況下,要刪除一張表中的主鍵必須首先要確保其它表中的沒有相同外鍵(即該表中的主鍵沒有一個外鍵和它相關(guān)聯(lián))。
    • 索引(index):是用來快速地尋找那些具有特定值的記錄。主要是為了檢索的方便,是為了加快訪問速度, 按一定的規(guī)則創(chuàng)建的,一般起到排序作用。所謂唯一性索引,這種索引和前面的“普通索引”基本相同,但有一個區(qū)別:索引列的所有值都只能出現(xiàn)一次,即必須唯一。

    總結(jié):

  • 主鍵一定是唯一性索引,唯一性索引并不一定就是主鍵。
  • 一個表中可以有多個唯一性索引,但只能有一個主鍵。
  • 主鍵列不允許空值,而唯一性索引列允許空值。
  • 主鍵可以被其他字段作外鍵引用,而索引不能作為外鍵引用。
  • 49、數(shù)據(jù)庫主從復(fù)制,讀寫分離

    * 什么是主從復(fù)制:

    主從復(fù)制,是用來建立一個和主數(shù)據(jù)庫完全一樣的數(shù)據(jù)庫環(huán)境,稱為從數(shù)據(jù)庫;

    * 主從復(fù)制的原理:

  • 數(shù)據(jù)庫有個bin-log二進制文件,記錄了所有的sql語句。
  • 只需要把主數(shù)據(jù)庫的bin-log文件中的sql語句復(fù)制。
  • 讓其從數(shù)據(jù)的relay-log重做日志文件中在執(zhí)行一次這些sql語句即可。
  • * 主從復(fù)制的作用:

  • 做數(shù)據(jù)的熱備份,作為后備數(shù)據(jù)庫,主數(shù)據(jù)庫服務(wù)器故障后,可切換到從數(shù)據(jù)庫繼續(xù)工作,避免數(shù)據(jù)丟失。
  • 架構(gòu)的擴展。業(yè)務(wù)量越來越大,I/O訪問頻率過高,單機無法滿足,此時做多庫的存儲,降低磁盤I/O訪問頻率,提高單機的I/O性能
  • 主從復(fù)制是讀寫分離的基礎(chǔ),使數(shù)據(jù)庫能制成更大的并發(fā)。例如子報表中,由于部署報表的sql語句十分慢,導(dǎo)致鎖表,影響前臺的服務(wù)。如果前臺服務(wù)使用master,報表使用slave,那么報表sql將不會造成前臺所,保證了前臺的訪問速度。
  • * 主從復(fù)制的幾種方式:

  • 同步復(fù)制:所謂的同步復(fù)制,意思是master的變化,必須等待slave-1,slave-2,...,slave-n完成后才能返回。
  • 異步復(fù)制:如同AJAX請求一樣。master只需要完成自己的數(shù)據(jù)庫操作即可。至于slaves是否收到二進制日志,是否完成操作,不用關(guān)心。MYSQL的默認設(shè)置。
  • 半同步復(fù)制:master只保證slaves中的一個操作成功,就返回,其他slave不管。

    這個功能,是由google為MYSQL引入的。

  • * 關(guān)于讀寫分離

    在完成主從復(fù)制時,由于slave是需要同步master的。所以對于insert/delete/update這些更新數(shù)據(jù)庫的操作,應(yīng)該在master中完成。而select的查詢操作,則落下到slave中。

    50、常見的排序算法

    1. 冒泡排序

    思路分析:在要排序的一組數(shù)中,對當(dāng)前還未排好的序列,從前往后對相鄰的兩個數(shù)依次進行比較和調(diào)整,讓較大的數(shù)往下沉,較小的往上冒。即,每當(dāng)兩相鄰的數(shù)比較后發(fā)現(xiàn)它們的排序與排序要求相反時,就將它們互換。

    代碼實現(xiàn):

    $arr=array(1,43,54,62,21,66,32,78,36,76,39);?function bubbleSort($arr){?$len=count($arr);//該層循環(huán)控制 需要冒泡的輪數(shù)for($i=1;$i<$len;$i++){ //該層循環(huán)用來控制每輪 冒出一個數(shù) 需要比較的次數(shù)for($k=0;$k<$len-$i;$k++){if($arr[$k]>$arr[$k+1]){$tmp=$arr[$k+1];$arr[$k+1]=$arr[$k];$arr[$k]=$tmp;}}}return $arr;}

    2. 選擇排序

    思路分析:在要排序的一組數(shù)中,選出最小的一個數(shù)與第一個位置的數(shù)交換。然后在剩下的數(shù)當(dāng)中再找最小的與第二個位置的數(shù)交換,如此循環(huán)到倒數(shù)第二個數(shù)和最后一個數(shù)比較為止。

    代碼實現(xiàn):

    function selectSort($arr) {//雙重循環(huán)完成,外層控制輪數(shù),內(nèi)層控制比較次數(shù)$len=count($arr);for($i=0; $i<$len-1; $i++) {//先假設(shè)最小的值的位置$p = $i;for($j=$i+1; $j<$len; $j++) {//$arr[$p] 是當(dāng)前已知的最小值if($arr[$p] > $arr[$j]) {//比較,發(fā)現(xiàn)更小的,記錄下最小值的位置;并且在下次比較時采用已知的最小值進行比較。$p = $j;}}//已經(jīng)確定了當(dāng)前的最小值的位置,保存到$p中。如果發(fā)現(xiàn)最小值的位置與當(dāng)前假設(shè)的位置$i不同,則位置互換即可。if($p != $i) {$tmp = $arr[$p];$arr[$p] = $arr[$i];$arr[$i] = $tmp;}}//返回最終結(jié)果return $arr;}

    3.插入排序

    思路分析:在要排序的一組數(shù)中,假設(shè)前面的數(shù)已經(jīng)是排好順序的,現(xiàn)在要把第n個數(shù)插到前面的有序數(shù)中,使得這n個數(shù)也是排好順序的。如此反復(fù)循環(huán),直到全部排好順序。

    代碼實現(xiàn):

    function insertSort($arr) {$len=count($arr);for($i=1, $i<$len; $i++) {$tmp = $arr[$i];//內(nèi)層循環(huán)控制,比較并插入for($j=$i-1;$j>=0;$j--) {if($tmp < $arr[$j]) {//發(fā)現(xiàn)插入的元素要小,交換位置,將后邊的元素與前面的元素互換$arr[$j+1] = $arr[$j];$arr[$j] = $tmp;} else {//如果碰到不需要移動的元素,由于是已經(jīng)排序好是數(shù)組,則前面的就不需要再次比較了。break;}}}return $arr;}

    4.快速排序?

    思路分析:選擇一個基準(zhǔn)元素,通常選擇第一個元素或者最后一個元素。通過一趟掃描,將待排序列分成兩部分,一部分比基準(zhǔn)元素小,一部分大于等于基準(zhǔn)元素。此時基準(zhǔn)元素在其排好序后的正確位置,然后再用同樣的方法遞歸地排序劃分的兩部分。

    代碼實現(xiàn):

    function quickSort($arr) {//先判斷是否需要繼續(xù)進行$length = count($arr);if($length <= 1) {return $arr;}//選擇第一個元素作為基準(zhǔn)$base_num = $arr[0];//遍歷除了標(biāo)尺外的所有元素,按照大小關(guān)系放入兩個數(shù)組內(nèi)//初始化兩個數(shù)組$left_array = array();? //小于基準(zhǔn)的$right_array = array();? //大于基準(zhǔn)的for($i=1; $i<$length; $i++) {if($base_num > $arr[$i]) {//放入左邊數(shù)組$left_array[] = $arr[$i];} else {//放入右邊$right_array[] = $arr[$i];}}//再分別對左邊和右邊的數(shù)組進行相同的排序處理方式遞歸調(diào)用這個函數(shù)$left_array = quick_sort($left_array);$right_array = quick_sort($right_array);//合并return array_merge($left_array, array($base_num), $right_array);}

    51、接口和抽象類的區(qū)別:

    1、接口

    • 對接口的使用是通過關(guān)鍵字implements
    • 接口不能定義成員變量(包括類靜態(tài)變量),能定義常量
    • 子類必須實現(xiàn)接口定義的所有方法
    • 接口只能定義方法不能實現(xiàn)方法
    • 接口中沒有構(gòu)造函數(shù)
    • 接口中的方法和實現(xiàn)他的;類默認都是public類型的

    2、抽象類

    • 對抽象類的使用是通關(guān)關(guān)鍵字extends
    • 不能被實例化,可以定義子類必須實現(xiàn)的方法
    • 子類必須實現(xiàn)父類中的所有抽象方法,這些方法的訪問控制必須和父類中的一樣(或者更加寬松)
    • 如果一個類中有一個抽象方法。則該類必須定義為抽象方法
    • 抽象類中可以有構(gòu)造函數(shù)
    • 抽象類種的方法可以使用private、protected、public來修飾
    • 一個類可以同時實現(xiàn)多個接口,但是一個類只能繼承一個抽象類

    3、final類/方法

    • final類不能被繼承
    • final方法不能比重寫

    4、static類/方法

    • 可以不實例化類而直接訪問
    • 靜態(tài)屬性不可以由對象通過—>操作符來訪問,用::方式來調(diào)用

    52、常見的設(shè)計模式

    策略模式:策略模式是對象的行為模式,動態(tài)的選擇需要調(diào)用的類。

    1 策略模式三個角色:

    • 抽象策略角色
    • 具體策略角色
    • 環(huán)境角色

    2 策略模式實現(xiàn)步驟:

    • 定義抽象角色類
    • 定義具體策略類
    • 定義環(huán)境角色類

    3 抽象類原則:

    • 抽象類不能被實例化
    • 有抽象方法的類一定是抽象類;類必須要 abstract 修飾
    • 抽象方法不能有函數(shù)體;即 abstract function fun();
    • 抽象類中的非抽象方法,可以被子類調(diào)用
    • 非抽象子類繼承抽象類,子類必須實現(xiàn)父類的所有抽象方法
    • 抽象子類繼承抽象類,無需繼承父類的抽象方法
    // 策略接口 約定策略的行為 interface UserStrategy {public function showAD(); }// 女性 class FemaleUser implements UserStrategy {public function showAD(){echo "女";} }// 男class MaleUser implements UserStrategy {public function showAD(){echo "男";} }// 展示類 // page類依賴Female和MaleStrategy,但是現(xiàn)在只是依賴UserStrategy,Female和male依賴UserStrategy,從而實現(xiàn)反轉(zhuǎn), // 一般依賴反轉(zhuǎn)的實現(xiàn)方案:一個類依賴另一個類,一般是依賴幾個方法,將這幾個方法抽象處一個接口,依賴的類,實現(xiàn)這個借口,就實現(xiàn)了倒置 詳情見DIP原則 class Page {private $s;public function index(){$this->s->showAD();}public function setStrategy(UserStrategy $class){$this->s = $class;} }// 只在一個地方判斷,配置策略對象(Page),其他地方使用 if($type=='male' ){$obj = new MaleUser(); } if($type == 'Female'){$obj = new FemaleUser(); }$p = new Page(); $p->setStrategy($obj); $p->index();

    策略模式的特點

    • 功能:具體算法從具體業(yè)務(wù)處理中獨立
    • 多個if-else出現(xiàn)考慮使用策略模式
    • 策略算法是形同行為的不同實現(xiàn)(多態(tài))
    • 客戶端選擇,上下文來具體實現(xiàn)策略算法

    優(yōu)缺點

    優(yōu)點:

    • 避免讓客戶端涉及到重要算法和數(shù)據(jù)
    • 避免使用難以維護的多重條件選擇語句
    • 易擴展

    缺點:

    • 判斷邏輯在客戶端,需求改變時,要更改客戶端的程序。
    • 客戶端必須知道所有的策略類,并自行決定使用哪一個策略類。這就意味著客戶端必須理解這些算法的區(qū)別,以便適時選擇恰當(dāng)?shù)乃惴悺?/li>
    • 增加了對象的數(shù)目
    • 只適合扁平的算法結(jié)構(gòu)

    工廠模式:

    簡單工廠模式包含如下三種角色:

    • 抽象產(chǎn)品:定義了產(chǎn)品的規(guī)范,描述了產(chǎn)品的主要特性和功能。
    • 具體產(chǎn)品:實現(xiàn)或者繼承抽象產(chǎn)品的子類。
    • 具體工廠:提供了創(chuàng)建產(chǎn)品的方法,使用者通過該方法來獲取產(chǎn)品。
    <?phpclass A {function __construct(){echo "我是A類";} }class B {function __construct(){echo "我是B類";} }class Factory {public static function create($name){if ($name == 'A') {return new A();} elseif ($name == 'B') {return new B();}} }$a = Factory::create('A'); $b = Factory::create('B');

    優(yōu)缺點

    • 優(yōu)點在于實現(xiàn)對象的創(chuàng)建和對象的使用分離,將對象的創(chuàng)建交給專門的工廠類負責(zé);
    • 缺點在于工廠類不夠靈活,增加新的產(chǎn)品時需要修改工廠類的代碼,一旦產(chǎn)品較多時,工廠類將會變得異常復(fù)雜。

    53、說一說計算機網(wǎng)路體系結(jié)構(gòu)

    計算機網(wǎng)絡(luò)體系結(jié)構(gòu)一般有三種:OSI七層模型、TCP/IP四層模型、五層結(jié)構(gòu)

    簡單說,OSI是一個理論上的網(wǎng)絡(luò)通信模型,TCP/IP是實際上的網(wǎng)絡(luò)通信模型,五層結(jié)構(gòu)就是為了介紹網(wǎng)絡(luò)原理而折中的網(wǎng)絡(luò)通信模型。

    ?OSI 七層模型

    OSI 七層模型是國際標(biāo)準(zhǔn)化組織(International Organization for Standardization)制定 的一個用于計算機或通信系統(tǒng)間互聯(lián)的標(biāo)準(zhǔn)體系。

    • 應(yīng)用層:通過應(yīng)用進程之間的交互來完成特定網(wǎng)絡(luò)應(yīng)用,應(yīng)用層協(xié)議定義的是應(yīng)用進程間通信和交互的規(guī)則,常見的有:HTTP、FTP、SMTP、SNMP、DNS;
    • 表示層:數(shù)據(jù)的表示、安全、壓縮。確保一個系統(tǒng)的應(yīng)用層所發(fā)送的消息可以被另一個系統(tǒng)的應(yīng)用層讀取;
    • 會話層:建立、管理、終止會話,是用戶應(yīng)用程序和網(wǎng)絡(luò)之間的接口;
    • 運輸層:提供源端與目的端之間提供可靠的透明數(shù)據(jù)傳輸,傳輸層協(xié)議為不同主機上運行的進程提供邏輯通信;
    • 網(wǎng)絡(luò)層:將網(wǎng)絡(luò)地址翻譯成對應(yīng)的物理地址,實現(xiàn)不同網(wǎng)絡(luò)之間的路徑選擇,協(xié)議有ICMP、IGMP、IP等;
    • 數(shù)據(jù)鏈路層:在物理層提供比特流服務(wù)的基礎(chǔ)上,建立相鄰節(jié)點之間的數(shù)據(jù)鏈路;
    • 物理層:建立、維護、斷開物理連接。

    TCP/IP四層模型

    • 應(yīng)用層:對應(yīng)于 OSI 參考模型的(應(yīng)用層、表示層、會話層)。
    • 傳輸層: 對應(yīng) OSI 的傳輸層,為應(yīng)用層實體提供端到端的通信功能,保證了數(shù)據(jù) 包的順序傳送及數(shù)據(jù)的完整性。
    • 網(wǎng)際層:對應(yīng)于 OSI 參考模型的網(wǎng)絡(luò)層,主要解決主機到主機的通信問題。
    • 網(wǎng)絡(luò)接口層:與 OSI 參考模型的數(shù)據(jù)鏈路層、物理層對應(yīng)。

    五層體系結(jié)構(gòu)

    • 應(yīng)用層:對應(yīng)于 OSI 參考模型的(應(yīng)用層、表示層、會話層)。
    • 傳輸層:對應(yīng) OSI 參考模型的的傳輸層
    • 網(wǎng)絡(luò)層:對應(yīng) OSI 參考模型的的網(wǎng)絡(luò)層
    • 數(shù)據(jù)鏈路層:對應(yīng) OSI 參考模型的的數(shù)據(jù)鏈路層
    • 物理層:對應(yīng) OSI 參考模型的的物理層。

    54、說一說每一層對應(yīng)的網(wǎng)絡(luò)協(xié)議有哪些?

    一張表格總結(jié)常見網(wǎng)絡(luò)協(xié)議:

    ?55、那么數(shù)據(jù)在各層之間是怎么傳輸?shù)哪?#xff1f;

    對于發(fā)送方而言,從上層到下層層層包裝,對于接收方而言,從下層到上層,層層 解開包裝。

    • 發(fā)送方的應(yīng)用進程向接收方的應(yīng)用進程傳送數(shù)據(jù)
    • AP先將數(shù)據(jù)交給本主機的應(yīng)用層,應(yīng)用層加上本層的控制信息H5就變成了下一 層的數(shù)據(jù)單元
    • 傳輸層收到這個數(shù)據(jù)單元后,加上本層的控制信息H4,再交給網(wǎng)絡(luò)層,成為網(wǎng) 絡(luò)層的數(shù)據(jù)單元
    • 到了數(shù)據(jù)鏈路層,控制信息被分成兩部分,分別加到本層數(shù)據(jù)單元的首部 (H2)和尾部(T2)
    • 最后的物理層,進行比特流的傳輸

    這個過程類似寫信,寫一封信,每到一層,就加一個信封,寫一些地址的信息。到 了目的地之后,又一層層解封,傳向下一個目的地。

    56、從瀏覽器地址欄輸入URL到顯示主頁的過程?

    這道題,大概的過程比較簡單,但是有很多點可以細挖:DNS解析、TCP三次握 手、HTTP報文格式、TCP四次揮手等等。

  • DNS 解析:將域名解析成對應(yīng)的 IP 地址。
  • ?TCP連接:與服務(wù)器通過三次握手,建立 TCP 連接
  • ?向服務(wù)器發(fā)送 HTTP 請求
  • 服務(wù)器處理請求,返回HTTp響應(yīng)
  • 瀏覽器解析并渲染頁面
  • 斷開連接:TCP 四次揮手,連接結(jié)束??
  • 我們以輸入www.baidu.com 為例:

    ?各個過程都使用了哪些協(xié)議?

    57、URL和URI有什么區(qū)別?

    • URI:統(tǒng)一資源標(biāo)識符(Uniform Resource Identifier? ,URI),標(biāo)識的是Web上每一種可用的資源,如:HTML文檔、圖像、視頻片段、程序等都是由一個URI進行標(biāo)識的。
    • URL:統(tǒng)一資源定位符(Uniform Resource Location ,URL),它是URI的一種子集,主要作用是提供資源的路徑。

    區(qū)別:

    ? ? ? ? URL除了提供資源的標(biāo)識,還可以提供資源訪問的方式。這么比喻,URI像是身份證,可以唯一標(biāo)識一個人,而URL更像一個住址,而我們可以通過這個URL找到這個人——人類住址協(xié)議://地球/中國/湖南/長沙/岳麓區(qū)/xx大學(xué)/xx號宿舍/530/張三.男。

    58、說說HTTP/1.0,1.1,2.0的區(qū)別?

    區(qū)別:

    • HTTP/1.0默認是短連接,可以強制開啟,
    • HTTP/1.1默認長鏈接,
    • HTTP/2.0采用多路復(fù)用。

    HTTP/1.0:

    • 默認使用短連接,每次請求都需要建立一個TCP連接。它可以設(shè)置Connetion:Keep-alive這個字段,強制開啟長鏈接。

    HTTP/1.1:

    • 引入了持久連接,即TCP默認不連接,可以被多個請求復(fù)用。
    • 分塊傳輸編碼,即服務(wù)端每產(chǎn)生一塊數(shù)據(jù),就發(fā)送一塊,用“流模式”取代“緩存模式”。
    • 管道機制,即在同一個TCP連接里面,客戶端可以同時發(fā)送多個請求

    HTTP/2.0:

    • 二進制協(xié)議,1.1 版本的頭信息是文本(ASCII 編碼),數(shù)據(jù)體可以是文本或者 二進制;2.0 中,頭信息和數(shù)據(jù)體都是二進制。
    • 完全多路復(fù)用,在一個連接里,客戶端和瀏覽器都可以同時發(fā)送多個請求或回 應(yīng),而且不用按照順序一一對應(yīng)。
    • 報頭壓縮,HTTP 協(xié)議不帶有狀態(tài),每次請求都必須附上所有信息。Http/2.0 引 入了頭信息壓縮機制,使用 gzip 或 compress 壓縮后再發(fā)送。
    • 服務(wù)端推送,允許服務(wù)器未經(jīng)請求,主動向客戶端發(fā)送資源。

    59、HTTP/3了解嗎?

    HTTP/3主要有兩大變化,傳輸層基于UDP、使用QUIC保證UDP的可靠性

    HTTP/2存在的一些問題,比如重傳等等,都是由于TCP本身的特性導(dǎo)致的,所以 HTTP/3在QUIC的基礎(chǔ)上進行發(fā)展而來,QUIC(Quick UDP Connections)直譯為快速UDP網(wǎng)絡(luò)連接,底層使用UDP進行數(shù)據(jù)傳輸。

    HTTP/3主要有這些特點:

    • 使用UDP作為傳輸層進行通信
    • 在UDP的基礎(chǔ)上QUIC協(xié)議保證了HTTP/3的安全性,在傳輸?shù)倪^程中就完成了 TLS加密握手
    • HTTPS 要建??個連接,要花費 6 次交互,先是建?三次握?,然后是 TLS/1.3 的三次握?。QUIC 直接把以往的 TCP 和 TLS/1.3 的 6 次交互合并成了 3 次, 減少了交互次數(shù)。
    • QUIC 有??的?套機制可以保證傳輸?shù)目煽啃缘摹.?dāng)某個流發(fā)?丟包時,只會 阻塞這個流,其他流不會受到影響。

    我們拿一張圖看一下HTTP協(xié)議的變遷:

    60、如何理解HTTP協(xié)議是無狀態(tài)的?

    這個無狀態(tài)的狀態(tài)值是什么?是客戶端的狀態(tài),所以字面意思,就是HTTP協(xié)議中服務(wù)端不會保存客戶端的任何信息。

    比如當(dāng)瀏覽器第一次發(fā)送請求給服務(wù)器時,服務(wù)器響應(yīng)了;如果同個瀏覽器發(fā)起第二次請求給服務(wù)器時,它還是會響應(yīng),但是呢,服務(wù)器不知道你就是剛才的那個瀏覽器。

    有什么辦法記錄狀態(tài)呢?

    主要有兩個辦法:Session和Cookie

    61、說說Cookie和Session有什么聯(lián)系和區(qū)別?

    • Cookie是保存在客戶端的一小塊文本串的數(shù)據(jù)。客戶端向服務(wù)器發(fā)起請求時,服務(wù)器會向客戶端發(fā)送一個Cookie,客戶端就把Cookie保存起來。在客戶端下次向同一個服務(wù)器在發(fā)起請求時,Cookie被攜帶發(fā)送到服務(wù)器。服務(wù)器可以根據(jù)這個Cookie判斷用戶的身份和狀態(tài)。
    • Session指的是服務(wù)器和客戶端一次會話的過程。它是另一種記錄客戶狀態(tài)的機制。不同的是,cookie保存在客戶端的瀏覽器中,而session保存在服務(wù)器上。客戶端瀏覽器訪問服務(wù)器的時候,服務(wù)器把客戶端信息以某種形式記錄在服務(wù)器上, 這就是session。客戶端瀏覽器再次訪問時只需要從該session中查找用戶的狀態(tài)。

    區(qū)別:

    • 存儲位置不一樣,Cookie 保存在客戶端,Session 保存在服務(wù)器端。
    • 存儲數(shù)據(jù)類型不一樣,Cookie 只能保存ASCII,Session可以存任意數(shù)據(jù)類型,一 般情況下我們可以在 Session 中保持一些常用變量信息,比如說 UserId 等。
    • 有效期不同,Cookie 可設(shè)置為長時間保持,比如我們經(jīng)常使用的默認登錄功 能,Session 一般有效時間較短,客戶端關(guān)閉或者 Session 超時都會失效。
    • 隱私策略不同,Cookie 存儲在客戶端,比較容易遭到不法獲取,早期有人將用 戶的登錄名和密碼存儲在 Cookie 中導(dǎo)致信息被竊取;Session 存儲在服務(wù)端,安 全性相對 Cookie 要好一些。
    • 存儲大小不同, 單個Cookie保存的數(shù)據(jù)不能超過4K,Session可存儲數(shù)據(jù)遠高于 Cookie。

    總結(jié)

    以上是生活随笔為你收集整理的PHP面试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。