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

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

有心的同窗應該會看到我這個noteBook下面的其它知識,但願對大家有些許幫助。html

本文地址前端

時間點:2017-11java

<!-- TOC -->mysql

<!-- /TOC -->

1、什麼是面試

說到面試,仍是先說你爲何要離職,

關鍵字:成長、發展、委屈、領導、錢(工資)突發感想是否是能夠抓取下而後分析關鍵字,哈哈哈

還有

還想看嗎

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

2、面試準備

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

1. 問:何時開始準備?

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

2. 問:怎麼準備?

  • 項目經驗是一部分:面試是離不開的,充分理解本身所作的那部分,能在面試中清楚的表述出本身作了什麼,充當什麼樣的角色
  • 本身分享知識的地方:好比博客/github,本身總結的會比去看別人的總結效果好不僅一丁半點
  • 基礎知識:字符串操做、數組操做、文件操做、正則操做
  • 進階知識:面向對象、數據結構和算法、設計模式、mysql索引、mysql引擎、mysql事務、mysql鎖
  • 高階知識:linux+nginx+mysql+php+redis 優化,只會操做沒用,誰都會,高併發、分佈式系統、負載均衡、分庫分表、消息隊列

3、面試乾貨

一、某教育機構兩面

mysql事務是什麼

我說了mysql的四個特性,原子性、一致性、隔離性、持久性,事務能夠理解成一次操做要不完成要不失敗。
面試官問了隔離性和鎖的問題,有點忘了,這個真沒答上來
-------------
能夠參考下《Innodb中的事務隔離級別和鎖的關係》https://tech.meituan.com/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能力

困了,先到這裏


二、某電商公司三人面

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

筆試題的解法見php7.php文件中的2四、2五、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嗎?會背嗎?腦子能留個大概的原理嗎?

本身最滿意的 代碼

本身自由發揮,項目中遇到的應該是最好答的

其它

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

困了,睡


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

沒有筆試題,純面試題,很注重基礎,好比操做系統

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》,首先問了我上面那道題,而後說你看的書不夠深刻,我。。。。

四、某衆籌杭州分公司三面

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、擴展技術棧

其餘

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

五、某旅遊公司兩面

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

爲何離職

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

如何選擇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容易入門,
可是學會它須要花很大功夫。最後說個人規劃還不錯,是加分項,哈哈哈。

4、面試總結

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

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

有心的同窗應該會看到我這個noteBook下面的其它知識,但願對大家有些許幫助。

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

相關文章
相關標籤/搜索