從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)注收藏期待更新~~~
