PHP 面試問哪些問題可以比較準確的反映出應聘者的開發水平?
不要泛泛而談的。
不清楚是什麼原因,面試了好多人,有經驗淺的,也有工作十幾年的,但沒有遇到一個能把下邊的基礎題回答好的.
我都很奇怪,他們寫代碼的時候都不考慮數據驗證,SQL注入,XSS的問題嗎???
這樣的代碼是怎麼敢放到線上的?
迫不得已,又出了一套筆試題,面向1-5年工作經驗的PHPer,分享給大家.
這套題共7個問題,前5題面向3年以內工作經驗的,第6題期望3年以上的能做出來,第7題期望5年以上的能做出來.
1.
寫一個php腳本,抓取頁面http://php.net/manual/en/langref.php右側的目錄列表.運行此腳本期望得到如下輸出:
[2016-12-17 13:44:30] fetching http://php.net/manual/en/langref.php
[2016-12-17 13:44:31] parsing start
[2016-12-17 13:44:32] the right side list is:
PHP Manual (http://php.net/manual/en/index.php)
Copyright (http://php.net/manual/en/copyright.php)
PHP Manual (http://php.net/manual/en/manual.php)
Getting Started (http://php.net/manual/en/getting-started.php)
Installation and Configuration (http://php.net/manual/en/install.php)
Language Reference (http://php.net/manual/en/langref.php)
Security (http://php.net/manual/en/security.php)
Features (http://php.net/manual/en/Features)
Function Reference (http://php.net/manual/en/funcref.php)
PHP at the Core: A Hacker"s Guide (http://php.net/manual/en/internals2.php)
FAQ (http://php.net/manual/en/faq.php)
Appendices (http://php.net/manual/en/appendices.php)
[2016-12-17 13:44:33] parsing end
[2016-12-17 13:44:34] saving to file langref.txt
[2016-12-17 13:44:35] saved
2.
創建一個資料庫php_manual,新建表index,這個表有3個欄位: id, title, link.
然後創建一個資料庫用戶php_manual_user,密碼是php_manual_pass.
把上述資料庫導出成sql,把SQL語句貼到下面,使得我們在mysql命令行終端里執行這些sql語句可以完成上述操作.
3.
寫一個php腳本,讀取第1題的結果langref.txt並解析出title和link,插入第2題創建的資料庫表index里.
4.
使用jQuery寫一個function來解析langref.php右側的目錄列表,運行這個function返回如下一個object.
{
"Copyright": "http://php.net/manual/en/copyright.php",
"PHP Manual": "http://php.net/manual/en/manual.php",
"Getting Started": "http://php.net/manual/en/getting-started.php",
"Installation and Configuration": "http://php.net/manual/en/install.php",
"Language Reference": "http://php.net/manual/en/langref.php",
"Security": "http://php.net/manual/en/security.php",
"Features": "http://php.net/manual/en/Features",
"Function Reference": "http://php.net/manual/en/funcref.php",
"PHP at the Core: A Hacker"s Guide": "http://php.net/manual/en/internals2.php",
"FAQ": "http://php.net/manual/en/faq.php",
"Appendices": "http://php.net/manual/en/appendices.php"
}
5.
寫一條shell命令,執行此命令可獲取到http://php.net/manual/en/langref.php的內容並將頁面里的所有大寫的PHP轉成小寫,最後將結果保存到/tmp/langref.html里.
6.
(加分題) 改寫下邊的腳本,使得當接收到SIGINT信號時列印出"caught signal SIGINT, exit"並退出.
&
7.
(加分題) 有一個超級大的int數組要求和,假設有1000W,寫一個php腳本,根據當前機器(假設是多核的)cpu的核數,fork出這麼多子進程,把數組平分,每個子進程計算其中一部分,並把結果保存到/tmp/子進程pid.txt.
最後父進程匯總並輸出求各結果.
=============================================================
Update: 最後加上了基礎題分析說明
兩年多之後,更新一下新的面試題.
基礎題
場景:
你入職了一家新公司.
上班第一天,接待人給你安排好了座位,然後拉過來一台沒拆封的新電腦.
你把電腦連接好之後,按下電源....
好吧,這真是一台新電腦,裡邊竟然內置了個DOS系統!!
你找同事拿來了操作系統光碟/U盤(這個無所謂了).半個小時後,操作系統安裝好了.
- 第一件事就是要把LAMP環境搭建起來,這樣才好工作.簡述搭建LAMP環境過程中的注意點.
- LMAP環境搭建好之後,你拿到了第一個開發任務.給公司內部開發一個通用審批系統.公司內部有一個DNS伺服器,上邊已經配好了這個系統的域名,叫approving.great-company.com,並指向了你本機的ip.
你嘗試訪問了一下http://approving.great-company.com
,出現了apache經典的It
Works頁面,域名是生效的.你打算在桌面新建一個目錄叫approving並在這個目錄下完成這個系統的開發.如何配置apache使得訪問http://approving.great-company.com的時候能夠打開approving/index.php
- apache配置好之後,你開始了開發工作.這時,同事給了你一份代碼,是另一個人寫了一半的通用審批系統.這下好多了,你不用從零開始寫代碼了.你翻看了他的代碼,發現邏輯是這樣的:
用戶使用email和密碼登錄這個系統後,程序把這個用戶的id放到了session里.通過$_SESSION["uid"]就可以拿到登錄用戶id,然後去資料庫里就能把這個用戶的個人信息(比如叫什麼名字,是哪個部門的)拿到了.接著,你找到了這個通用審批系統主要功能點的代碼
&
&query("INSERT INTO approving(title, details) VALUES ("$title", "$details")");
$insertId = $db-&>getLastinsertId();
$db-&>query("INSERT INTO access(approving_id, access) VALUES ($insertId, $access)");
// 通知boss@great-company.com審批
$to = "boss@great-company.com";
$subject = "請審批 $title";
$body = "$details
&快速審批鏈接&";
include __DIR__ . "/lib/mail.php";
$mail = new Mail();
$mail-&>addTo($to);
$mail-&>setSubject($subject);
$mail-&>setBodyHtml(nl2br($body));
$mail-&>send();
header("Location: success.php");
看到這裡,你大概看明白了.用戶登錄進來之後,提交一個表單,填寫好要boss審批什麼東西以及詳細的描述,程序接收到提交數據後,除了把審批事項存放到approving表之外,還生成了一個access,發送給了boss,應該是boss在郵件里點擊這個」快速審批鏈接」就不需要登錄系統就直接把事項審批了.接著,你找到了approving.php的代碼:
&query("SELECT approving_id FROM access WHERE access = "$access"");
if (!$row) {
die("No such access");
}
$approvingId = $row["approving_id"];
$approvingRow = $db-&>query("SELECT * FROM approving WHERE approving_id = $approvingId");
echo "&
審批事項: ", $approvingRow["title"], "&
";echo "&
詳細描述:&
";echo "&
", nl2br($approvingRow["details"]), "&
";echo "&通過&";
echo "&拒絕&";
Review上述三段代碼,指出代碼中存在的問題.
4. 在你翻看完成了大部分代碼之後,你發現裡邊有一個TODO尚未完成.
// TODO:
如果兩天了boss還沒有審批,那麼系統就再發一封郵件催一下.
這個該怎麼實現?
進階題
- 有哪些得意之作?
- 是否實踐過PHP編碼規範?
- 如何做質量控制?
- 如何做測試?
- js命名空間的作用?
- 是否用過jslint?
- 是否寫過jQuery
plugin? - Linux使用多長時間了?
- 常用工具:
vim, grep, sed awk, wget, curl - 寫過哪些shell腳本?
- 做過伺服器管理嗎?
- 接觸到的Mysql資料庫表最大是多少行記錄?
- 使用哪種存儲引擎?
- 出現性能瓶頸如何定位解決?
- MyISAM與InnoDB索引的區別?InnoDB的Primary
Index 和
secondary Index有何區別? - 你手裡有300W份簡歷的工作經歷和教育背景?如何從中提取出學校/專業/公司?
- 學習一個新框架如何入手?
------------------------------------------------------------------------------------
為什麼我更新了面試題?
招研發的必須實打實的上代碼,我的確遇到了一些面試時回答問題還不錯,一寫代碼讓人頭疼的工程師.
所以招人時分了兩個層次:
1) 期望面試者入職工作後,代碼寫出來,一兩天內能發布到線上.(對應基礎題)
2) 了解面試者對編程認知的廣度和深度.(對應進階題)
基礎題分析說明
1. 搭建LAMP環境過程中,一定要把錯誤報警全都打開(安裝了xdebug後,錯誤報警會更顯眼,track_errors也很有用...)
2. 會配虛擬主機
3. Code Review.
首先,這三段代碼均缺少許可權判斷.
第2段代碼的問題:
1) 對提交過來的數據沒有任何驗證.
如果沒有提交title欄位,$_POST["title"]就報undefined index了
如果title,details為空,或者過長都會有問題
2) 資料庫操作部分有SQL注入
一個操作涉及到多個表時需要考慮事務的問題
第3段代碼的問題:
1) 數據驗證
2) SQL注入
3) XSS
4. 寫一個在CLI運行php程序,然後放入cronjob即可.
熟悉CLI環境還是需要的,讓一個新人明白數據不一定是從他寫的表單里提交過來的,好費勁.
------------------------------------------------------------------------------------
我覺得,如果一個應聘者能對如下關於LMAPJ(J指Javascript)方面的問題有自己的實戰經驗或者能提出解決方案的,都是可以考慮錄用的。以下只是個人最近的一些思考,不見得合理,但是我會很願意和能清楚解答如下問題的人在一起工作的。
======================================== PHP ==
# 編碼規範
你在以前的項目中採用什麼樣的編碼規範?
# 正則
你對正則有多熟悉?在以前的項目中用過嗎?用在哪些地方了?是自己寫的,還是從網上找的?
以下是apache的一段訪問日誌,從中取出訪問的站點名稱,訪問者ip (&訪問時間,訪問頁面,訪問者的客戶端&)http://www.fake.com:80 157.55.16.231 - - [25/Dec/2011:06:44:08 +0800] "GET /robots.txt HTTP/1.1" 200 394 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +Meet our crawlers)"
http://site1.fake.com:80 61.175.193.51 - - [25/Dec/2011:07:02:28 +0800] "GET /home/list HTTP/1.0" 302 399 "http://www.a.com/" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; MASN)"
http://site2.fake.com:80 61.237.230.38 - - [25/Dec/2011:09:55:55 +0800] "GET /blog/archive/?year=2010 HTTP/1.1" 200 8467 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; CIBA; Tablet PC 2.0; InfoPath.3; MS-RTC LM 8; 360SE)"# 開發過PHP的CLI程序嗎?
# 你做的哪個東西自己都覺得自己很NB?
# 有哪些好書可以推薦一下嗎?
## Book List== Javascript ==
# 你是怎麼接觸並學習js的?
# 在團隊中,採用什麼機制來解決命名衝突的?
# 採用什麼辦法來保證代碼質量的?
# 知道jslint嗎?使用過嗎?用多長時間了?怎麼和日常的開發工作結合在一起的?
# jQuery熟嗎?寫過jQuery的插件嗎?
# 有哪些好書可以推薦一下嗎?
## Book List
&> js語言精粹
&> [JavaScript高級程序設計(第2版)].(美)澤卡斯
&> High Performance JavaScript - Nicholas C. Zakas== Linux ==
# linux熟嗎?使用多長時間了?
# 常用工具: vim,grep,sed,awk,wget,curl...熟嗎?
# 寫過shell腳本嗎?
# 管理過伺服器嗎?
# 有哪些好書可以推薦一下嗎?
## Book List
&> [sed與awk(第二版)].(美)多爾蒂,(美)羅賓斯== Apache ==
# 會配置虛擬主機嗎?有幾種配置方法?(基於ip的,基於埠的,基於域名的,混雜的)
# 瀏覽器緩存是怎麼使用的?(mod expires)== MySQL ==
# 你接觸到的最大的mysql資料庫表是多大?(行記錄數大概是什麼量級的?)
# 使用的是哪種存儲引擎(MyISAM, InnoDB, ...)
# 出現性能瓶頸時是如何解決的?
# 自己創建過索引嗎?是怎麼決定要在某些列上創建索引的?
# 關於索引,清楚MyISAM與InnoDB的區別嗎? MyISAM的主鍵索引和其它索引有區別嗎? InnoDB的主鍵索引和其它索引有區別嗎?
# 有哪些好書可以推薦一下嗎?
## Book List
&> [MySQL技術內幕InnoDB存儲引擎].姜承堯
&> [高性能MySQL(第2版)中文版].施瓦茨== 其它 ==
# 數據結構和演算法怎麼樣?覺得有用嗎?在什麼地方用到了?有什麼好書推薦一下嗎?
# 除了PHP,還有哪門語言是你的強項,可以拿來用在production中的?
# 工作之餘做過什麼有意思的項目嗎?
# 有好的技術博客推薦一下嗎?
&> 風雪之隅-Laruence的博客
&> 酷殼 – CoolShell.cn
&> 黑客志 | Hacker的社交禮儀與自我修養
# csdn的用戶名密碼泄露出來一批,有643W多(其格式是username # password # email),現在想把它導到資料庫里,你有什麼辦法?
經驗所談,禁止轉載!
上面的回答可能僅僅是針對初級程序員制定的,我講講各個層級的吧!首先我覺得做一份筆試或機試是很重要的,不一定非得全部作對,能看到很多交談中看不到的問題!
既然是PHP程序員得圍繞PHP各方面問問- PHP基礎:單引號和雙引號區別?GET和POST的FORM表單的Action有什麼區別?Session工作原理如何取出數組最後一個值?Git分支合併翻轉字元串"example"列印出2014-09-23 23:08:01的時間戳Debug方法Composer用法進階:框架各部分了解程度(路由、設計規則、數據層包裝、視圖層、可擴展等)面向對象的了解程度(靜態方法、變數可用範圍、抽象類、介面、繼承、克隆、魔術方法等)命名空間測試用例異常處理緩存數據(memcache、redis、模板緩存、apc等各類緩存)正則測試高級:PHP SPL設計模式(挑選兩個,比如工廠、單例講講)排序演算法(挑選兩個,比如冒泡排序、插入排序講講應用點)加密演算法(挑選兩個,比如sha、crc32講講應用點以及區別)測試驅動開發敏捷開發思考最優開發模式疑難問題解決方法
- 安全分別講講XSS、CSRF原理和防範SQL注入防範上傳應該注意哪些問題變數覆蓋問題危險函數該如何處理服務基線安全域
- 資料庫事務處理各類鎖處理分庫、主從與離線左連接、右連接、交叉連接SQL優化不常用SQL函數應用曾經遇到的坑
- Linux挑選兩個命令,比如find、awk用法文件排序方法(比如取某文件夾最後修改的文件並將大小顯示為以M為單位的)python、shell等腳本程度寫的比較倉促,有漏掉的再補充!上面主要側重技術層面,其實很多技術對於一些人來說學起來很快的,所以還是人聰明或學習能力強最重要。
」你獨立搞定過什麼,拿證據來「
先看看人家簡歷上寫的什麼。你再去問相關一些方面的,然後從簡到難。然後一點點引申。如果回答者不會了,直接略過,根據他的簡歷從不同的方面去考察。然後可以再去問問他現在在做的事情,讀的書等等。
千萬不要拿著面試題讓別人答。這跟考試又有什麼區別。
如果符合你的條件,那你就收了。如果不符合,指出他可以加強的地方。
對於面試者來說,我覺得有自己的一個博客或者github項目,比如問你一個你在工作中沒有用到的技術,你說你用過,了解過,那怎麼證明你用過呢,如果你有博客或者github,那你就可以拿你寫的代碼或者自己寫的博客來說明。這樣別人就不會認為你是隨口胡說了。1、先明白你要做什麼樣的事情,然後再考慮找什麼樣的人。2、找合適的,不一定技術是最好的,這一點太重要
能在多大程度上挖掘出應聘者的開發水平跟面試官的水平也是有很大的關係的, 你的水平越高, 就可以從簡單的開始問起, 難度慢慢加大, 直到對方招架不住, 當然這裡面要把握好度, 因為如果你真的準備聘用這個人的話, 給人留下咄咄逼人的感覺也不太好的
直接給個可以聯網的電腦寫代碼吧,能搜索出來也算。題目可以很簡單,比如在pdo的基礎上封裝個最簡單的orm,類或者函數都可以。基本上合格的可以在10-20分鐘內完成,給半小時好了。很吃驚的是脫離了框架70%的人連這都不會寫。能又快又好完成的,可以在這基礎上深入下,再給半小時,要求改寫成讀寫分離的(主庫讀寫皆可,從庫只讀,讀請求均勻分離)。代碼實現里,用綁定的方式避免注入,這是最基礎的不用多說了吧?
booklist.Talk about the web security what you know.Do the DRY in your codes since? if yes,very good,tell me.Tell me how do you debug your code.The more the better.
面試不是考核別人的水平,水平高的人很多,你有必要並出得起那麼多錢嗎? 招聘是根據需求找合適的人, 目的明確之後,要問什麼就很容易了.
無論招什麼水平的,很反感問奇怪的問題,比如說png圖片壓縮後文件後綴卻改為jpg會有什麼後果,拿些寫法奇怪的程序來問你執行結果,誰那樣寫程序早被打死了世界最好的語言是什麼?答PHP的走人,眼界太窄不答php的也走人,干一行愛一行
這個問題主要在於你想招什麼。是「php」程序員,還是php「程序員」。看你著重哪個了。
面試過幾家國內還算可以的互聯網公司,覺得SQL注入是必考的。
php 的hashtable數據緩存資料庫優化
其實你可以從程序員的方面來考慮如何面試 而不僅僅是PHP
我在招PHP工程師,本人不懂技術,CTO未到,原系統又需要維護與開發,我應該先找什麼樣的人?
開發這行面太廣,有針對性的面試比較重要,合適才是最好的,招聘php問他們嵌入式的東西,招聘C++穩一些前端知識這種類似情況,肯定是不適合的
做過什麼項目,最滿意哪個項目,印象最深的是哪個功能點,使用了什麼技術,還有哪些是你擅長的但沒有被問到的。
原PO你好~
我是今年應屆畢業生,面對原PO的基礎題,我覺得我很挫折 很慚愧我目前功力只能免強看得懂,對於TODO的完成也只有一點想法,並沒有把握完成!我想說的是...原PO的基礎題適用於剛畢業的我嗎?假如適用的話,我會好好回去再去加強自己!!!二月初過完年我將開始找工作...令請教有甚麼方法能快速提升php功力??希望原PO有給我一些指教!謝謝您~然而面對 吳止介,WEB安全打雜工 大大 的基礎問題我有把握能回答!! 以上 小學徒留推薦閱讀:
※PHP高級程序員所要掌握的技能?
※作為一名合格的PHP程序員,應該進行哪些技術儲備?
※PHP自由職業者靠譜嗎?或者說是大學在校生,靠接一些項目來做賺錢養活自己。?
※網上的PHP視頻版本比較老,是否適合現在(2017)自學?
※學習PHP,然後學習C, 深入Linux的, 如果想往底層發展, 應該是如何的一個學習過程?