一個 16年畢業生所經歷的 PHP 面試

OMGZui發表於2017-11-21

前言:有收穫的話請加顆小星星,沒有收穫的話可以 反對 沒有幫助 舉報三連

有心的同學應該會看到我這個noteBook下面的其它知識,希望對你們有些許幫助。

本文地址

時間點:2017-11

一、什麼是面試

說到面試,還是先說你為什麼要離職,

關鍵字:成長、發展、委屈、領導、錢(工資)突發感想是不是可以抓取下然後分析關鍵字,哈哈哈

還有

還想看嗎

我的理解:面試不是高考,高考只有一次(不說補習),面試可以有n次,只要有面試機會,你就可以一直去面,面到吐為止都沒關係,不要怕失敗,
公司沒選擇你不是你不優秀,而是你不符合他們的要求,回家思考下面試不足的地方,調整下心態,準備下個面試才是你正確的做法。

二、面試準備

準備是多方面的,俗話說:成功只留給有準備的人

1. 問:什麼時候開始準備?

你是牛人嗎 ? 不用準備,等獵頭挖 : 老老實實的隨時準備好

2. 問:怎麼準備?

  • 專案經驗是一部分:面試是離不開的,充分理解自己所做的那部分,能在面試中清楚的表述出自己做了什麼,充當什麼樣的角色
  • 自己分享知識的地方:比如部落格/github,自己總結的會比去看別人的總結效果好不只一丁半點
  • 基礎知識:字串操作、陣列操作、檔案操作、正則操作
  • 進階知識:物件導向、資料結構和演算法、設計模式、mysql索引、mysql引擎、mysql事務、mysql鎖
  • 高階知識:linux+nginx+mysql+php+redis 優化,只會操作沒用,誰都會,高併發、分散式系統、負載均衡、分庫分表、訊息佇列

三、面試乾貨

1、某教育機構兩面

mysql事務是什麼

我說了mysql的四個特性,原子性、一致性、隔離性、永續性,事務可以理解成一次操作要不完成要不失敗。
面試官問了隔離性和鎖的問題,有點忘了,這個真沒答上來
-------------
可以參考下《Innodb中的事務隔離級別和鎖的關係》https://tech.meituan.com/2014/08/20/innodb-lock.html

php程式碼解釋過程

我說了通過zend引擎解析成opcode,然後轉化成機器識別的程式碼。
平時確實沒有去關注這個,失敗失敗,查了資料
鳥哥寫的《深入理解PHP原理之Opcodes》http://www.laruence.com/2008/06/18/221.html

百度統計的實現原理

我沒答上來,自己後面查的
-------------
參考:http://blog.csdn.net/iqzq123/article/details/8877645

如何共享session

我說了通過redis儲存session,以達到共享目的,後面查了下方案,還挺多的
-------------
參考:http://www.cnblogs.com/wangtao_20/p/3395518.html#commentform

git分支管理策略

我寫了master作為主分支,dev作為開發分支,bug_fix分支作為bug分支
面試官說有個臨時bug需要改,而我們在dev上已經開發了很多內容了,我答的是用bug_fix分支拉master程式碼,
再合回去,面試官說dev怎麼辦,改了相同的模組會衝突想了下,確實會,然後求教面試官,
面試官說可以用git rebase變基實現,自己見過這個命令,但是沒用過,尷尬

restful設計

我說了get、post、put、patch、delete,面試官問他們分別怎麼用,畢竟自己做api的
就回答了get是從伺服器取資源、post是新建資源、put是
更新完整資源、patch更新部分資源、delete是刪除資源,就過了

附加題:論壇的表設計

有點忘了,我答的不是很好,問的是有以下幾個需求,請問需要建幾張表,為什麼?主要考的如何合理的設計表,
比如使用者登入資訊表可以怎樣設計?發帖表和回帖表需要怎樣設計?內容欄位比較大,怎樣設計更好?哪些欄位需要加索引?

情景題:一個登入系統的改進

用虛擬碼實現
第一步:PC端只有兩個表單框和註冊按鈕,後端接收引數,再存入資料庫
第二步:新增移動端,需要傳送簡訊
第三步:加入第三方登陸方式,需要傳送郵件
第四步:有個兄弟公司,給了我們一張execl表,裡面是使用者資訊,需要後臺註冊這些使用者,如何修改現有的程式碼
第四步:有點忘了,好像是如何進一步優化

這裡第三步就答不好了,考察的是邏輯能力和程式碼組織能力,設計模式的重要性。

自己最滿意的程式碼

自己自由發揮,專案中遇到的應該是最好答的

瞭解哪些設計模式,實際用例

我的回答
工廠模式:定義一個標準,用到的類可以按這個標準實現相應功能
單例模式:防止重複例項化,減少資源呼叫
資料對映:資料庫ORM應用
介面卡模式:相容老資料,多型的應用

面試管問了怎麼相容老資料,考察codereview能力

困了,先到這裡


2、某電商公司三人面

筆試題挺有意思的,比較能考察出我這樣的面試者水平

筆試題的解法見php7.php檔案中的24、25、26

將一個二維陣列的值首字母大寫

題目意思大概是這樣的,印象不深很清了
當時做的時候好像做錯了,現在想了下,思路是獲取鍵值和值,然後雙重迴圈轉大寫即可。

使用正則獲取html裡的href屬性的值和a標籤內的值,並以href值為key,a標籤內的值為value存入二維陣列中

大概是這樣的結構,我簡化了

<ul class="attr">
    <li>
        <a href="www.baidu.com">百度baidu</a>
        <a href='www.tecent.com'>騰訊tengxun</a>
        <a href="www.alibaba.com">阿里巴巴alibaba</a>
    </li>
</ul>

考察正規表示式的運用和陣列的拼裝,我當時做的稀爛,回去稍微看了下正則,就很容易了。

優化語句查詢

test表中資料有500w,欄位有id/t_id/type_id/plat_id,語句為select max(t_id) from test where type_id=1 and plat_id=1

考察mysql語句優化,這裡主要是優化max函式,max函式會導致全表掃描,效率會很低,可以使用order by加limit進行優化

我是這樣答的
select t_id from test where type_id=1 and plat_id=1 order by t_id limit 1;
當然還可以使用加索引進一步優化速度,這裡可以加上(type_id/plat_id)聯合索引。
-------------
正確做法是給`t_id`加索引,還有(type_id/plat_id)聯合索引,order by 並不能避免全表掃描。

找出N個數中的第M大的數

考察演算法,貌似是查詢?
我當時的想法是先對陣列排序,然後索引的N-M的數就是M大的數

Ajax跨域請求時,會出現什麼問題?如何解決

我的回答:稀爛,跨域出現問題會出現請求拒絕,是出於安全起見,設定Access-Control-Allow-Origin為*即可。哈哈哈naive
-------------
回去搜了下,方案還挺多的。
參考https://dailc.github.io/2017/03/22/ajaxCrossDomainSolution.html

如何優化一個CPU運算密集的網站

沒有實踐過對吧,沒關係,會google嗎?會背嗎?腦子能留個大概的原理嗎?

自己最滿意的 程式碼

自己自由發揮,專案中遇到的應該是最好答的

其它

簡歷上的專案詢問,專案中最有難度的地方?如何解決的?

困了,睡


3、某民宿杭州分公司一面

沒有筆試題,純面試題,很注重基礎,比如作業系統

phpunit的用法

自己平時沒注意這個東西,所以答的稀爛,問到有沒有連資料庫測,我說有,只是用預期資料與資料庫查出的資料對比測試
面試官問有沒有用過mock
懵逼了,這個概念確實聽過,沒去做過,意思是造假的意思,通過模擬資料庫操作來達到測試目的,還有stub站樁,需要多實踐啊騷年 o_o
-------------
參考:https://phpunit.de/manual/current/zh_cn/test-doubles.html

redis非同步佇列實現細節

看我簡歷中寫用過

我當時用的是laravel中的佇列機制,通過dispatch()觸發任務,php artisan queue:work 開啟後臺程式監視佇列並完成任務
面試官不滿足,問我他的原理,怎樣實現的?
我說用的是list,通過觸發lpush入隊,然後依次rpop出隊處理任務
面試官說這是阻塞的,能不能有高效的做法,我說不清楚,面試官好像說可以把一個list的資料放到多個list中並行處理,zzz。

redis中zest如何根據兩個屬性排序,比如id和age

不知道,只知道根據score分值排序,有知道的同學可以留言
請自行google   redis zset 多欄位排序
-------------
查了下,有說先自行排序後存入redis
https://segmentfault.com/q/1010000004669705

你對多程式和多執行緒還有協程的理解

作為cs專業的phper,大學學的都交給老師了,zzz

程式可以有多個執行緒,在php中yield可以實現協程,面試官問swoole新版本中自帶協程,你怎麼理解?
沒研究過zzz
-------------
程式是正在執行的程式的例項
程式是核心分配資源的最基本的單元
執行緒是核心執行的最基本的單元
程式內可以包含多個執行緒
協程的話相當於語言自己實現一個函式排程
參考:http://www.cnblogs.com/lxmhhy/p/6041001.html

說說怎麼理解現在前端框架中的元件化和模組化

看到我會react.js問的

我說就比如react裡的元件可以理解為一個class類,模組的意思是一個檔案就是一個模組,有單獨的作用域
-------------
參考:http://xiaodongtongxue.top/2016/05/20/淺談前端自動化%20工程化%20元件化%20模組化/

http協議中get和post的區別,怎麼實現的

get是獲取資源,post建立資源
get資料長度有限制,post無限制
get資料在url中安全性差,post不顯示在url中更安全
怎麼實現的,懵逼zzz
-------------
參考:https://zhuanlan.zhihu.com/p/22536382

最近在看什麼書

送命題,沒看過就老實說沒看過好了,不然會xxxx,比如我說了看了《圖解HTTP》,首先問了我上面那道題,然後說你看的書不夠深入,我。。。。

4、某眾籌杭州分公司三面

php使用什麼mysql連線?

還以為很簡單呢,直接說了mysqli和pdo,mysql棄用了
面試官來了句不是問這個,是問連線池
我對這個概念很懵,就回了是持久連線嗎,可以用mysql_connect()
面試官再問比如laravel預設使用什麼mysql連線的
我猜的是pdo吧
他說再想想
我xxxx,就這樣過了
-------------
回去很鬱悶的查了下,預設PDO,我還以為是想考察關於php編譯時mysqlnd這樣的呢
All database work in Laravel is done through the PHP PDO facilities
so make sure you have the driver for your particular database of
choice installed on your machine before you begin development.

場景題:索引的建立規則和explain

有這樣一張表 自增id、名字、暱稱、年齡、客戶型別、建立時間

哪些欄位需要建立索引?為什麼?

我說年齡、建立時間、客戶型別需要建立索引,where條件經常用到的欄位
面試官說客戶型別用的enum列舉呢,是不是也需要建立索引
我說不清楚
面試官說其實是不需要的,列舉型別只有幾種,mysql查詢時會分組查,一般寫sql前可以用explain觀察sql語句

你用的是php版本是哪個?為什麼?php7有什麼更新?

很幸運,自己一直用的是php7,因為php7速度有很大提升,也有很多新特性,比如標量型別宣告、返回型別宣告
名稱空間、Trait、自動載入都是現代php所需要的
面試官問有自己發不過composer包嗎?他的自動載入原理是怎麼樣的?
自己建立過composer包,沒釋出,自動載入是通過sql_autoload_register()實現的
面試官說之前都是include引入的對吧,你應該在往前想下
我xxxx
面試官說是當這個檔案使用的時候,才會載入進來,以達到自動載入目的。

nginx相關

簡歷寫了瞭解nginx負載均衡和反向代理,你是怎麼做的

php-fpm能代理其他埠嗎?除了預設9000

nginx配置php-fpm的時候走的是什麼協議?還可以走其他協議嗎?

自己搭建的vps,負載均衡是通過多個埠實現的,反向代理是代理到apache
可以走其他埠,需要配置ini檔案,走的http協議,其它協議,不知道
面試官說可以走tcp協議,比如socket

看你用過laravel和tp,比較下兩款框架

tp是國人寫的,理念比較陳舊過時
laravel是現在最火的php框架,開源社群活躍,工具也最多,運用了物件導向的思想和很多設計模式,是值得學習和運用的選擇
laravel的原始碼看過嗎?
看過,laravel的container容器,還有ioc控制反轉、di依賴注入,通過server provider服務提供者bind繫結例項放入到容器內,
然後通過make解析容器中的某個例項,可以通過facade門面直接靜態呼叫。
面試官說怎麼相容之前的版本,比如像app那樣,既釋出了新的版本,老版本也需要相容。
我沒做過,我的想法是一通過介面卡模式,達到相容兩者的需求,二可以使用dingo/api多版本控制

你未來的發展規劃,1年的,3年的

自由發揮,其實也蠻重要的,往積極方面答總沒錯,比如深入php、擴充套件技術棧

其他

簡歷上的專案詢問,專案中最有難度的地方?如何解決的?

5、某旅遊公司兩面

套路真多,這面試官很有代入感

為什麼離職

機智點,按你填表裡寫的離職理由答就行,別露餡了,哈哈哈。

如何選擇PHP的?關於目前流行的Java比較?

這裡機智點答就行,比較的話講兩者的使用場景,比如php適合web開發,java有多種選擇,web和安卓

有沒有系統的培訓過?有沒有看php相關的網路課程和書籍?

我以為是說我有沒有去培訓過,我當然說沒了
我說的是慕課網的優秀課程和《Modern PHP》《PHP核心技術和最佳實踐》《PHP the right way》

看你用過laravel和tp, 比較下兩款框架

tp是國人寫的,理念比較陳舊過時
laravel是現在最火的php框架,開源社群活躍,工具也最多,運用了物件導向的思想和很多設計模式,是值得學習和運用的選擇
laravel的原始碼看過嗎?
看過,laravel的container容器,還有ioc控制反轉、di依賴注入,通過server provider服務提供者bind繫結例項放入到容器內,
然後通過make解析容器中的某個例項,可以通過facade門面直接靜態呼叫。

php基礎知識**

php物件導向說下
封裝、繼承、多型
多型描述下
當時這裡說成了過載了,真是扇自己一巴掌,其實多型是一套介面下面的實現類,注入的是介面類,使用的是實現類,從而實現多型
php的型別有哪些
還真的忘了,掌嘴,沒說完整,說了array陣列、string字串、object物件、resource資源、NULL

laravel包**

dingo/api和jwt-auth是自己搭的嗎?有沒有遇到坑?
當時專案趕,用的整合的,自己搭也是沒問題的
entrust怎麼用的?有哪些表?
user使用者表、role角色表、perm許可權表、role-user使用者角色關聯表、role-perm角色許可權關聯表
我們還做了擴充套件,menu選單表、menu-perm選單許可權關聯表

你未來的發展規劃, 1年的,3年的

自由發揮,其實也蠻重要的,往積極方面答總沒錯,比如深入php、擴充套件技術棧

你可以問我兩個問題?

當場黑人問號,為什麼是兩個問題?
面試官:我想看你的關注點
我說了這邊技術團隊是怎樣的+有沒有技術分享+我加入公司將做什麼
別問我為什麼問了三個,因為我get到了面試官的點,哈哈哈

其 他

簡歷上的專案詢問,為什麼離職,之前收穫了什麼,你期待的公司是怎樣的etc
為什麼說套路呢,不然發現這個面試官所有準備的題都是有針對性的,後面他就指出我的基礎不夠紮實,並舉例說一個基礎紮實的人和
一個基礎不紮實的人做同一個東西,基礎紮實的可能很快就會做完且不會出錯,而不紮實的老是需要google且做出的東西會出錯,
也不知道哪裡錯了,因為是拿來主義並沒有轉為自己的東西。然後指出我沒有系統學習過php,因為php容易入門,
但是學會它需要花很大功夫。最後說我的規劃還不錯,是加分項,哈哈哈。

四、面試總結

面了5家公司,拿了3份offer,自我感覺還良好吧,哈哈哈。最主要的還是心態、面試準備、面試總結、睡眠質量、水

寫的挺流水化的,很多都有點遺忘,畢竟2星期後了,只能記住有意義的題目了。

有心的同學應該會看到我這個noteBook下面的其它知識,希望對你們有些許幫助。

後語:有收穫的話請加顆小星星,沒有收穫的話可以 反對 沒有幫助 舉報三連

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章