史上最強最全面PHP面試總結(jié)

從8月15號來到北京一直到今天,一月有余。來的這段時間一直準(zhǔn)備筆試面試,大大小小的公司,亂七八糟面了10多家,近期才安頓下來。面試的這段時間感覺自己成長了不少。初來到這個陌生的城市一臉茫然,不會乘地鐵、不會有擠公交、不會恰如其分的生活。。。

面試是進入職場的第一道坎,因為我本身學(xué)校太一般的問題在面試中遇到了各種不爽,和那些高學(xué)歷的相比自己真是信心大跌。我面試的方向是php開發(fā)工程師,主要做網(wǎng)站后臺、APP接口等。我所面試的公司、試題、心得都在這里可直接點擊鏈接領(lǐng)取相關(guān)學(xué)習(xí)福利包:

PHP高薪就業(yè)(視頻、學(xué)習(xí)路線、免費獲?。?www.itdecent.cn

是安全網(wǎng)站放心,繼續(xù)訪問就可以領(lǐng)取了哦

下面是我這段時間總結(jié)的面試方面的??汲柕闹R點,不對之處歡迎指出。知識點全部都在是面試中遇到了,基本上每面試一家公司,我都會總結(jié)在上面。希望對大家有所幫助。

目錄總結(jié):

這是面試我所遇到的大部分的知識點,供大家參考,沒有寫答案,大家自己可以查查,后續(xù)我會持續(xù)更新

PHP部分

1、HTTP Keep-Alive的作用

2、php數(shù)組函數(shù)常見的那些? (array_merge、in_array的作用)

3、PHP中幾個輸出函數(shù)echo,print(),print_r(),sprintf(),var_dump()的區(qū)別

4、不用新變量直接交換現(xiàn)有兩個變量的值

5、heredoc

6、寫個函數(shù)來解決多線程同時讀寫一個文件的問題。

7、禁掉cookie的session使用方案,設(shè)置session過期的方法,對應(yīng)函數(shù)

8、json格式數(shù)據(jù)有哪些特點

9、php獲取文件內(nèi)容的方法,對應(yīng)的函數(shù)

10、php魔術(shù)方法與魔術(shù)常量

11、PHP 如何獲取客戶端的IP地址

12、寫一個函數(shù),可以遍歷文件夾下的所有文件和文件夾。

13、有mail.log的一個文檔,內(nèi)容為若干郵件地址,用’\n’分隔換行。挑選http://sina.com的地址。

14、PHP緩存技術(shù)有哪些? tp是局部還是完全緩存?

15、strlen()與mb_strlen的作用與區(qū)別

16、寫一個函數(shù),盡可能高效的從一個標(biāo)準(zhǔn)url中取出擴展名

17、php.ini 中safe mod關(guān)閉 影響哪些函數(shù)和參數(shù),至少寫6個?

18、 約瑟夫環(huán)問題

19、Isset() 、empty()與is_null的區(qū)別

20、求兩個文件的相對路徑

21、MVC的優(yōu)缺點

22、Session與cookie的聯(lián)系和區(qū)別(運行機制),session共享問題解決方案

23、正則表達(dá)式

24、寫一個函數(shù)得到header頭信息

MySQL部分

1、select * from table where (ID = 10) or (ID = 32) or (ID = 22) 讓結(jié)果按10, 32, 22的順序檢索出來?

Linux部分

1、Core文件是什么,有什么用?

2、共享內(nèi)存除了文件映射還有什么方式?

3、請解釋下列10個shell命令的用途

4、Linux文件屬性有哪些?(共十位)

5、Linux查詢命令

服務(wù)器部分

1、Apache與Nginx的優(yōu)缺點比較

2、Cgi 與fastcgi的區(qū)別

3、Select, poll和epoll的區(qū)別

4、Memcache和Redis區(qū)別

------------------------------------正文開篇------------------------------------

PHP基礎(chǔ)

1:變量的傳值與引用。

2:變量的類型轉(zhuǎn)換和判斷類型方法。

3:php運算符優(yōu)先級,一般是寫出運算符的運算結(jié)果。

4:PHP中函數(shù)傳參,閉包,判斷輸出的echo,print是不是函數(shù)等。

5:PHP數(shù)組,數(shù)組函數(shù),數(shù)組遍歷,預(yù)定義數(shù)組(面試必出)。

6:PHP面向?qū)ο?,魔術(shù)方法,封裝、繼承、多態(tài)。設(shè)計模式,包括(單利、工廠、迭代器、裝飾、命令、策略)。

7:正則表達(dá)式,每個標(biāo)號含義,郵箱、網(wǎng)址、標(biāo)簽匹配,正則函數(shù)(面試必出)。

8:PHP異常處理(級別,錯誤日志,控制錯誤輸出)(面試必出)。

9:PHP時間函數(shù),日期計算函數(shù)。

10:文件系統(tǒng),記錄日志、目錄、文件的遍歷、上傳、多方法得到文件擴展名、文件引用方式、引用函數(shù)區(qū)別。(面試必出)。

11:會話控制,主要說原理。session與cookie在分布式應(yīng)用中出現(xiàn)問題的解決方案。

12:PHP模板引擎,常用模板引擎特點,MVC好與不好的地方。

13:PHP安全處理,過濾函數(shù)。

14:XML的使用。

15:PHP字符串的處理,包括轉(zhuǎn)義(安全)、編碼、截取、定位、與數(shù)組間的轉(zhuǎn)換、處理函數(shù)等。(面試必出)。

16:Socket編程,各種協(xié)議,head頭,curl參數(shù)含義。

17:網(wǎng)絡(luò)狀態(tài)碼含義,常用(204,304, 404, 504,502)。

18:Apache配置文件,PHP配置文件,各個含義字段的含義。

19:網(wǎng)絡(luò)各種攻擊的名詞含義(SQL攻擊、XSS、CSRF、DDos),防止措施。

20:url的處理函數(shù),得到url指定的部分。

Mysql基礎(chǔ)

1:基礎(chǔ)sql語句書寫(一般讓寫關(guān)聯(lián)和子查詢語句)

2:索引的創(chuàng)建,優(yōu)缺點,最左原則

3:存儲引擎,常用的幾個,優(yōu)缺點,差別,原理(面試必出)

4:sql注入的處理方法

5:mysql處理函數(shù)(PHP中封裝的)

6:PDO的使用方法,為什么使用

7:mysql的優(yōu)化,表拆分等

8:事務(wù)處理,sql語句的處理效率等

9:數(shù)據(jù)表字段的類型,同類型間的區(qū)別,改如何選取,int(10)與int(11)的區(qū)別等。

10:數(shù)據(jù)庫索引使用的那種數(shù)據(jù)結(jié)構(gòu),畫出數(shù)據(jù)結(jié)構(gòu)

Linux

1:常用命令的使用,vim編輯器的使用。

2:進程,cpu等信息的查看命令。

3:文件內(nèi)查看命令(主要涉及統(tǒng)計信息)。

4:Shell的使用,命令操作。

5:awk的用法

6:shell殺掉所有的php-fpm進程

NoSql

1:Redis的應(yīng)用場景,結(jié)合微博業(yè)務(wù)說出他的具體應(yīng)用。

2:Redis與MC支持?jǐn)?shù)據(jù)的不同點,兩者都支持哪些數(shù)據(jù)結(jié)構(gòu)的存儲,寫越多越好。

3:Redis持久化存儲的原理,與Mysql的應(yīng)用區(qū)別。怎樣保持持久化數(shù)據(jù)與內(nèi)存數(shù)據(jù)同步的關(guān)系(Redis同步機制)

4:Redis與MC在并發(fā)狀態(tài)下的性能比較。

5:MC的內(nèi)存管理機制,當(dāng)一個數(shù)據(jù)需要存儲的時候怎樣分配內(nèi)存空間

6:Redis的內(nèi)存管理機制,與MC有哪些不同點。

開發(fā)環(huán)境

1:PHP7中的新特性與廢棄的特性

2:為什么要使用PHP7,PHP7快在哪里

3:PHP7中對異常和錯誤的理解

版本控制

1:git的使用命令,例如:寫出版本回退命令。

2:git與svn的區(qū)別。

3:如何進行多分支開發(fā),包括多人開發(fā)協(xié)同,分段測試,上線。

下面給大家附上一張知識點導(dǎo)圖,幫助大家記憶:

php部分我是按照面試常問的問題總結(jié)的,下面的問題在面試中出場率很高。問題比較基礎(chǔ)

1、HTTP Keep-Alive的作用

作用:Keep-Alive:使客戶端到服務(wù)器端的連接持續(xù)有效,當(dāng)出現(xiàn)對服務(wù)器的后繼請求時,Keep-Alive功能避免了建立或者重新建立連接。Web服務(wù)器,基本上都支持HTTP Keep-Alive。

缺點:對于提供靜態(tài)內(nèi)容的網(wǎng)站來說,這個功能通常很有用。但是,對于負(fù)擔(dān)較重的網(wǎng)站來說,雖然為客戶保留打開的連 接有一定的好處,但它同樣影響了性能,因為在處理暫停期間,本來可以釋放的資源仍舊被占用。當(dāng)Web服務(wù)器和應(yīng)用服務(wù)器在同一臺機器上運行時,Keep- Alive功能對資源利用的影響尤其突出。

解決:Keep-Alive: timeout=5, max=100

timeout:過期時間5秒(對應(yīng)httpd.conf里的參數(shù)是:KeepAliveTimeout),max是最多一百次請求,強制斷掉連接。就是在timeout時間內(nèi)又有新的連接過來,同時max會自動減1,直到為0,強制斷掉。

2、php數(shù)組函數(shù)常見的那些? (array_merge、in_array的作用)

PHP中以array_開頭的數(shù)組函數(shù)有哪些,并說出使用方法(至少6個)

一、數(shù)組遍歷函數(shù)

1 list(); //不是真正的函數(shù),而是PHP的語言結(jié)構(gòu),用于給一組變量賦值,僅能用于索引數(shù)組

2 each(); //返回數(shù)組當(dāng)前元素的鍵值對,并將指針移動到下一個元素位置

3 while(); //可配合list或each使用:while(list($key, $value) = each($arr)){each $key, $value; }

二、數(shù)組內(nèi)部指針控制

1 current(); //讀取指針位置的內(nèi)容

2 key(); //讀取當(dāng)前指針指向內(nèi)容的索引值

3 next(); //將數(shù)組中的內(nèi)部指針指向下一單元

4 prev(); //將數(shù)組內(nèi)部指針倒回一位

5 end(); //將數(shù)組內(nèi)部指針指向最后一個元素

6 reset();? ? //將目前指針指向第一個索引位置

三、數(shù)組鍵值操作函數(shù)

array_values($arr);? ? ? //獲得數(shù)組的值

array_keys($arr);? ? ? ? //獲得數(shù)組的鍵名

array_flip($arr);? ? ? ? //數(shù)組中的值與鍵名互換(如果有重復(fù)前面的會被后面的覆蓋)

array_search('PHP',$arr); //檢索給定的值,加true則是嚴(yán)格類型檢查

array_reverse($arr);? ? ? //將數(shù)組中的元素翻轉(zhuǎn)(前后順序)

in_array("apple", $arr);? //在數(shù)組中檢索apple

array_key_exists("apple", $arr); // 檢索給定的鍵名是否存在數(shù)組中

array_count_values($arr);? ? ? ? // 統(tǒng)計數(shù)組中所有值出現(xiàn)的次數(shù)

array_unique($arr);? ? ? ? ? ? ? // 刪除數(shù)組中重復(fù)的值

四、數(shù)組回調(diào)函數(shù)

1 array_filter(); //使用回調(diào)函數(shù)過濾數(shù)組中的元素,如果回調(diào)返回true則當(dāng)前的元素被包含到返回數(shù)組中

2 array_walk(); //回調(diào)函數(shù)處理數(shù)組,自定義函數(shù)要有兩個參數(shù),本函數(shù)第三個參數(shù)可以作為回調(diào)第三個參數(shù)返回

3 array_map(); //可以處理多個數(shù)組,每個數(shù)組的長度應(yīng)該相同,傳入數(shù)組的個數(shù)和回調(diào)函數(shù)參數(shù)個數(shù)應(yīng)該一致

二、數(shù)組的分段和填充

1 array_slice($arr, 0, 3); //將數(shù)組中的一段取出,此函數(shù)忽略鍵名(數(shù)組的分段)

2 array_splice($arr, 0, 3,array("black","maroon")); //將數(shù)組中的一段取出,返回的序列從原數(shù)組中刪除

3 array_chunk($arr, 3, TRUE); //將一個數(shù)組分割成多個,TRUE為保留原數(shù)組的鍵名(分割多個數(shù)組)

四、數(shù)組與棧,列隊

1 array_push($arr, "apple", "pear"); //將一個或多個元素壓入數(shù)組棧的末尾(入棧),返回入棧元素的個數(shù)

2 array_pop($arr); // 將數(shù)組棧的最后一個元素彈出(出棧)

3 array_shift($arr); //數(shù)組中第一個元素移出并返回(長度減1,其他元素向前移動一位,數(shù)字鍵名改為從零計數(shù),文字鍵名不變)

4 array_unshift($arr,"a",array(1,2)); //在數(shù)組的開頭插入一個或多個元素

六、數(shù)組的排序

1 sort($arr); //由小到大,忽略鍵名

2 rsort($arr); //由大到小,忽略鍵名

3 asort($arr); //由小到大,保留鍵名

4 arsort($arr); //由大到小,保留鍵名

5 ksort($arr); //按照鍵名正序排序

6 krsort($arr); //按照鍵名逆序排序

七、數(shù)組的計算

array_sum($arr);? //對數(shù)組內(nèi)部的所有元素做求和運算(數(shù)組元素的求和)

array_merge($arr1, $arr2); //合并兩個或多個(相同字符串鍵名,后面覆蓋前面,相同的數(shù)字鍵名,后面的附加到后面)

array_diff($arr1, $arr2);? ? ? //返回差集結(jié)果數(shù)組? array_diff_assoc($arr1, $arr2, $arr3);? //返回差集結(jié)果數(shù)組,鍵名也做比較

array_intersect($arr1, $arr2);? //返回交集結(jié)果數(shù)組? ? array_intersect_assoc($arr1, $arr2);? //返回交集結(jié)果數(shù)組,鍵名也做比較

八、其他的數(shù)組函數(shù)

1 array_unique($arr); //移除數(shù)組中重復(fù)的值,新的數(shù)組中會保留原始的鍵名

2 shuffle($arr); // 將數(shù)組的順序打亂

3、PHP中幾個輸出函數(shù)echo,print(),print_r(),sprintf(),var_dump()的區(qū)別

1:echo:是語句不是函數(shù),沒有返回值,可輸出多個變量值,不需要圓括號。不能輸出數(shù)組和對象,只能打印簡單類型(如int,string)。

2:print:是語句不是函數(shù),有返回值 1 ,只能輸出一個變量,不需要圓括號。不能輸出數(shù)組和對象,只能打印簡單類型(如int,string)。

3:print_r:是函數(shù),可以打印復(fù)合類型,例如:stirng、int、float、array、object等,輸出array時會用結(jié)構(gòu)表示,而且可以通過print_r($str,true)來使print_r不輸出而返回print_r處理后的值

4:printf:是函數(shù),有返回值,返回值是打印內(nèi)容的長度,把文字格式化以后輸出(參看C語言)

5:sprintf:是函數(shù),跟printf相似,但不打印,而是返回格式化后的文字(該函數(shù)把格式化的字符串寫寫入一個變量中,而不是輸出來),其 他的與printf一樣。

例如:

1 $str = "Hello"; 2 $number = 123; 3 $txt = sprintf("%s world. Day number %u",$str,$number); 4 //輸出: Hello world. Day number 123

6:var_dump():函數(shù),輸出變量的內(nèi)容、類型或字符串的內(nèi)容、類型、長度。常用來調(diào)試。

可以通過function_exists('函數(shù)名稱')進行測試

1 var_dump(function_exists('print')); //bool(false) 2 3 var_dump(function_exists('echo')); //bool(false) 4 5 var_dump(function_exists('print_r')); //bool(true)

4、不用新變量直接交換現(xiàn)有兩個變量的值

1:

list($a, $b) = array($b, $a);

2:

$a = $a . $b;

$b = strlen( $b );

$b = substr( $a, 0, (strlen($a) – $b ) );

$a = substr( $a, strlen($b) );

3:(必須用一個兩個字符串都都不能出現(xiàn)的字符做為分隔符)

$a = $b.','.$a ;

$a = explode(',', $a);

$b = $a[1];

$a = $a[0];

4:這個是當(dāng)兩個數(shù)都是數(shù)字的時候:

$a = $a + $b;

$b = $a – $b;

$a = $a – $b;

5:借助數(shù)組

$a = array($a,$b);

$b = $a[0];

$a = $a[1];

5、heredoc

Heredoc在正規(guī)的PHP文檔中和技術(shù)書籍中一般沒有詳細(xì)講述。他是一種Perl風(fēng)格的字符串輸出技術(shù)。使用heredoc技術(shù)可以實現(xiàn)界面與代碼的準(zhǔn)分離,比如phpwind模板。

heredoc的語法是用”<<<”加上自己定義成對的標(biāo)簽,在標(biāo)簽范圍內(nèi)的文字視為一個字符串

規(guī)則如下:

1、以<<<End開始標(biāo)記開始,以End結(jié)束標(biāo)記結(jié)束,結(jié)束標(biāo)記必須頂頭寫,不能有縮進和空格,且在結(jié)束標(biāo)記末尾要有分號?。開始標(biāo)記和開始標(biāo)記相同,比如常用大寫的EOT、EOD、EOF來表示,也可以使用其他標(biāo)記,只要保證開始標(biāo)記和結(jié)束標(biāo)記不在正文中出現(xiàn)就行。

2、位于開始標(biāo)記和結(jié)束標(biāo)記之間的變量可以被正常解析,但是函數(shù)則不可以。在heredoc中,變量不需要用連接符 . 或 , 來拼接,比如:

1 $a=2; 2 $b= <<<EOF 3 "zyf"$a 4 "zyf" 5 EOF; 6 echo $b; //結(jié)果連同雙引號一起輸出:"zyf"2 "zyf"

3、heredoc常用在輸出包含大量HTML語法文檔的時候。他要比傳統(tǒng)的echo輸出精煉很多,如下所示:

function getHtml()

{

? ? echo "<html>";

? ? echo "<head><title>Title</title></head>";

? ? echo "<body>Content</body>";

? ? echo "</html>;

}

function getHtml()

{

echo <<<EOT

? ? ? <html>

? ? ? <head><title>Title</title></head>

? ? ? <body>Content</body>

? ? ? </html>

EOT;

}

6、寫個函數(shù)來解決多線程同時讀寫一個文件的問題。

<?php

? ? $fp = fopen("/tmp/lock.txt","w+");

? ? if(flock($fp, LOCK_EX)){// 進行排它型鎖定

? ? ? ? fwrite($fp,"Write something here\n");

? ? ? ? flock($fp, LOCK_UN);// 釋放鎖定

? ? }else{

? ? ? ? echo "Couldn't lock the file !";

? ? }

? ? fclose($fp);

?>

7、禁掉cookie的session使用方案,設(shè)置session過期的方法,對應(yīng)函數(shù)

通過 url 傳值,把session id附加到url上(缺點:整個站點中不能有純靜態(tài)頁面,因為純靜態(tài)頁面session id 將無法繼續(xù)傳到下一頁面)

通過隱藏表單,把session id 放到表單的隱藏文本框中同表單一塊提交過去(缺點:不適用標(biāo)簽這種直接跳轉(zhuǎn)的非表單的情況)

直接配置php.ini文件,將php.ini文件里的session.use_trans_sid= 0設(shè)為1,(好像在win上不支持)

用文件、數(shù)據(jù)庫等形式保存Session ID,在跨頁過程中手動調(diào)用

第一種? setcookie() 直接用setcookie設(shè)置session id的生命周期。

? ? $lifetime=60; //保存1分鐘

? ? session_start();

? ? setcookie(session_name(), session_id(), time()+$lifetime, "/");

第二種? session_set_cookie_params()? ?

? ? $lifetime=60;//保存1分鐘

? ? session_set_cookie_params($lifetime);

? ? session_start();

? ? session_regenerate_id(true);

? ? 其中session_regenerate_id();方法用于改變當(dāng)前session_id的值,并保留session中數(shù)組的值。參數(shù)默認(rèn)為 false,如果設(shè)置為true則改變session_id的值,并清空當(dāng)前session數(shù)組。

8、json格式數(shù)據(jù)有哪些特點

JSON 一種輕量級的數(shù)據(jù)交換格式。它基于ECMAScript的一個子集。 JSON采用完全獨立于語言的文本格式,但是也使用了類似于C語言家族的習(xí)慣(包括C、C++、C#、Java、JavaScript、Perl、 Python等)。這些特性使JSON成為理想的數(shù)據(jù)交換語言。 易于人閱讀和編寫,同時也易于機器解析和生成(網(wǎng)絡(luò)傳輸速率)。

JSON的結(jié)構(gòu)基于下面兩點

1. "名稱/值"對的集合 不同語言中,它被理解為對象(object),記錄(record),結(jié)構(gòu)(struct),字典(dictionary),哈希表(hash table),鍵列表(keyed list)等

2. 值的有序列表 多數(shù)語言中被理解為數(shù)組(array)

9、php獲取文件內(nèi)容的方法,對應(yīng)的函數(shù)

1:file_get_contents得到文件的內(nèi)容(可以以get和post的方式獲?。?,整個文件讀入一個字符串中2:用fopen打開url, 以get方式獲取內(nèi)容(借助fgets()函數(shù))

3:用fsockopen函數(shù)打開url(可以以get和post的方式獲?。?,以get方式獲取完整的數(shù)據(jù),包括header和body4:使用curl庫獲取內(nèi)容,使用curl庫之前,需要查看php.ini,查看是否已經(jīng)打開了curl擴展

10、php魔術(shù)方法與魔術(shù)常量

類方法:

1、__construct();

說明:具有構(gòu)造函數(shù)的類會在每次創(chuàng)建新對象時先調(diào)用此方法,適合在使用對象之前做一些初始化工作。如果子類中定義了構(gòu)造函數(shù)則不會隱式調(diào)用其父類的構(gòu)造函數(shù)。要執(zhí)行父類的構(gòu)造函數(shù),需要在子類的構(gòu)造函數(shù)中調(diào)用?parent::__construct()。如果子類沒有定義構(gòu)造函數(shù)則會如同一個普通的類方法一樣從父類繼承。

2、__destruct();

說明:析構(gòu)函數(shù)會在到某個對象的所有引用都被刪除或者當(dāng)對象被顯式銷毀時執(zhí)行。

方法重載:

3、__call();

說明:在對象中調(diào)用一個不可訪問方法時,__call(); 方法會被調(diào)用。

4、__callStatic();

說明:用靜態(tài)方式中調(diào)用一個不可訪問方法時,__callStatic(); 方法會被調(diào)用。

屬性重載:(只對類中私有受保護的成員屬性有效)

5、__get();

說明:讀取不可訪問屬性的值時,__get() 會被調(diào)用。

6、__set();

說明:在給不可訪問屬性賦值時,__set() 會被調(diào)用。

7、__isset();

說明:當(dāng)對不可訪問屬性調(diào)用 isset() 或 empty() 時,__isset() 會被調(diào)用。

8、__unset();

說明:當(dāng)對不可訪問屬性調(diào)用 unset() 時,__unset() 會被調(diào)用。

序列化相關(guān):

9、__sleep();

說明:序列化時調(diào)用,serialize() 函數(shù)會檢查類中是否存在該魔術(shù)方法。如果存在,該方法會先被調(diào)用,然后才執(zhí)行序列化操作。

10、__wakeup();

說明:unserialize() 會檢查是否存在一個 __wakeup() 方法。如果存在,則會先調(diào)用該方法,用在反序列化操作中,例如重新建立數(shù)據(jù)庫連接,或執(zhí)行其它初始化操作

操作類和對象方法:

11、__toString();

說明:方法用于一個類被當(dāng)成字符串時調(diào)用,例如把一個類當(dāng)做字符串進行輸出

12、__invoke();

說明:當(dāng)嘗試以調(diào)用函數(shù)的方式調(diào)用一個對象時,__invoke() 方法會被自動調(diào)用。

13、__set_state();

說明:當(dāng)調(diào)用 var_export() 導(dǎo)出類時,此靜態(tài) 方法會被調(diào)用。 本方法的唯一參數(shù)是一個數(shù)組

14、__clone();

說明:當(dāng)復(fù)制完成時,如果定義了 __clone() 方法,則新創(chuàng)建的對象(復(fù)制生成的對象)中的 __clone() 方法會被調(diào)用,可用于修改屬性的值。

15、__autoload();

說明:該方法可以自動實例化需要的類。當(dāng)程序要用一個類但沒有被實例化時,改方法在指定路徑下查找和該類名稱相同的文件。否則報錯。

16 __debugInfo();

說明:php5.6增加的特性,var_dump()一個類時觸發(fā),返回一個包含對象屬性的數(shù)組

說明:PHP 將所有以 __(兩個下劃線)開頭的類方法保留為魔術(shù)方法。所以在定義類方法時,除了上述魔術(shù)方法,建議不要以 __ 為前綴。在命名自己的類方法時不能使用這些方法名,除非是想使用其魔術(shù)功能。

常量:

__LINK__ //文件中的當(dāng)前行號。

__FILE__ //文件的完整路徑和文件名。如果用在被包含文件中,則返回被包含的文件名。

__DIR__ //文件所在的目錄。如果用在被包括文件中,則返回被包括的文件所在的目錄,它等價于 dirname(__FILE__)。

__FUNCTION__ //函數(shù)名稱。自 PHP 5 起本常量返回該函數(shù)被定義時的名字(區(qū)分大小寫)。在 PHP 4 中該值總是小寫字母的。

__CLASS__ //類的名稱。自 PHP 5 起本常量返回該類被定義時的名字(區(qū)分大小寫)。在 PHP 4 中該值總是小寫字母的。

__METHOD__ //類的方法名(PHP 5.0.0 新加)。返回該方法被定義時的名字(區(qū)分大小寫)。

__NAMESPACE__ //當(dāng)前命名空間的名稱(大小寫敏感)。這個常量是在編譯時定義的(PHP 5.3.0 新增)

11、PHP 如何獲取客戶端的IP地址

用$_SERVER獲取的IP地址有什么問題?

$_SERVER['REMOTE_ADDR'] ; 通過全局?jǐn)?shù)組來獲得

getenv('REMOTE_ADDR') ; 通過環(huán)境變量來獲得

當(dāng)客戶機使用代理的時候獲取不到真實的IP地址

12、寫一個函數(shù),可以遍歷文件夾下的所有文件和文件夾。

function get_dir_info($path){

? ? ? ? ? $handle = opendir($path);//打開目錄返回句柄

? ? ? ? ? while(($content = readdir($handle))!== false){

? ? ? ? ? ? ? ? $new_dir = $path . DIRECTORY_SEPARATOR . $content;

? ? ? ? ? ? ? ? if($content == '..' || $content == '.'){

? ? ? ? ? ? ? ? ? ? ? continue;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? if(is_dir($new_dir)){

? ? ? ? ? ? ? ? ? ? ? echo "<br>目錄:".$new_dir . '<br>';

? ? ? ? ? ? ? ? ? ? ? get_dir_info($new_dir);

? ? ? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? ? ? ? echo "文件:".$path.':'.$content .'<br>';

? ? ? ? ? ? ? ? }

? ? ? ? ? }

? ? ? }

? ? ? get_dir_info($dir);

13、有mail.log的一個文檔,內(nèi)容為若干郵件地址,用’\n’分隔換行。挑選http://sina.com的地址(包括從文件讀取、過濾到列印出來)。

思路1:用正則表達(dá)式(比較慢,效率地,不推薦用)

思路2:cat mail.log | grep?http://sina.com

14、PHP緩存技術(shù)有哪些? tp是局部還是完全緩存?

1. 全頁面靜態(tài)化緩存,也就是將頁面全部生成html靜態(tài)頁面,用戶訪問時直接訪問的靜態(tài)頁面,而不會去走php服務(wù)器解析的流程

2. 頁面部分緩存,將一個頁面中不經(jīng)常變的部分進行靜態(tài)緩存,而經(jīng)常變化的塊不緩存,最后組裝在一起顯示

3. 數(shù)據(jù)緩存,通過一個id進行請求的數(shù)據(jù),將數(shù)據(jù)緩存到一個php文件中,id和文件是對應(yīng)的,下次通過這個id進行請求時 直接讀php文件

4. 查詢緩存,和數(shù)據(jù)緩存差不多,根據(jù)查詢語句進行緩存;

5. 常用的緩存技術(shù)有:redis和memcache

個人認(rèn)為tp應(yīng)該是全局緩存 因為:tp緩存實在本地生成一個php文件來存儲數(shù)據(jù)庫中讀取出來的數(shù)據(jù)

15、strlen()與mb_strlen的作用與區(qū)別

在PHP中,strlen與mb_strlen是求字符串長度的函數(shù)PHP內(nèi)置的字符串長度函數(shù)strlen無法正確處理中文字符串,它得到的只是字符串所占的字節(jié)數(shù)。對于GB2312的中文編碼,strlen得到的值是漢字個數(shù)的2倍,而對于UTF-8編碼的中文,就是3倍(在 UTF-8編碼下,一個漢字占3個字節(jié))。

采用mb_strlen函數(shù)可以較好地解決這個問題。mb_strlen的用法和strlen類似,只不過它有第二個可選參數(shù)用于指定字符編碼。例如得到UTF-8的字符串str長度,可以用mbstrlen(str長度,可以用mbstrlen(str,'UTF-8')。如果省略第二個參數(shù),則會使用PHP的內(nèi)部編碼。內(nèi)部編碼可以通過 mb_internal_encoding()函數(shù)得到。

需要注意的是,mb_strlen并不是PHP核心函數(shù),使用前需要確保在php.ini中加載了php_mbstring.dll,即確?!癳xtension=php_mbstring.dll”這一行存在并且沒有被注釋掉,否則會出現(xiàn)未定義函 數(shù)的問題。

16、寫一個函數(shù),盡可能高效的從一個標(biāo)準(zhǔn)url中取出擴展名

$arr = parse_url('http://www.sina.com.cn/abc/de/fg.php?id=1');

result=pathinfo(result=pathinfo(arr['path']);var_dump($arr);

var_dump($result['extension']);

17、php.ini 中safe mod關(guān)閉 影響哪些函數(shù)和參數(shù),至少寫6個?

move_uploaded_file() exec()

system() passthru()

popen() fopen()

mkdir() rmdir()

rename() unlink()

copy() chgrp()

chown() chmod()

touch() symlink()

link() parse_ini_file()

set_time_limit() max_execution_time mail()

18、一群猴子排成一圈,按1,2,…,n依次編號。然后從第1只開始數(shù),數(shù)到第m只,把它踢出圈,從它后面再開始數(shù),再數(shù)到第m只,在把它踢出去…,如此不停 的進行下去,直到最后只剩下一只猴子為止,那只猴子就叫做大王。要求編程模擬此過程,輸入m、n, 輸出最后那個大王的編號(約瑟夫環(huán))。

<?php

function fuhuan($allnum, $ti){

? ? $arr = array();

? ? for($i = 0; $i < $allnum; $i++){

? ? ? ? $arr[$i] = $i;

? ? }

? ? $nums = 1;

? ? while(count($arr) > 1){

? ? ? ? ? foreach ($arr as $key => $value) {

? ? ? ? ? ? ? if($nums == $ti){

? ? ? ? ? ? ? ? ? unset($arr[$key]);

? ? ? ? ? ? ? ? ? $nums = 1;

? ? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? ? $nums++;

? ? ? ? ? ? ? }

? ? ? ? }

? ? }

? ? $new_arr = array_values($arr);

? ? var_dump($new_arr[0] + 1);

}

fuhuan(10,10);

19、isset() 、empty()與is_null的區(qū)別

1、當(dāng)變量未定義時,is_null() 和“參數(shù)本身”是不允許作為參數(shù)判斷的,會報Notice警告錯誤;

2、empty , isset首先都會檢查變量是否存在,然后對變量值進行檢測。而is_null 和 “參數(shù)本身”只是直接檢查變量值,是否為null,因此如果變量未定義就會出現(xiàn)錯誤!

3、isset():僅當(dāng)null和未定義,返回false;

4、empty():""、0、"0"、NULL、FALSE、array(),未定義,均返回true;

5、is_null():僅判斷是否為null,未定義報警告;

6、變量本身作為參數(shù),與empty()一致,但接受未定義變量時,報警告;

20、求兩個文件的相對路徑(這題沒什么實際意義)

getpath('/a/b/c/d/e.php', '/a/d/12/34/c.php');


public function getpath($a, $b)

{

? ? $aarr = explode('/', $a);

? ? $barr = explode('/', $b);

? ? $count = count($barr) - 2;

? ? $pathinfo = '';

? ? for($i = 1; $i <= $count; $i++){

? ? ? ? if($aarr[$i] == $barr[$i]){

? ? ? ? ? ? ? $pathinfo .= '../';

? ? ? ? }else{

? ? ? ? ? ? ? $pathinfo .= $barr[$i] . '/';

? ? ? ? }

? ? }

? ? echo $pathinfo;

}

21、MVC的優(yōu)缺點

1、 MVC的優(yōu)點

(1) 可以為一個模型在運行時同時建立和使用多個視圖。變化-傳播機制可以確保所有相關(guān)的視圖及時得到模型數(shù)據(jù)變化,從而使所有關(guān)聯(lián)的視圖和控制器做到行為同步。

(2) 視圖與控制器的可接插性,允許更換視圖和控制器對象,而且可以根據(jù)需求動態(tài)的打開或關(guān)閉、甚至在運行期間進行對象替換。

(3) 模型的可移植性。因為模型是獨立于視圖的,所以可以把一個模型獨立地移植到新的平臺工作。需要做的只是在新平臺上對視圖和控制器進行新的修改。

(4) 潛在的框架結(jié)構(gòu)??梢曰诖四P徒?yīng)用程序框架,不僅僅是用在設(shè)計界面的設(shè)計中。

2、 MVC的不足之處

(1) 增加了系統(tǒng)結(jié)構(gòu)和實現(xiàn)的復(fù)雜性。對于簡單的界面,嚴(yán)格遵循MVC,使模型、視圖與控制器分離,會增加結(jié)構(gòu)的復(fù)雜性,并可能產(chǎn)生過多的更新操作,降低運行效率。

(2) 視圖與控制器間的過于緊密的連接。視圖與控制器是相互分離,但確實聯(lián)系緊密的部件,視圖沒有控制器的存在,其應(yīng)用是很有限的,反之亦然,這樣就妨礙了他們的獨立重用。

(3) 視圖對模型數(shù)據(jù)的低效率訪問。依據(jù)模型操作接口的不同,視圖可能需要多次調(diào)用才能獲得足夠的顯示數(shù)據(jù)。對未變化數(shù)據(jù)的不必要的頻繁訪問,也將損害操作性能。

(4) 目前,一般高級的界面工具或構(gòu)造器不支持MVC模式。改造這些工具以適應(yīng)MVC需要和建立分離的部件的代價是很高的,從而造成使用MVC的困難。

22、session與cookie的聯(lián)系和區(qū)別(運行機制),session共享問題解決方案

區(qū)別與聯(lián)系:

使用session_start()調(diào)用session,服務(wù)器端在生成session文件的同時生成session ID哈希值和默認(rèn)值為PHPSESSID的session name,并向客戶端發(fā)送變量為PHPSESSID(session name)(默認(rèn))值為一個128位的哈希值。服務(wù)器端將通過該cookie與客戶端進行交互,session變量的值經(jīng)php內(nèi)部系列化后保存在服務(wù)器 機器上的文本文件中,和客戶端的變量名默認(rèn)情況下為PHPSESSID的coolie進行對應(yīng)交互,即服務(wù)器自動發(fā)送了http 頭:header(‘Set-Cookie: session_name()=session_id(); path=/’);即setcookie(session_name(),session_id());當(dāng)從該頁跳轉(zhuǎn)到的新頁面并調(diào)用 session_start()后,PHP將檢查與給定ID相關(guān)聯(lián)的服務(wù)器端存貯的session數(shù)據(jù),如果沒找到則新建一個數(shù)據(jù)集。

共享方案:

1:使用數(shù)據(jù)庫保存session, 使用數(shù)據(jù)庫來保存session,就算服務(wù)器宕機了也沒事,session照樣在。

問題:程序需要定制;每次請求都進行數(shù)據(jù)庫讀寫開銷不小,另外數(shù)據(jù)庫是一個單點,可以做數(shù)據(jù)庫的hash來解 決這個問題。

2:使用 memcached來保存session, 這種方式跟數(shù)據(jù)庫類似,內(nèi)存存取性能比數(shù)據(jù)庫好很多。

問題:程序需要定制,增加 了工作量;存入memcached中的數(shù)據(jù)都需要序列化,效率較低,斷電或者重啟電腦容易丟失數(shù)據(jù);

3: 通過加密的cookie,在A服務(wù)器上登錄,在用戶的瀏覽器上添加加密的cookie,當(dāng)用戶訪問B服務(wù)器時,檢查有無Session,如果沒有,就檢驗 Cookie是否有效,Cookie有效的話就在B服務(wù)器上重建session。簡單,高效, 服務(wù)器的壓力減小了,因為session數(shù)據(jù)不存在服務(wù)器磁盤上。根本就不會出現(xiàn)session讀取不到的問題。

問題:網(wǎng)絡(luò)請求占用很多。每次請求時,客戶端都要通過cookie發(fā)送session數(shù)據(jù)給服務(wù)器,session中數(shù)據(jù)不能太多,瀏覽器對cookie 的大

小存在限制。不適合高訪問量的情況,因為高訪問量的情況下。

23、?正則表達(dá)式

正則表達(dá)式一定要會, 通過正則表達(dá)式能很容易的看出一個人的基礎(chǔ)

匹配中文字符的正則表達(dá)式: [\u4e00-\u9fa5]

匹配雙字節(jié)字符(包括漢字在內(nèi)):[^\x00-\xff]

匹配空行的正則表達(dá)式:\n[\s| ]*\r

匹配HTML標(biāo)記的正則表達(dá)式:/<(.*)>.*<\/\1>|<(.*) \/>/

匹配首尾空格的正則表達(dá)式:(^\s*)|(\s*$)

匹配Email地址的正則表達(dá)式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

匹配網(wǎng)址URL的正則表達(dá)式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$

匹配帳號是否合法(字母開頭,允許5-16字節(jié),允許字母數(shù)字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

匹配國內(nèi)電話號碼:(\d{3}-|\d{4}-)?(\d{8}|\d{7})?

匹配騰訊QQ號:^[1-9]*[1-9][0-9]*$

24、寫一個函數(shù)得到header頭信息

function getHeader()

{

? ? $headers = [];

? ? if (function_exists('getallheaders')) {

? ? ? ? $headers = getallheaders();

? ? } elseif (function_exists('http_get_request_headers')) {

? ? ? ? $headers = http_get_request_headers();

? ? } else {

? ? ? ? foreach ($_SERVER as $key => $value) {

? ? ? ? ? ? if(strstr($key, 'HTTP_')) {

? ? ? ? ? ? ? ? $newk = ucwords(strtolower(str_replace('_', '-', substr($key, 5))));

? ? ? ? ? ? ? ? $headers[$newk] = $value;

? ? ? ? ? ? }

? ? ? ? }

? ? }

? ? var_dump($headers);

}

------------------------MySQL部分-----------------------

1、select * from table where (ID = 10) or (ID = 32) or (ID = 22) 讓結(jié)果按10, 32, 22的順序檢索出來?

Select *

from user_info

Where (ID IN (10, 32, 22))

order BY FIND_IN_SET(ID, '10, 32, 22')

暫時更新到這,后續(xù)請點關(guān)注收藏期待更新~~~

?著作權(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ù)。

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