PHP面試總結(轉) PHP面試總結

PHP面試總結

 

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

  面試是進入職場的第一道坎,由於我自己學校太通常的問題在面試中遇到了各類不爽,和那些高學歷的相比本身真是信心大跌。我面試的方向是php開發工程師,主要作網站後臺、APP接口等。我所面試的公司、試題、心得都在個人我的網站上,感興趣的能夠看看:www.zhaoyafei.cn。下面是我這段時間總結的面試方面的常考常問的知識點,不對之處歡迎指出。知識點所有都在是面試中遇到了,基本上每面試一家公司,我都會總結在上面。但願對你們有所幫助。
html

總結:mysql

這是面試我所遇到的大部分的知識點,供你們參考,沒有寫答案,你們本身能夠查查,後續我會持續更新linux

PHP基礎
複製代碼
1:變量的傳值與引用。
2:變量的類型轉換和判斷類型方法。
3:php運算符優先級,通常是寫出運算符的運算結果。
4:PHP中函數傳參,閉包,判斷輸出的echo,print是否是函數等。
5:PHP數組,數組函數,數組遍歷,預約義數組(面試必出)。
6:PHP面向對象,魔術方法,封裝、繼承、多態。設計模式,包括(單利、工廠、迭代器、裝飾、命令、策略)。
7:正則表達式,每一個標號含義,郵箱、網址、標籤匹配,正則函數(面試必出)。
8:PHP異常處理(級別,錯誤日誌,控制錯誤輸出)。
9:PHP時間函數,日期計算函數。
10:文件系統,記錄日誌、目錄、文件的遍歷、上傳、多方法獲得文件擴展名、文件引用方式、引用函數區別。(面試必出)。
11:會話控制,主要說原理。session與cookie在分佈式應用中出現問題的解決方案。
12:PHP模板引擎,經常使用模板引擎特色,MVC好與很差的地方。
13:PHP安全處理,過濾函數。
14:XML的使用。
15:PHP字符串的處理,包括轉義(安全)、編碼、截取、定位、與數組間的轉換、處理函數等。(面試必出)。
16:Socket編程,各類協議,head頭,curl參數含義。
17:網絡狀態碼含義,經常使用(204,304, 404, 504,502)。
18:Apache配置文件,PHP配置文件,各個含義字段的含義。
19:網絡各類攻擊的名詞含義(SQL攻擊、XSS、CSRF、DDos),防止措施。
20:url的處理函數,獲得url指定的部分。
複製代碼
 
Mysql基礎
複製代碼
1:基礎sql語句書寫(通常讓寫關聯和子查詢語句)
2:索引的建立,優缺點,最左原則
3:存儲引擎,經常使用的幾個,優缺點,差異,原理(面試必出)
4:sql注入的處理方法
5:mysql處理函數(PHP中封裝的)
6:PDO的使用方法,爲何使用
7:mysql的優化,表拆分等
8:事務處理,sql語句的處理效率等
9:數據表字段的類型,同類型間的區別,改如何選取,int(10)與int(11)的區別等。
10:數據庫索引使用的那種數據結構,畫出數據結構
複製代碼
 
Linux
1:經常使用命令的使用,vim編輯器的使用。
2:進程,cpu等信息的查看命令。
3:文件內查看命令(主要涉及統計信息)。
4:Shell的使用,命令操做。
 
NoSql
1:Redis的應用場景,結合微博業務說出他的具體應用。
2:Redis與MC支持數據的不一樣點,二者都支持哪些數據結構的存儲,寫越多越好。
3:Redis持久化存儲的原理,與Mysql的應用區別。怎樣保持持久化數據與內存數據同步的關係(Redis同步機制)
4:Redis與MC在併發狀態下的性能比較。
5:MC的內存管理機制,當一個數據須要存儲的時候怎樣分配內存空間
6:Redis的內存管理機制,與MC有哪些不一樣點。
 
開發環境
1:PHP7中的新特性與廢棄的特性
2:爲何要使用PHP7,PHP7快在哪裏
 
版本控制
1:git的使用命令,例如:寫出版本回退命令。
2:git與svn的區別。
3:如何進行多分支開發,包括多人開發協同,分段測試,上線。

 下面給你們附上一張知識點導圖,幫助你們記憶:nginx

PHP-程序設計思惟導圖

PHP部分git

一、HTTP Keep-Alive的做用程序員

二、php數組函數常見的那些? (array_merge、in_array的做用)web

三、PHP中幾個輸出函數echo,print(),print_r(),sprintf(),var_dump()的區別面試

四、不用新變量直接交換現有兩個變量的值正則表達式

五、heredoc

六、寫個函數來解決多線程同時讀寫一個文件的問題。

七、禁掉cookie的session使用方案,設置session過時的方法,對應函數

八、json格式數據有哪些特色

九、php獲取文件內容的方法,對應的函數

十、php魔術方法與魔術常量

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

十二、寫一個函數,能夠遍歷文件夾下的全部文件和文件夾。

1三、有mail.log的一個文檔,內容爲若干郵件地址,用’\n’分隔換行。挑選sina.com的地址。

1四、PHP緩存技術有哪些? tp是局部仍是徹底緩存?

1五、strlen()與mb_strlen的做用與區別

1六、寫一個函數,儘量高效的從一個標準url中取出擴展名

1七、php.ini 中safe mod關閉 影響哪些函數和參數,至少寫6個?

1八、  約瑟夫環問題

1九、Isset() 、empty()與is_null的區別

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

2一、MVC的優缺點

2二、Session與cookie的聯繫和區別(運行機制),session共享問題解決方案

2三、正則表達式

2四、寫一個函數獲得header頭信息

 

MySQL部分

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

 

Linux部分

一、Core文件是什麼,有什麼用?

二、共享內存除了文件映射還有什麼方式?

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

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

五、Linux查詢命令

 

服務器部分

一、Apache與Nginx的優缺點比較 

二、Cgi 與fastcgi的區別

三、Select, poll和epoll的區別

四、Memcache和Redis區別

 ------------------------------------PHP部分-------------------------------------

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

一、HTTP Keep-Alive的做用

做用:Keep-Alive:使客戶端到服務器端的鏈接持續有效,當出現對服務器的後繼請求時,Keep-Alive功能避免了創建或者從新創建鏈接。Web服務器,基本上都支持HTTP Keep-Alive。

缺點:對於提供靜態內容的網站來講,這個功能一般頗有用。可是,對於負擔較重的網站來講,雖然爲客戶保留打開的連 接有必定的好處,但它一樣影響了性能,由於在處理暫停期間,原本能夠釋放的資源仍舊被佔用。當Web服務器和應用服務器在同一臺機器上運行時,Keep- Alive功能對資源利用的影響尤爲突出。

解決:Keep-Alive: timeout=5, max=100
timeout:過時時間5秒(對應httpd.conf裏的參數是:KeepAliveTimeout),max是最多一百次請求,強制斷掉鏈接。就是在timeout時間內又有新的鏈接過來,同時max會自動減1,直到爲0,強制斷掉。

二、php數組函數常見的那些? (array_merge、in_array的做用)

     PHP中以array_開頭的數組函數有哪些,並說出使用方法(至少6個)
 
1、數組遍歷函數
1 list();  //不是真正的函數,而是PHP的語言結構,用於給一組變量賦值,僅能用於索引數組
2 each();  //返回數組當前元素的鍵值對,並將指針移動到下一個元素位置
3 while(); //可配合list或each使用:while(list($key, $value) = each($arr)){each $key, $value; }
 
2、數組內部指針控制
1 current();  //讀取指針位置的內容
2 key();      //讀取當前指針指向內容的索引值
3 next();     //將數組中的內部指針指向下一單元
4 prev();     //將數組內部指針倒回一位
5 end();      //將數組內部指針指向最後一個元素
6 reset();    //將目前指針指向第一個索引位置
3、數組鍵值操做函數
複製代碼
1 array_values($arr);       //得到數組的值
2 array_keys($arr);         //得到數組的鍵名
3 array_flip($arr);         //數組中的值與鍵名互換(若是有重複前面的會被後面的覆蓋)
4 array_search('PHP',$arr); //檢索給定的值,加true則是嚴格類型檢查
5 array_reverse($arr);      //將數組中的元素翻轉(先後順序)
6 in_array("apple", $arr);  //在數組中檢索apple
7 array_key_exists("apple", $arr); // 檢索給定的鍵名是否存在數組中
8 array_count_values($arr);        // 統計數組中全部值出現的次數
9 array_unique($arr); // 刪除數組中重複的值
複製代碼
 
4、數組回調函數
1 array_filter(); //使用回調函數過濾數組中的元素,若是回調返回true則當前的元素被包含到返回數組中
2 array_walk();   //回調函數處理數組,自定義函數要有兩個參數,本函數第三個參數能夠做爲回調第三個參數返回
3 array_map();    //能夠處理多個數組,每一個數組的長度應該相同,傳入數組的個數和回調函數參數個數應該一致
2、數組的分段和填充
1 array_slice($arr, 0, 3);    //將數組中的一段取出,此函數忽略鍵名(數組的分段)
2 array_splice($arr, 0, 3,array("black","maroon"));    //將數組中的一段取出,返回的序列從原數組中刪除
3 array_chunk($arr, 3, TRUE);   //將一個數組分割成多個,TRUE爲保留原數組的鍵名(分割多個數組)
4、數組與棧,列隊
1 array_push($arr, "apple", "pear");    //將一個或多個元素壓入數組棧的末尾(入棧),返回入棧元素的個數
2 array_pop($arr);    // 將數組棧的最後一個元素彈出(出棧)
3 array_shift($arr);   //數組中第一個元素移出並返回(長度減1,其餘元素向前移動一位,數字鍵名改成從零計數,文字鍵名不變)
4 array_unshift($arr,"a",array(1,2));  //在數組的開頭插入一個或多個元素
6、數組的排序
複製代碼
1 sort($arr);      //由小到大,忽略鍵名
2 rsort($arr);     //由大到小,忽略鍵名
3 asort($arr); //由小到大,保留鍵名 4 arsort($arr); //由大到小,保留鍵名
5 ksort($arr); //按照鍵名正序排序 6 krsort($arr); //按照鍵名逆序排序
複製代碼
7、數組的計算
複製代碼
1 array_sum($arr);   //對數組內部的全部元素作求和運算(數組元素的求和)
2 array_merge($arr1, $arr2); //合併兩個或多個(相同字符串鍵名,後面覆蓋前面,相同的數字鍵名,後面的附加到後面)
3  
4 array_diff($arr1, $arr2);           //返回差集結果數組   array_diff_assoc($arr1, $arr2, $arr3);  //返回差集結果數組,鍵名也作比較
5 array_intersect($arr1, $arr2);  //返回交集結果數組    array_intersect_assoc($arr1, $arr2);   //返回交集結果數組,鍵名也作比較 
複製代碼
8、其餘的數組函數
1 array_unique($arr);   //移除數組中重複的值,新的數組中會保留原始的鍵名
2 shuffle($arr);             // 將數組的順序打亂
  三、PHP中幾個輸出函數echo,print(),print_r(),sprintf(),var_dump()的區別

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

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

3:print_r:是函數,能夠打印複合類型,例如:stirng、int、float、array、object等,輸出array時會用結構表示,並且能夠經過print_r($str,true)來使print_r不輸出而返回print_r處理後的值

4:printf:是函數,把文字格式化之後輸出(參看C語言)

5:sprintf:是函數,跟printf類似,但不打印,而是返回格式化後的文字(該函數把格式化的字符串寫寫入一個變量中,而不是輸出來),其    他的與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():函數,輸出變量的內容、類型或字符串的內容、類型、長度。經常使用來調試。

能夠經過function_exists('函數名稱')進行測試

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)

四、不用新變量直接交換現有兩個變量的值

複製代碼
 1 1: 
 3     list($a, $b) = array($b, $a);
 4 2: 
5 $a = $a . $b; 5 $b = strlen( $b ); 6 $b = substr( $a, 0, (strlen($a) – $b ) ); 7 $a = substr( $a, strlen($b) ); 8 9 3:(必須用一個兩個字符串都都不能出現的字符作爲分隔符) 10 $a = $b.','.$a ; 11 $a = explode(',', $a); 12 $b = $a[1]; 13 $a = $a[0]; 14 15 4:這個是當兩個數都是數字的時候: 16 $a = $a + $b; 17 $b = $a – $b; 18 $a = $a – $b; 19 20 5:藉助數組 21 $a = array($a,$b); 22 $b = $a[0]; 23 $a = $a[1];
複製代碼

五、heredoc

Heredoc在正規的PHP文檔中和技術書籍中通常沒有詳細講述。他是一種Perl風格的字符串輸出技術。使用heredoc技術能夠實現界面與代碼的準分離,好比phpwind模板。

heredoc的語法是用」<<<」加上本身定義成對的標籤,在標籤範圍內的文字視爲一個字符串

規則以下:

一、以<<<End開始標記開始,以End結束標記結束,結束標記必須頂頭寫,不能有縮進和空格,且在結束標記末尾要有分號 。開始標記和開始標記相同,好比經常使用大寫的EOT、EOD、EOF來表示,也能夠使用其餘標記,只要保證開始標記和結束標記不在正文中出現就行

二、位於開始標記和結束標記之間的變量能夠被正常解析,可是函數則不能夠。在heredoc中,變量不須要用鏈接符 . 或 , 來拼接,好比:

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

三、heredoc經常使用在輸出包含大量HTML語法文檔的時候。他要比傳統的echo輸出精煉不少,以下所示:

複製代碼
 1 function getHtml()
 2 {
 3     echo "<html>";
 4     echo "<head><title>Title</title></head>";
 5     echo "<body>Content</body>";
 6     echo "</html>;
 7 }
 8 
 9 function getHtml()
10 {
11 echo <<<EOT
12       <html>
13       <head><title>Title</title></head>
14       <body>Content</body>
15       </html>
16 EOT;
17 }
複製代碼
 
六、寫個函數來解決多線程同時讀寫一個文件的問題。
複製代碼
 1 <?php
 2     $fp = fopen("/tmp/lock.txt","w+");
 3     if(flock($fp, LOCK_EX)){// 進行排它型鎖定
 4         fwrite($fp,"Write something here\n");
 5         flock($fp, LOCK_UN);// 釋放鎖定
 6     }else{
 7         echo "Couldn't lock the file !";
 8     }
 9     fclose($fp);
10 ?>
複製代碼

 

七、禁掉cookie的session使用方案,設置session過時的方法,對應函數

經過 url 傳值,把session id附加到url上(缺點:整個站點中不能有純靜態頁面,由於純靜態頁面session id 將沒法繼續傳到下一頁面)
經過隱藏表單,把session id 放到表單的隱藏文本框中同表單一塊提交過去(缺點:不適用<a>標籤這種直接跳轉的非表單的狀況)
直接配置php.ini文件,將php.ini文件裏的session.use_trans_sid= 0設爲1,(好像在win上不支持)
用文件、數據庫等形式保存Session ID,在跨頁過程當中手動調用
複製代碼
 1 第一種  setcookie() 直接用setcookie設置session id的生命週期。
 3     $lifetime=60; //保存1分鐘 
 4     session_start(); 
 5     setcookie(session_name(), session_id(), time()+$lifetime, "/");
 6 第二種  session_set_cookie_params()    
 7     $lifetime=60;//保存1分鐘
 8     session_set_cookie_params($lifetime);
 9     session_start();
10     session_regenerate_id(true);
11     其中session_regenerate_id();方法用於改變當前session_id的值,並保留session中數組的值。參數默認爲 false,若是設置爲true則改變session_id的值,並清空當前session數組。
複製代碼

八、json格式數據有哪些特色 

    JSON 一種輕量級的數據交換格式。它基於ECMAScript的一個子集。 JSON採用徹底獨立於語言的文本格式,可是也使用了相似於C語言家族的習慣(包括C、C++、C#、Java、JavaScript、Perl、 Python等)。這些特性使JSON成爲理想的數據交換語言。 易於人閱讀和編寫,同時也易於機器解析和生成(網絡傳輸速率)。

JSON的結構基於下面兩點

1. "名稱/值"對的集合 不一樣語言中,它被理解爲對象(object),記錄(record),結構(struct),字典(dictionary),哈希表(hash table),鍵列表(keyed list)等
2. 值的有序列表  多數語言中被理解爲數組(array) 
 
九、php獲取文件內容的方法,對應的函數
1:file_get_contents獲得文件的內容(能夠以get和post的方式獲取),整個文件讀入一個字符串中
2:用fopen打開url, 以get方式獲取內容(藉助fgets()函數)
3:用fsockopen函數打開url(能夠以get和post的方式獲取),以get方式獲取完整的數據,包括header和body
4:使用curl庫獲取內容,使用curl庫以前,須要查看php.ini,查看是否已經打開了curl擴展

十、php魔術方法與魔術常量
 
類方法:
一、__construct(); 
  用法說明:具備構造函數的類會在每次建立新對象時先調用此方法,適合在使用對象以前作一些初始化工做。 若是子類中定義了構造函數則不會隱式調用其父類的構造函數。要執行父類的構造函數,須要在子類的構造函數中調用parent::__construct()。若是子類沒有定義構造函數則會如同一個普通的類方法同樣從父類繼承。
二、__destruct(); 
  用法說明:析構函數會在到某個對象的全部引用都被刪除或者當對象被顯式銷燬時執行。
 
方法重載:
三、__call();
  用法說明:在對象中調用一個不可訪問方法時,__call(); 方法會被調用。
四、__callStatic();
  用法說明:用靜態方式中調用一個不可訪問方法時,__callStatic(); 方法會被調用。
 
屬性重載:(只對類中私有受保護的成員屬性有效)
五、__get();
  用法說明:讀取不可訪問屬性的值時, __get() 會被調用。
六、__set();
  用法說明:在給不可訪問屬性賦值時, __set() 會被調用。
七、__isset();
  用法說明:當對不可訪問屬性調用  isset() 或 empty() 時,__isset() 會被調用。
八、__unset();
  用法說明:當對不可訪問屬性調用  unset() 時,__unset() 會被調用。
 
序列化相關:
九、__sleep();
  用法說明:序列化時調用, serialize() 函數會檢查類中是否存在該魔術方法。若是存在,該方法會先被調用,而後才執行序列化操做。
十、__wakeup();
  用法說明: unserialize() 會檢查是否存在一個 __wakeup() 方法。若是存在,則會先調用該方法,用在反序列化操做中,例如從新創建數據庫鏈接,或執行其它初始化操做
 
操做類和對象方法:
十一、__toString();
   用法說明:方法用於一個類被當成字符串時調用,例如把一個類當作字符串進行輸出
十二、__invoke();
  用法說明:當嘗試以調用函數的方式調用一個對象時, __invoke() 方法會被自動調用。
十二、__set_state();
  用法說明:當調用 var_export() 導出類時,此靜態 方法會被調用。 本方法的惟一參數是一個數組
1三、__clone();
   用法說明:當複製完成時,若是定義了 __clone() 方法,則新建立的對象(複製生成的對象)中的 __clone() 方法會被調用,可用於修改屬性的值。
1四、__autoload();
   用法說明:該方法能夠自動實例化須要的類。當程序要用一個類但沒有被實例化時,改方法在指定路徑下查找和該類名稱相同的文件。不然報錯。
 
說明:PHP 將全部以 __(兩個下劃線)開頭的類方法保留爲魔術方法。因此在定義類方法時,除了上述魔術方法,建議不要以 __ 爲前綴。在命名本身的類方法時不能使用這些方法名,除非是想使用其魔術功能。
 
常量:
__LINK__      //文件中的當前行號。
__FILE__       //文件的完整路徑和文件名。若是用在被包含文件中,則返回被包含的文件名。
__DIR__       //文件所在的目錄。若是用在被包括文件中,則返回被包括的文件所在的目錄,它等價於 dirname(__FILE__)。
 
__FUNCTION__       //函數名稱。自 PHP 5 起本常量返回該函數被定義時的名字(區分大小寫)。在 PHP 4 中該值老是小寫字母的。
 __CLASS__              //類的名稱。自 PHP 5 起本常量返回該類被定義時的名字(區分大小寫)。在 PHP 4 中該值老是小寫字母的。
 __METHOD__         //類的方法名(PHP 5.0.0 新加)。返回該方法被定義時的名字(區分大小寫)。
 __NAMESPACE__   //當前命名空間的名稱(大小寫敏感)。這個常量是在編譯時定義的(PHP 5.3.0 新增)
 

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

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

$_SERVER['REMOTE_ADDR'] ;   經過全局數組來得到 

getenv('REMOTE_ADDR') ; 經過環境變量來得到

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

 

十二、寫一個函數,能夠遍歷文件夾下的全部文件和文件夾。

複製代碼
 1     function get_dir_info($path){
 2           $handle = opendir($path);//打開目錄返回句柄
 3           while(($content = readdir($handle))!== false){
 4                 $new_dir = $path . DIRECTORY_SEPARATOR . $content;
 5                 if($content == '..' || $content == '.'){
 6                        continue;
 7                 }
 8                 if(is_dir($new_dir)){
 9                       echo "<br>目錄:".$new_dir . '<br>';
10                       get_dir_info($new_dir);
11                 }else{
12                       echo "文件:".$path.':'.$content .'<br>';
13                 }
14           }
15       }
16       get_dir_info($dir);
複製代碼

 

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

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

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

 

1四、PHP緩存技術有哪些? tp是局部仍是徹底緩存?

1. 全頁面靜態化緩存,也就是將頁面所有生成html靜態頁面,用戶訪問時直接訪問的靜態頁面,而不會去走php服務器解析的流程
2. 頁面部分緩存,將一個頁面中不常常變的部分進行靜態緩存,而常常變化的塊不緩存,最後組裝在一塊兒顯示
3. 數據緩存,經過一個id進行請求的數據,將數據緩存到一個php文件中,id和文件是對應的,下次經過這個id進行請求時 直接讀php文件
4. 查詢緩存,和數據緩存差很少,根據查詢語句進行緩存;
5. 經常使用的緩存技術有:redis和memcache
我的認爲tp應該是全局緩存 由於:tp緩存實在本地生成一個php文件來存儲數據庫中讀取出來的數據
 

1五、strlen()與mb_strlen的做用與區別

在PHP中,strlen與mb_strlen是求字符串長度的函數
PHP內置的字符串長度函數strlen沒法正確處理中文字符串,它獲得的只是字符串所佔的字節數。對於GB2312的中文編碼,strlen獲得的值是漢字個數的2倍,而對於UTF-8編碼的中文,就是3倍(在 UTF-8編碼下,一個漢字佔3個字節)。
 
採用mb_strlen函數能夠較好地解決這個問題。mb_strlen的用法和strlen相似,只不過它有第二個可選參數用於指定字符編碼。例如獲得UTF-8的字符串 strmbstrlen(str長度,能夠用mbstrlen(str,'UTF-8')。若是省略第二個參數,則會使用PHP的內部編碼。內部編碼能夠經過 mb_internal_encoding()函數獲得。

須要注意的是,mb_strlen並非PHP核心函數,使用前須要確保在php.ini中加載了php_mbstring.dll,即確保「extension=php_mbstring.dll」這一行存在而且沒有被註釋掉,不然會出現未定義函 數的問題。
 
1六、寫一個函數,儘量高效的從一個標準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']);
 
1七、php.ini 中safe mod關閉 影響哪些函數和參數,至少寫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()

 

1八、一羣猴子排成一圈,按1,2,…,n依次編號。而後從第1只開始數,數到第m只,把它踢出圈,從它後面再開始數,再數到第m只,在把它踢出去…,如此不停 的進行下去,直到最後只剩下一隻猴子爲止,那隻猴子就叫作大王。要求編程模擬此過程,輸入m、n, 輸出最後那個大王的編號。

複製代碼
 1 <?php
 2  function fuhuan($allnum, $ti){
 3      $arr = array();
 4      for($i = 0; $i < $allnum; $i++){
 5          $arr[$i] = $i;
 6      }
 7  
 8      $nums = 1;
 9      while(count($arr) > 1){
10           foreach ($arr as $key => $value) {
11               if($nums == $ti){
12                   unset($arr[$key]);
13                   $nums = 1;
14               }else{
15                   $nums++;
16               }
17          }
18      }
19      $new_arr = array_values($arr);
20      var_dump($new_arr[0] + 1);
21  }
22  fuhuan(10,10);
複製代碼

 1九、isset() 、empty()與is_null的區別

一、當變量未定義時,is_null() 和「參數自己」是不容許做爲參數判斷的,會報Notice警告錯誤;

二、empty , isset首先都會檢查變量是否存在,而後對變量值進行檢測。而is_null 和 「參數自己」只是直接檢查變量值,是否爲null,所以若是變量未定義就會出現錯誤!

三、isset():僅當null和未定義,返回false;

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

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

六、變量自己做爲參數,與empty()一致,但接受未定義變量時,報警告;

 

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

複製代碼
 1  getpath('/a/b/c/d/e.php', '/a/d/12/34/c.php');
 2   
 3 public function getpath($a, $b)
 4 {
 5      $aarr = explode('/', $a);
 6      $barr = explode('/', $b);
 7      $count = count($barr) - 2;
 8      $pathinfo = '';
 9      for($i = 1; $i <= $count; $i++){
10          if($aarr[$i] == $barr[$i]){
11               $pathinfo .= '../';
12          }else{
13               $pathinfo .= $barr[$i] . '/';
14          }
15      }
16      echo $pathinfo;
17 }
複製代碼

 

2一、MVC的優缺點
一、 MVC的優勢 
        (1) 能夠爲一個模型在運行時同時創建和使用多個視圖。變化-傳播機制能夠確保全部相關的視圖及時獲得模型數據變化,從而使全部關聯的視圖和控制器作到行爲同步。  
        (2) 視圖與控制器的可接插性,容許更換視圖和控制器對象,並且能夠根據需求動態的打開或關閉、甚至在運行期間進行對象替換。 
        (3) 模型的可移植性。由於模型是獨立於視圖的,因此能夠把一個模型獨立地移植到新的平臺工做。須要作的只是在新平臺上對視圖和控制器進行新的修改。 
        (4) 潛在的框架結構。能夠基於此模型創建應用程序框架,不只僅是用在設計界面的設計中。 
二、 MVC的不足之處 
        (1) 增長了系統結構和實現的複雜性。對於簡單的界面,嚴格遵循MVC,使模型、視圖與控制器分離,會增長結構的複雜性,並可能產生過多的更新操做,下降運行效率。 
        (2) 視圖與控制器間的過於緊密的鏈接。視圖與控制器是相互分離,但確實聯繫緊密的部件,視圖沒有控制器的存在,其應用是頗有限的,反之亦然,這樣就妨礙了他們的獨立重用。 
        (3) 視圖對模型數據的低效率訪問。依據模型操做接口的不一樣,視圖可能須要屢次調用才能得到足夠的顯示數據。對未變化數據的沒必要要的頻繁訪問,也將損害操做性能。 
        (4) 目前,通常高級的界面工具或構造器不支持MVC模式。改造這些工具以適應MVC須要和創建分離的部件的代價是很高的,從而形成使用MVC的困難。 
 
 
2二、session與cookie的聯繫和區別(運行機制),session共享問題解決方案
區別與聯繫:
    使用session_start()調用session,服務器端在生成session文件的同時生成session ID哈希值和默認值爲PHPSESSID的session name,並向客戶端發送變量爲PHPSESSID(session name)(默認)值爲一個128位的哈希值。服務器端將經過該cookie與客戶端進行交互,session變量的值經php內部系列化後保存在服務器 機器上的文本文件中,和客戶端的變量名默認狀況下爲PHPSESSID的coolie進行對應交互,即服務器自動發送了http 頭:header(‘Set-Cookie: session_name()=session_id(); path=/’);即setcookie(session_name(),session_id());當從該頁跳轉到的新頁面並調用 session_start()後,PHP將檢查與給定ID相關聯的服務器端存貯的session數據,若是沒找到則新建一個數據集。
共享 方案:
1:使用數據庫保存session, 使用數據庫來保存session,就算服務器宕機了也沒事,session照樣在。

問題:程序須要定製;每次請求都進行數據庫讀寫開銷不小,另外數據庫是一個單點,能夠作數據庫的hash來解 決這個問題。       

2:使用 memcached來保存session, 這種方式跟數據庫相似,內存存取性能比數據庫好不少。

問題:程序須要定製,增長 了工做量;存入memcached中的數據都須要序列化,效率較低,斷電或者重啓電腦容易丟失數據;

3: 經過加密的cookie,在A服務器上登陸,在用戶的瀏覽器上添加加密的cookie,當用戶訪問B服務器時,檢查有無Session,若是沒有,就檢驗 Cookie是否有效,Cookie有效的話就在B服務器上重建session。簡單,高效, 服務器的壓力減少了,由於session數據不存在服務器磁盤上。根本就不會出現session讀取不到的問題。

問題:網絡請求佔用不少。每次請求時,客戶端都要經過cookie發送session數據給服務器,session中數據不能太多,瀏覽器對cookie 的大

小存在限制。不適合高訪問量的狀況,由於高訪問量的狀況下。

 

2三、 正則表達式

匹配中文字符的正則表達式: [\u4e00-\u9fa5] 
匹配雙字節字符(包括漢字在內):[^\x00-\xff] 
匹配空行的正則表達式:\n[\s| ]*\r 
匹配HTML標記的正則表達式:/<(.*)>.*<\/\1>|<(.*) \/>/ 
匹配首尾空格的正則表達式:(^\s*)|(\s*$) 
匹配Email地址的正則表達式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 
匹配網址URL的正則表達式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$ 
匹配賬號是否合法(字母開頭,容許5-16字節,容許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 
匹配國內電話號碼:(\d{3}-|\d{4}-)?(\d{8}|\d{7})? 
匹配騰訊QQ號:^[1-9]*[1-9][0-9]*$ 

 

2四、寫一個函數獲得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部分-----------------------

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

Select *
from user_info
Where (ID IN (10, 32, 22))

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

----------------------linux部分-----------------------

 一、core文件是什麼,有什麼用?

 core是unix系統的內核。當你的程序出現內存越界的時候,操做系統會停止你的進程,並將當前內存狀態倒出到core文件中,以便進一步分析。程序員能夠經過core文件來找出問題所在。它記錄了程序掛掉時詳細的狀態描述。
什麼是core dump Core的意思是內存, Dump的意思是扔出來, 堆出來。開發和使用Unix程序時, 有時程序莫名其妙的down了, 卻沒有任何的提示(有時候會提示core dumped). 這時候能夠查看一下有沒有形如core.進程號的文件生成, 這個文件即是操做系統把程序down掉時的內存內容扔出來生成的,它能夠作爲調試程序的參考.
    core dump又叫核心轉儲, 當程序運行過程當中發生異常, 程序異常退出時, 由操做系統把程序當前的內存情況存儲在一個core文件中, 叫core dump。如何使用core文件 gdb -c core文件路徑 [應用程序的路徑],進去後輸入where回車, 就能夠顯示程序在哪一行當掉的, 在哪一個函數中.
爲何沒有core文件生成呢? core文件的生成跟你當前系統的環境設置有關係, 能夠用下面的語句設置一下, 而後再運行程序便成生成core文件.
ulimit -c unlimited core文件生成的位置通常於運行程序的路徑相同, 文件名通常爲core.進程號

不用core文件,程序出了問題產生信號是否知道?答:內核向進程發信號嘛。

 

二、共享內存除了文件映射還有什麼方式?

共享內存對象映射。

兩者有什麼區別:

答:內存映射文件是由一個文件到一塊內存的映射,使應用程序能夠經過內存指針對磁盤上的文件進行訪問,其過程就如同對加載了文件的內存的訪問,所以內存文件映射很是適合於用來管理大文件。

 

三、請解釋下列10個shell命令的用途
top、ps、mv、find、df、cat、chmod、chgrp、grep、wc
top:命令是Linux下經常使用的性能分析工具,可以實時顯示系統中各個進程的資源佔用情況,相似於Windows的任務管理器。 
ps:查看進程 
mv:移動或者更改文件 
find:在子目錄中搜索匹配的文件 
df:linux中df命令參數功能:檢查文件系統的磁盤空間佔用狀況。

cat:把一個或多個文件內容顯示到標準輸出 

chmod:改變文件屬性 

chgrp:改變用戶分組 

grep:在文件內進行搜索 

wc:命令的功能爲統計指定文件中的字節數、字數、行數, 並將統計結果顯示輸出。

 

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

-rw-r--r--那個是權限符號,總共是- --- --- ---這幾個位。

第一個短橫處是文件類型識別符:-表示普通文件;c表示字符設備(character);b表示塊設備(block);d表示目錄 (directory);l表示連接文件(link);後面第一個三個連續的短橫是用戶權限位(User),第二個三個連續短橫是組權限位 (Group),第三個三個連續短橫是其餘權限位(Other)。每一個權限位有三個權限,r(讀權限),w(寫權限),x(執行權限)。若是每一個權限位都 有權限存在,那麼滿權限的狀況就是:-rwxrwxrwx;權限爲空的狀況就是- --- --- ---。

權限的設定能夠用chmod命令,其格式位:chmod ugoa+/-/=rwx filename/directory。例如:

一個文件aaa具備徹底空的權限- --- --- ---。

chmod u+rw aaa(給用戶權限位設置讀寫權限,其權限表示爲:- rw- --- ---)

chmod g+r aaa(給組設置權限爲可讀,其權限表示爲:- --- r-- ---)

chmod ugo+rw aaa(給用戶,組,其它用戶或組設置權限爲讀寫,權限表示爲:- rw- rw- rw-)

若是aaa具備滿權限- rwx rwx rwx。

chmod u-x aaa(去掉用戶可執行權限,權限表示爲:- rw- rwx rwx)

若是要給aaa賦予制定權限- rwx r-x r-x,命令爲:

chmod u=rwx,go=rx aaa

 
五、linux查詢命令
1:find / -name "文件名"    在目錄結構中搜索文件,並執行指定的操做。
 
2:grep
 
3:local 文件名  ---他是 'find -name' 的另外一種寫法,但要比後者快得多,緣由在於它不搜索具體目錄,而是搜索一個數據庫(/var/lib/locatedb),這個數據庫中含 有本地全部文件信息。Linux系統自動建立這個數據庫,而且天天自動更新一次,因此改命令查不到最新變更過的文件。爲了不這種狀況,能夠在使用locate以前,先使用updatedb命令,手動更新數據庫。
 
4. whereis ---是定位可執行文件、源代碼文件、幫助文件在文件系統中的位置。whereis命令只能用於程序名的搜索,並且只搜索二進制文件(參數-b)、man說明文件(參數-m)和源代碼文件(參數-s)。若是省略參數,則返回全部信息。
 
5:which  做用是在PATH變量指定的路徑中,搜索某個系統命令的位置,而且返回第一個搜索結果。也就是說,使用which命令,就能夠看到某個系統命令是否存在,以及執行的究竟是哪個位置的命令。

 -------------------服務器部分-------------------

 
一、Apache與Nginx的優缺點比較 
一、nginx相對於apache的優勢: 
輕量級,比apache 佔用更少的內存及資源。高度模塊化的設計,編寫模塊相對簡單 
抗併發,nginx 處理請求是異步非阻塞,多個鏈接(萬級別)能夠對應一個進程,而apache 則是阻塞型的,是同步多進程模型,一個鏈接對應一個進程,在高併發下nginx 能保持低資源低消耗高性能 
nginx處理靜態文件好,Nginx 靜態處理性能比 Apache 高 3倍以上 

二、apache 相對於nginx 的優勢: 
apache 的rewrite 比nginx 的rewrite 強大 ,模塊很是多,基本想到的均可以找到 ,比較穩定,少bug ,nginx 的bug 相對較多 
 
3:緣由:這得益於Nginx使用了最新的epoll(Linux 2.6內核)和kqueue(freebsd)網絡I/O模型,而Apache則使用的是傳統的select模型。目前Linux下可以承受高併發訪問的 Squid、Memcached都採用的是epoll網絡I/O模型。 處理大量的鏈接的讀寫,Apache所採用的select網絡I/O模型很是低效。
 
 
二、cgi 與fastcgi的區別

cgi在2000年或更早的時候用得比較多, 之前web服務器通常只處理靜態的請求,web服務器會根據此次請求的內容,而後會fork一個新進程來運行外部c程序 (或perl腳本...), 這個進程會把處理完的數據返回給web服務器,最後web服務器把內容發送給用戶,剛纔fork的進程也隨之退出。 若是下次用戶還請求改動態腳本,那麼web服務器又再次fork一個新進程,周而復始的進行。

後來出現了一種更高級的方式是, web服務器能夠內置perl解釋器或php解釋器。 也就是說這些解釋器作成模塊的方式,web服務器會在啓動的時候就啓動這些解釋器。 當有新的動態請求進來時,web服務器就是本身解析這些perl或php腳本,免得從新fork一個進程,效率提升了。

fastcgi的方式是,web服務器收到一個請求時,他不會從新fork一個進程(由於這個進程在web服務器啓動時就開啓了,並且不會退 出),web服務器直接把內容傳遞給這個進程(進程間通訊,但fastcgi使用了別的方式,tcp方式通訊),這個進程收到請求後進行處理,把結果返回 給web服務器,最後本身接着等待下一個請求的到來,而不是退出。 
fastcgi跟cgi的區別是:
                  在web服務器方面                                                         在對數據進行處理的進程方面
cgi         fork一個新的進程進行處理                                           讀取參數,處理數據,而後就結束生命期
fastcgi   用tcp方式跟遠程機子上的進程或本地進程創建鏈接       要開啓tcp端口,進入循環,等待數據的到來,處理數據


舉個例子: 服務端如今有個10萬個字單詞, 客戶每次會發來一個字符串,問以這個字符串爲前綴的單詞有多少個。 那麼能夠寫一個程序,這個程序會建一棵trie樹,而後每次用戶請求過來時能夠直接到這個trie去查找。 可是若是以cgi的方式的話,此次請求結束後這課trie也就沒了,等下次再啓動該進程時,又要新建一棵trie樹,這樣的效率就過低下了。   而用fastcgi的方式的話,這課trie樹在進程啓動時創建,之後就能夠直接在trie樹上查詢指定的前綴了。

 

三、select, poll和epoll的區別
select

select最先於1983年出如今4.2BSD中,它經過一個select()系統調用來監視多個文件描述符的數組,當select()返回後,該數組中就緒的文件描述符便會被內核修改標誌位,使得進程能夠得到這些文件描述符從而進行後續的讀寫操做。

select目前幾乎在全部的平臺上支持,其良好跨平臺支持也是它的一個優勢,事實上從如今看來,這也是它所剩很少的優勢之一。

select的一個缺點在於單個進程可以監視的文件描述符的數量存在最大限制,在Linux上通常爲1024,不過能夠經過修改宏定義甚至從新編譯內核的方式提高這一限制。

另外,select()所維護的存儲大量文件描述符的數據結構,隨着文件描述符數量的增大,其複製的開銷也線性增加。同時,因爲網絡響應時間的延遲 使得大量TCP鏈接處於非活躍狀態,但調用select()會對全部socket進行一次線性掃描,因此這也浪費了必定的開銷。

poll

poll在1986年誕生於System V Release 3,它和select在本質上沒有多大差異,可是poll沒有最大文件描述符數量的限制。 

poll和select一樣存在一個缺點就是,包含大量文件描述符的數組被總體複製於用戶態和內核的地址空間之間,而不論這些文件描述符是否就緒,它的開銷隨着文件描述符數量的增長而線性增大。 

另外,select()和poll()將就緒的文件描述符告訴進程後,若是進程沒有對其進行IO操做,那麼下次調用select()和poll() 的時候將再次報告這些文件描述符,因此它們通常不會丟失就緒的消息,這種方式稱爲水平觸發(Level Triggered)。

epoll

直到Linux2.6纔出現了由內核直接支持的實現方法,那就是epoll,它幾乎具有了以前所說的一切優勢,被公認爲Linux2.6下性能最好的多路I/O就緒通知方法。

epoll能夠同時支持水平觸發和邊緣觸發(Edge Triggered,只告訴進程哪些文件描述符剛剛變爲就緒狀態,它只說一遍,若是咱們沒有采起行動,那麼它將不會再次告知,這種方式稱爲邊緣觸發),理論上邊緣觸發的性能要更高一些,可是代碼實現至關複雜。

epoll一樣只告知那些就緒的文件描述符,並且當咱們調用epoll_wait()得到就緒文件描述符時,返回的不是實際的描述符,而是一個表明 就緒描述符數量的值,你只須要去epoll指定的一個數組中依次取得相應數量的文件描述符便可,這裏也使用了內存映射(mmap)技術,這樣便完全省掉了 這些文件描述符在系統調用時複製的開銷。

另外一個本質的改進在於epoll採用基於事件的就緒通知方式。在select/poll中,進程只有在調用必定的方法後,內核纔對全部監視的文件描 述符進行掃描,而epoll事先經過epoll_ctl()來註冊一個文件描述符,一旦基於某個文件描述符就緒時,內核會採用相似callback的回調 機制,迅速激活這個文件描述符,當進程調用epoll_wait()時便獲得通知。

 

四、Memcache和Redis區別

  1. Redis中,並非全部的數據都一直存儲在內存中的,這是和Memcached相比一個最大的區別。
  2. Redis在不少方面具有數據庫的特徵,或者說就是一個數據庫系統,而Memcached只是簡單的K/V緩存。
  3. 他們的擴展都須要作集羣;實現方式:master-slave、Hash。
  4. 在100k以上的數據中,Memcached性能要高於Redis。
  5. 若是要說內存使用效率,使用簡單的key-value存儲的話,Memcached的內存利用率更高,而若是Redis採用hash結構來作key-value存儲,因爲其組合式的壓縮,其內存利用率會高於Memcached。固然,這和你的應用場景和數據特性有關。
  6. 若是你對數據持久化和數據同步有所要求,那麼推薦你選擇Redis,由於這兩個特性Memcached都不具有。即便你只是但願在升級或者重啓系統後緩存數據不會丟失,選擇Redis也是明智的。
  7. Redis和Memcache在寫入性能上面差異不大,讀取性能上面尤爲是批量讀取性能上面Memcache更強
相關文章
相關標籤/搜索