來自一個北京phper菜雞的面試心得分享甘改,面試的高級職位旅东,文章均為個人觀點,不喜勿噴十艾。去年抵代、前年都有大批量面試,當(dāng)然今年也有一些忘嫉,小本本上記錄了自己上百家公司面試情況荤牍,得出的結(jié)果是堅持才會勝利,主要介紹面試環(huán)節(jié)部分榄融。
面試有兩種情況 1.在職参淫,2.不在職。在職的話可以挑選自己滿意的公司投遞簡歷愧杯,一般做技術(shù)的還是比較看重工作和技術(shù)氛圍涎才。不在職就需要薪資之類的范圍篩選然后海投了,各個平臺都有簡歷力九。拉勾耍铜、boss直聘、智聯(lián)跌前、51job棕兼、獵聘等等。個人覺得在職去面試還是相對較好的抵乓,一方面面試不需要太過緊張伴挚,另一方面是因為面試也是很累的靶衍。
下面開始正題
第一個環(huán)節(jié):簡歷
簡歷至關(guān)重要,簡歷是塊敲門磚茎芋,需要勾起hr和技術(shù)部門的好奇和認(rèn)可颅眶。能不能約到面試就看你拋的是什么了,而且面試都是基于簡歷來圍繞回答的田弥,所以你需要對你的簡歷特別熟悉涛酗,在公司的時間段,做了哪些事偷厦。不會寫的可以參考這篇知乎問答 -- 程序員簡歷該怎么寫
第二個環(huán)節(jié):面試
部分公司有可能會筆試商叹,但是答與不答看你自己。有的筆試好幾頁只泼,什么手寫算法剖笙、方法之類的我一般都會委婉的回避,跟對方說一會還有事能不能直接跟技術(shù)聊聊辜妓,一般對方不會拒絕的枯途。
再次聲明,你需要對簡歷的技能點很熟籍滴,不是很熟最起碼也要會用酪夷。不然最好別往上寫,否則那只會坑了你自己孽惰。一般來說都是圍繞著聊晚岭,可能會有一些擴(kuò)展和深度提問,也有可能問一些基礎(chǔ)問題和面試官公司所用技術(shù)點勋功。下面會說一些常用的技術(shù)點和回答坦报,大部分答案來自google查找。
技術(shù)點有trait yield spl composer 閉包 框架 魔術(shù)方法 函數(shù)(字符串 數(shù)組 時間 數(shù)據(jù)庫)等等狂鞋。
1.file_get_contents和curl區(qū)別
curl支持很多協(xié)議片择,有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDAP,也就是說骚揍,它能做到很多file_get_content做不到的事情字管。curl在php可以實現(xiàn)遠(yuǎn)程獲取和采集內(nèi)容;實現(xiàn)PHP網(wǎng)頁版的FTP上傳下載信不;實現(xiàn)模擬登陸嘲叔;實現(xiàn)接口對接,數(shù)據(jù)傳輸抽活;實現(xiàn)模擬Cookie硫戈;下載文件斷點續(xù)傳等等,最重要的一點是curl支持超時設(shè)置
2.PHP中傳值與引用傳值的區(qū)別
按值傳遞:函數(shù)范圍內(nèi)對值的任何改變在函數(shù)外部都會被忽略
按引用傳遞:函數(shù)范圍內(nèi)對值的任何改變在函數(shù)外部也能反映出這些修改
優(yōu)缺點:按值傳遞時,php必須復(fù)制值下硕。特別是對于大型的字符串和對象來說丁逝,這將會是一個代價很大的操作汁胆。按引用傳遞則不需要復(fù)制值,對于性能提高很有好處霜幼。
3.session和cookie區(qū)別
存儲位置:session存儲于服務(wù)器沦泌,cookie存儲于瀏覽器
安全性:session安全性比cookie高
session為‘會話服務(wù)’,在使用時需要開啟服務(wù)辛掠,cookie不需要開啟,可以直接用
4.include和require的區(qū)別
require是無條件包含释牺,也就是如果一個流程里加入require萝衩,無論條件成立與否都會先執(zhí)行require,當(dāng)文件不存在或者無法打開的時候没咙,會提示錯誤猩谊,并且會終止程序執(zhí)行
include有返回值,而require沒有(可能因為如此require的速度比include快)祭刚,如果被包含的文件不存在的話牌捷,那么會提示一個錯誤,但是程序會繼續(xù)執(zhí)行下去
5.抽象類和接口區(qū)別
接口是抽象類的變體涡驮,接口中所有的方法都是抽象的暗甥。而抽象類是聲明方法的存在而不去實現(xiàn)它的類。
接口可以多繼承捉捅,抽象類不行.
接口定義方法撤防,不能實現(xiàn),而抽象類可以實現(xiàn)部分方法棒口。
接口中基本數(shù)據(jù)類型為static 而抽類象不是的寄月。
6.什么是面向?qū)ο?/h4>
面向?qū)ο笫且环N編程思想,它利于提高程序的重用性无牵,使程序結(jié)構(gòu)更加清晰漾肮。主要特征:封裝、繼承茎毁、多態(tài)克懊。
7.對mvc的認(rèn)識
由模型M、視圖V充岛、控制器C完成的應(yīng)用程序保檐,由模型發(fā)出要實現(xiàn)的功能到控制器,控制器接收組織功能傳遞給視圖崔梗。mvc是一種軟件架構(gòu)夜只,優(yōu)點是:可以實現(xiàn)代碼的重用性,避免產(chǎn)生代碼冗余蒜魄;M和V的實現(xiàn)代碼分離扔亥,從而使同一個程序可以使用不同的表現(xiàn)形式
8.大流量網(wǎng)站如何解決訪問量問題
確認(rèn)服務(wù)器硬件是否能夠支持當(dāng)前的流量
數(shù)據(jù)庫讀寫分離场躯,優(yōu)化數(shù)據(jù)表
程序功能規(guī)則,禁止外部的盜鏈
控制大文件的下載
使用流量分析統(tǒng)計軟件
使用不同主機(jī)分流主要流量
盡量使用靜態(tài)頁旅挤,緩存
9.什么是SQL注入踢关?
SQL注入攻擊是黑客對數(shù)據(jù)庫進(jìn)行攻擊的常用手段之一。一部分程序員在編寫代碼的時候粘茄,沒有對用戶輸入數(shù)據(jù)的合法性進(jìn)行判斷签舞,注入者可以在表單中輸入一段數(shù)據(jù)庫查詢代碼并提交,程序?qū)⑻峤坏男畔⑵礈惿梢粋€完整sql語句柒瓣,服務(wù)器被欺騙而執(zhí)行該條惡意的SQL命令儒搭。注入者根據(jù)程序返回的結(jié)果,成功獲取一些敏感數(shù)據(jù)芙贫,甚至控制整個服務(wù)器搂鲫。
10.如何防止SQL注入
1.開啟PHP安全模式Safe_mode=on;
2.打開magic_quotes_gpc來防止SQL注入,Magic_quotes_gpc=off;默認(rèn)是關(guān)閉的磺平,它打開后將自動把用戶提交的sql語句的查詢進(jìn)行轉(zhuǎn)換魂仍,把'轉(zhuǎn)為\',這對防止sql注入有重大作用拣挪。因此開啟:magic_quotes_gpc=on;
控制錯誤信息擦酌,關(guān)閉sql錯誤提示信息,將錯誤信息寫到系統(tǒng)日志媒吗。
3.使用mysqli或pdo預(yù)處理仑氛。
11.數(shù)據(jù)庫的常用存儲引擎以及它們的區(qū)別
MyISAM:不支持事務(wù),表鎖闸英,易產(chǎn)生碎片锯岖,要經(jīng)常優(yōu)化,讀寫速度較快甫何,支持全文索引出吹。
InnoDB:支持事務(wù),行鎖辙喂,有崩潰恢復(fù)能力捶牢。讀寫速度比MyISAM慢,5.6之后支持全文索引巍耗。
存儲引擎是基于表的秋麸,而不是數(shù)據(jù)庫
12.數(shù)據(jù)庫優(yōu)化
選取最適用的字段屬性,盡可能減少定義字段寬度炬太,盡量把字段設(shè)置NOTNULL灸蟆,例如'省份'、'性別'最好適用ENUM
使用連接(JOIN)來代替子查詢
適用聯(lián)合(UNION)來代替手動創(chuàng)建的臨時表
事務(wù)處理
鎖定表亲族、優(yōu)化事務(wù)處理
適用外鍵炒考,優(yōu)化鎖定表
建立索引
優(yōu)化查詢語句
13.Mysql的讀寫分離如何實現(xiàn)
讀寫分離的實現(xiàn)原理就是在執(zhí)行SQL語句的時候可缚,判斷到底是讀操作還是寫操作,把讀的操作轉(zhuǎn)向到讀服務(wù)器上(從服務(wù)器斋枢,一般是多臺)帘靡,寫的操作轉(zhuǎn)到寫的服務(wù)器上(主服務(wù)器,一般是一臺瓤帚,視數(shù)據(jù)量來看)描姚。當(dāng)然為了保證多臺數(shù)據(jù)庫數(shù)據(jù)的一致性,需要主從復(fù)制戈次。
14.常見的HTTP狀態(tài)碼
200 - 請求成功
301 - 重定向到其他URL
404 - 請求的資源(網(wǎng)頁等)不存在
505 - 內(nèi)部服務(wù)器錯誤
15.什么是靜態(tài)化和偽靜態(tài)
1轰胁、 靜態(tài)化指的是頁面靜態(tài)化,也即生成實實在在的靜態(tài)文件朝扼,也即不需要查詢數(shù)據(jù)庫就可以直接從文件中獲取數(shù)據(jù),指的是真靜態(tài)霎肯。
實現(xiàn)方式主要有兩種:一種是我們在添加信息入庫的時候就生成的靜態(tài)文件擎颖,也稱為模板替換技術(shù)。另一種是用戶在訪問我們的頁面時先判斷是否有對應(yīng)的緩存文件存在观游,如果存在就讀緩存搂捧,不存在就讀數(shù)據(jù)庫,同時生成緩存文件懂缕。
2允跑、偽靜態(tài)不是真正意義上的靜態(tài)化,之所以使用偽靜態(tài)搪柑,主要是為了SEO推廣聋丝,搜索引擎對動態(tài)的文件獲取難度大,不利于網(wǎng)站的推廣工碾。實習(xí)原理是基于Apache或Nginx的rewrite機(jī)智
主要有兩種方式:一種是直接在配置虛擬機(jī)的位置配置偽靜態(tài)弱睦,這個每次修改完成后需要重啟web服務(wù)器。另一種采用分布式的渊额,可以在網(wǎng)站的根目錄上創(chuàng)建.htaccess的文件况木,在里面配置相應(yīng)的重寫規(guī)則來實現(xiàn)偽靜態(tài),這種每次重寫時不需要重啟web服務(wù)器旬迹,且結(jié)構(gòu)上比較清晰火惊。
16.redis和memache的區(qū)別
總結(jié)一:
1.數(shù)據(jù)類型
Redis數(shù)據(jù)類型豐富,支持set list等類型
memcache支持簡單k/v數(shù)據(jù)類型奔垦,需要客戶端自己處理復(fù)雜對象
2.持久性
redis支持?jǐn)?shù)據(jù)落地持久化存儲
memcache不支持?jǐn)?shù)據(jù)持久存儲
3.分布式存儲
redis支持master-slave復(fù)制模式
memcache可以使用一致性hash做分布式
value大小不同
memcache是一個內(nèi)存緩存屹耐,key的長度小于250字符,單個item存儲要小于1M宴倍,不適合虛擬機(jī)使用
4.數(shù)據(jù)一致性不同
redis使用的是單線程模型张症,保證了數(shù)據(jù)按順序提交仓技。
memcache需要使用cas保證數(shù)據(jù)一致性。CAS(Check and Set)是一個確保并發(fā)一致性的機(jī)制俗他,屬于“樂觀鎖”范疇脖捻;原理很簡單:拿版本號,操作兆衅,對比版本號地沮,如果一致就操作,不一致就放棄任何操作
5.cpu利用
redis單線程模型只能使用一個cpu羡亩,可以開啟多個redis進(jìn)程
總結(jié)二:
1.Redis中摩疑,并不是所有的數(shù)據(jù)都一直存儲在內(nèi)存中的,這是和Memcached相比一個最大的區(qū)別畏铆。
2.Redis不僅僅支持簡單的k/v類型的數(shù)據(jù)雷袋,同時還提供list,set辞居,hash等數(shù)據(jù)結(jié)構(gòu)的存儲楷怒。
3.Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份瓦灶。
4.Redis支持?jǐn)?shù)據(jù)的持久化鸠删,可以將內(nèi)存中的數(shù)據(jù)保持在磁盤中,重啟的時候可以再次加載進(jìn)行使用贼陶。
我個人認(rèn)為最本質(zhì)的不同是Redis在很多方面具備數(shù)據(jù)庫的特征刃泡,或者說就是一個數(shù)據(jù)庫系統(tǒng),而Memcached只是簡單的K/V緩存
總結(jié)三:
redis和memecache的不同在于:
1碉怔、存儲方式:
memecache 把數(shù)據(jù)全部存在內(nèi)存之中烘贴,斷電后會掛掉,數(shù)據(jù)不能超過內(nèi)存大小
redis有部份存在硬盤上撮胧,這樣能保證數(shù)據(jù)的持久性庙楚。
2、數(shù)據(jù)支持類型:
redis在數(shù)據(jù)支持上要比memecache多的多趴樱。
3馒闷、使用底層模型不同:
新版本的redis直接自己構(gòu)建了VM 機(jī)制 ,因為一般的系統(tǒng)調(diào)用系統(tǒng)函數(shù)的話叁征,會浪費一定的時間去移動和請求纳账。
4、運(yùn)行環(huán)境不同:
redis目前官方只支持Linux 上去行捺疼,從而省去了對于其它系統(tǒng)的支持疏虫,這樣的話可以更好的把精力用于本系統(tǒng) 環(huán)境上的優(yōu)化,雖然后來微軟有一個小組為其寫了補(bǔ)丁。但是沒有放到主干上
memcache只能當(dāng)做緩存卧秘,cache
redis的內(nèi)容是可以落地的呢袱,就是說跟MongoDB有些類似,然后redis也可以作為緩存翅敌,并且可以設(shè)置master-slave
php概率算法
function get_rand($proArr) {
? ? $result = '';
? ? //概率數(shù)組的總概率精度
? ? $proSum = array_sum($proArr);
? ? //概率數(shù)組循環(huán)
? ? foreach ($proArr as $key => $proCur) {
? ? ? ? $randNum = mt_rand(1, $proSum);
? ? ? ? if ($randNum <= $proCur) {
? ? ? ? ? ? $result = $key;
? ? ? ? ? ? break;
? ? ? ? } else {
? ? ? ? ? ? $proSum -= $proCur;
? ? ? ? }
? ? }
? ? unset ($proArr);
? ? return $result;
}
$prize_arr =array('a'=>20, 'c'=>80);
二分查找
function binary(&$arr,$low,$top,$target){
? ? while($low <= $top){
//由于php取商是有小數(shù)的羞福,所以向下取整,不過也可不加蚯涮,數(shù)組也會取整
? ? ? ? $mid = floor(($low+$top)/2);
? ? ? ? if($arr[$mid]==$target){
? ? ? ? ? ? return $mid;
? ? ? ? }elseif($arr[$mid]<$target){
? ? ? ? ? ? $low = $mid+1;? ? ? ? ? ? ? ?
? ? ? ? }else{
? ? ? ? ? ? $top = $mid-1;
? ? ? ? }
? ? }
? ? return -1;
}
$arr = array(1,3,9,23,54);
echo binary($arr, 0, sizeof($arr), 1);
冒泡排序
function fun($arr){
$len = count($arr);
for($i=1;$i<$len;$i++){
for($j=0;$j<($len-$i);$j++){
if($arr[$j] > $arr[$j+1]){
$tmp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $tmp;
}
}
}
return $arr;
}
遍歷文件夾下所有文件
function my_scandir($dir)
{
$files = array();
if($handle = opendir($dir)) {
while (($file = readdir($handle))!== false) {
if($file != '..' && $file != '.') {
if(is_dir($dir."/".$file)) {
$files[$file]=my_scandir($dir."/".$file);
} else {
$files[] = $file;
}
}
}
closedir($handle);
return $files;
}
}
關(guān)于面試先寫到這吧治专,還有很多運(yùn)氣和實力在里面呢,希望大家都能找到心儀的工作遭顶。后續(xù)也會寫一些類似的文章张峰,喜歡的點個贊,支持一下棒旗。在這里拜謝了