出于一些原因近期做了一次作業變動,在職交接近一個半月時間大概面試了十五家公司,并且得到了自己比較滿意的offer,最后基本上無縫銜接了新作業,總體來說,雖然準備的很充分,但面試期間還是暴露了許多問題,所以做下總結,供大家和自己以后參考,主要分四部分講述: 簡歷方面,格式內容包括七個板塊,個人簡介,求職意向,作業經歷,專案經歷,技能描述,學歷背景,自我評價,如果自己或公司沒有其他特殊要求,這些一般就夠了,具體格式不再贅述,
總結幾個要素:
1.個人簡介名字大寫,內容需要詳實,一是可以給人留下映像,二是減少不必要的與面試官交換個人資訊的時間,準備一份好的口頭自我介紹是很有必要的,畢竟準備一次能用很久,時間花在上面很實用,面外企英文版的最好也提前準備下,
2.簡歷上不要寫上期望薪資,能夠根據面試情況變化是最好的,如果寫上建議高于自身期望,詳細參考錨定效應,
3.簡歷要簡潔,最好不要超過兩頁,專案經歷要突出重點(可以具體到某次解決線上問題,某次優化效率提升),兩到三個為宜,不重要的可以放在作業經歷中一筆帶過,這樣有個好處,即面試官根據專案問的問題就會很集中,在你的預料之中,如果你的專案夸夸 其談寫了很多,那面試官發揮起來,你就容易被帶著走,
4.很多人不重視個人評價欄目,我的技巧是評價最后中帶上自己的博客,個人專案,因為在尾部還是很容易被看到并當做加分項的,
我的PHP學習交流社區——856460874
面試流程,其實每個公司大同小異,電話面試,筆試,技術面(可能兩面),Hr面,部門經理面,可能不同公司有稍微做調整,
這里需要強調兩點:
1.電話面試,很多大公司都會有電話面試,有些朋友接到面試不管當前情況如何,環境如何都會爭取這個機會,而我想說的是,如果身邊環境尚可接了也就接了,但是如果身處鬧市,或者下班回家地鐵上信號不好,或者自己完全沒有準備,建議直接回復面試官目前不 合適,改約其他時間,這么做好處一是沒有環境影響,二是自己有心理準備,
2.抓住機會問問題,如果對技術有追求一定要向技術官問清楚專案所使用技術,問開發人員上下班時間,向HR問清楚公司的薪酬福利體系,決定自己開價,向管理層問清楚專案目前所處的階段,以及規劃方向, 面試題概覽,基本上匯總了這次面試中遇到的所有問 題,中間也有一些是自己當時沒有答上來的,這里只做羅列:
1、什么事面向物件?主要特征是什么?
面向物件是程式的一種設計方式,它利于提高程式的重用性,使程式結構更加清晰,主要特征:封裝、繼承、多型,
2、SESSION 與 COOKIE的區別是什么,請從協議,產生的原因與作用說明?
A、http無狀態協議,不能區分用戶是否是從同一個網站上來的,同一個用戶請求不同的頁面不能看做是同一個用戶,
B、SESSION存盤在服務器端,COOKIE保存在客戶端,Session比較安全,cookie用某些手段可以修改,不安全,Session依賴于cookie進行傳遞,
禁用cookie后,session不能正常使用,Session的缺點:保存在服務器端,每次讀取都從服務器進行讀取,對服務器有資源消耗,Session保存在服務器端的檔案或資料庫中,默認保存在檔案中,檔案路徑由php組態檔的session.save_path指定,Session檔案是公有的,
3、HTTP 狀態中302、403、 500代碼含義?
一二三四五原則:(即一:訊息系列;二:成功系列; 三:重定向系列;四:請求錯誤系列;五:服務器端錯誤系列,)
302:臨時轉移成功,請求的內容已轉移到新位置
403:禁止訪問
500:服務器內部錯誤
401:代表未授權,
4、請寫出資料型別(int char varchar datetime text)的意思;請問 varchar 和 char有什么區別?
Int 整數char 定長字符 Varchar 變長字符 Datetime 日期時間型Text 文本型 Varchar與char的區別 char是固定長度的字符型別,分配多少空間,就占用多長空間,Varchar是可變長度的字符型別,內容有多大就占用多大的空間,能有效節省空間,由于varchar型別是可變的,所以在資料長度改變的時,服務器要進行額外的操作,所以效率比char型別低,
5、MyISAM和 InnoDB 的基本區別?索引結構如何實作?
A、MyISAM型別不支持事務,表鎖,易產生碎片,要經常優化,讀寫速度較快,適合用于頻繁查詢的應用;
B、InnoDB型別支持事務,行鎖,有崩潰恢復能力,讀寫速度比MyISAM慢,適合于插入和更新操作比較多的應用,空間占用大,不支持全文索引等,
創建索引:alert table tablename add index 索引名 (`欄位名`)
6、isset() 和 empty() 區別
sset判斷變數是否存在,可以傳入多個變數,若其中一個變數不存在則回傳假;empty判斷變數是否為空為假,只可傳一個變數,如果為空為假則回傳真,
7、請說明 PHP 中傳值與傳參考的區別,什么時候傳值什么時候傳參考?
按值傳遞:函式范圍內對值的任何改變在函式外部都會被忽略
按參考傳遞:函式范圍內對值的任何改變在函式外部也能反映出這些修改
優缺點:按值傳遞時,php必須復制值,特別是對于大型的字串和物件來說,這將會是一個代價很大的操作,按參考傳遞則不需要復制值,對于性能提高很有好處,
8、在PHP中error_reporting這個函式有什么作用?
設定PHP的報錯級別并回傳當前級別,
9、說說你對快取技術的了解?
快取技術是將動態內容快取到檔案中,在一定時間內訪問動態頁面直接呼叫快取檔案,而不必重新訪問資料庫,
10、現在編程中經常采取MVC三層結構,請問MVC分別指哪三層,有什么優點?
MVC三層分別指:業務模型、視圖、控制器,由控制器層呼叫模型處理資料,然后將資料映射到視圖層進行顯示,優點是:①可以實作代碼的重用性,避免產生代碼冗余;②M和V的實作代碼分離,從而使同一個程式可以使用不同的表現形式
11、AJAX的優勢是什么?
ajax是異步傳輸技術,可以通過javascript實作,也可以通過JQuery框架實作,實作區域重繪,減輕了服務器的壓力,也提高了用戶體驗,
12、在程式的開發中,如何提高程式的運行效率?
A、優化SQL陳述句,查詢陳述句中盡量不使用select *,用哪個欄位查哪個欄位;少用子查詢可用表連接代替;少用模糊查詢;
B、資料表中創建索引;
C、對程式中經常用到的資料生成快取,
13、對于大流量的網站,您采用什么樣的方法來解決訪問量問題?
A、有效使用快取,增加快取命中率
B、使用負載均衡
C、對靜態檔案使用cdn進行存盤和加速
D、想法減少資料庫的使用
E、查看出現統計的瓶頸在哪里
F、反向代理
14、陳述句include和require的區別是什么?為避免多次包含同一檔案,可用什么陳述句代替它們?
區別:
在失敗的時候:
include產生一個warning,而require產生直接產生錯誤中斷
require在運行前載入
include在運行時載入
代替:
require_once
include_once
15、foo()和@foo()之間有什么區別?
@代表所有warning忽略
16、簡述php的垃圾收集機制,
答案:php中的變數存盤在變數容器zval中,zval中除了存盤變數型別和值外,還有is_ref和refcount欄位,refcount表示指向變數的元素個數,is_ref表示變數是否有別名,如果refcount為0時,就回收該變數容器,如果一個zval的refcount減1之后大于0,它就會進入垃圾緩沖區,當緩沖區達到最大值后,回收演算法會回圈遍歷zval,判斷其是否為垃圾,并進行釋放處理,
17、如何實作PHP的安全最大化?怎樣避免SQL注入漏洞和XSS跨站腳本攻擊漏洞?
答:基本原則:不對外界展示服務器或程式設計細節(屏蔽錯誤),不相信任何用戶提交的資料(過濾用戶提交),
18、echo、print_r、print、var_dump區別
echo:陳述句結構;
print:是函式,有回傳值
print_r:能列印陣列,物件
var_dump:能列印物件陣列,并且帶資料型別
19、寫出smarty模板的特點
速度快,編譯型,快取技術,插件機制,強大的表現邏輯
20、PHP如何實作頁面跳轉
方法一:php函式跳轉,缺點,header頭之前不能有輸出,跳轉后的程式繼續執行,可用exit中斷執行后面的程式,
header("Location:網址");//直接跳轉
header("refresh:3;url=http://www.jsdaima.com");//三秒后跳轉
方法二:利用meta
echo"";
21、如何把一個GB2312格式的字串裝換成UTF-8格式?
iconv('GB2312','UTF-8','js代碼(www.jsdaima.com)是IT資源下載與IT技能學習平臺,');
?>
22、如果需要原樣輸出用戶輸入的內容,在資料入庫前,要用哪個函式處理?
htmlspecialchars或者htmlentities
23、什么是 CSRF 攻擊 ?XSS 攻擊?如何防范?
CSRF,跨站請求偽造,攻擊方偽裝用戶身份發送請求從而竊取資訊或者破壞系統,
講述基本原理:用戶訪問A網站登陸并生成了cookie,再訪問B網站,如果A網站存在CSRF漏洞,此時B網站給A網站的請求(此時相當于是用戶訪問),A網站會認為是用戶發的請求,從而B網站就成功偽裝了你的身份,因此叫跨站腳本攻擊,
CSRF防范:
A、合理規范api請求方式,GET,POST
B、對POST請求加token令牌驗證,生成一個隨機碼并存入session,表單中帶上這個隨機碼,提交的時候服務端進行驗證隨機碼是否相同,
XSS,跨站腳本攻擊,
防范:不相信任何輸入,過濾輸入,
24、安全對一套程式來說至關重要,請說說在開發中應該注意哪些安全機制?
A、防遠程提交;
B、防SQL注入,對特殊代碼進行過濾;
C、防止注冊機灌水,使用驗證碼,
25、對json資料格式的理解?
JSON(javascript object Notation)是一種輕量級的資料交換格式,json資料格式固定,可以被多種語言用作資料的傳遞,
26、什么是事務?及其特性?
答:事務:是一系列的資料庫操作,是資料庫應用的基本邏輯單位,
事務特性:
A、原子性:即不可分割性,事務要么全部被執行,要么就全部不被執行,
B、一致性或可串性,事務的執行使得資料庫從一種正確狀態轉換成另一種正確狀態
C、隔離性,在事務正確提交之前,不允許把該事務對資料的任何改變提供給任何其他事務,
D、持久性,事務正確提交后,其結果將永久保存在資料庫中,即使在事務提交后有了其他故障,事務的處理結果也會得到保存,
或者這樣理解:
事務就是被系結在一起作為一個邏輯作業單元的SQL陳述句分組,如果任何一個陳述句操作失敗那么整個操作就被失敗,以后操作就會回滾到操作前狀態,或者是上有個節點,為了確保要么執行,要么不執行,就可以使用事務,要將有組陳述句作為事務考慮,就需要通過ACID測驗,即原子性,一致性,隔離性和持久性,
27、什么是鎖?
答:資料庫是一個多用戶使用的共享資源,當多個用戶并發地存取資料時,在資料庫中就會產生多個事務同時存取同一資料的情況,若對并發操作不加控制就可能會讀取和存盤不正確的資料,破壞資料庫的一致性,
加鎖是實作資料庫并發控制的一個非常重要的技術,當事務在對某個資料物件進行操作前,先向系統發出請求,對其加鎖,加鎖后事務就對該資料物件有了一定的控制,在該事務釋放鎖之前,其他的事務不能對此資料物件進行更新操作,
基本鎖型別:鎖包括行級鎖和表級鎖
28、索引的作用?和它的優點缺點是什么?
答:索引就一種特殊的查詢表,資料庫的搜索引擎可以利用它加速對資料的檢索,它很類似與現實生活中書的目錄,不需要查詢整本書內容就可以找到想要的資料,索引可以是唯一的,創建索引允許指定單個列或者是多個列,缺點是它減慢了資料錄入的速度,同時也增加了資料庫的尺寸大小,
29、如何通俗地理解三個范式?
第一范式:1NF是對屬性的原子性約束,要求屬性具有原子性,不可再分解;
第二范式:2NF是對記錄的惟一性約束,要求記錄有惟一標識,即物體的惟一性;
第三范式:3NF是對欄位冗余性的約束,即任何欄位不能由其他欄位派生出來,它要求欄位沒有冗余,
30、主鍵、外鍵和索引的區別?
定義:
主鍵--唯一標識一條記錄,不能有重復的,不允許為空
外鍵--表的外鍵是另一表的主鍵, 外鍵可以有重復的, 可以是空值
索引--該欄位沒有重復值,但可以有一個空值
作用:
主鍵--用來保證資料完整性
外鍵--用來和其他表建立聯系用的
索引--是提高查詢排序的速度
個數:
主鍵--主鍵只能有一個
外鍵--一個表可以有多個外鍵
索引--一個表可以有多個唯一索引
31、簡述 private、 protected、 public修飾符的訪問權限,
private : 私有成員, 在類的內部才可以訪問,
protected : 保護成員,該類內部和繼承類中可以訪問,
public : 公共成員,完全公開,沒有訪問限制,
32、堆和堆疊的區別?
A、堆是程式運行期間動態分配的記憶體空間,你可以根據程式的運行情況確定要分配的堆記憶體的大小;
B、堆疊是編譯期間就分配好的記憶體空間,因此你的代碼中必須就堆疊的大小有明確的定義,
33、常用的魔術方法有哪些?舉例說明
答:php規定以兩個下劃線(__)開頭的方法都保留為魔術方法,所以建議大家函式名最好不用__開頭,除非是為了多載已有的魔術方法,
__construct() 實體化類時自動呼叫,
__destruct() 類物件使用結束時自動呼叫,
__set() 在給未定義的屬性賦值的時候呼叫,
__get() 呼叫未定義的屬性時候呼叫,
__isset() 使用isset()或empty()函式時候會呼叫,
__unset() 使用unset()時候會呼叫,
__sleep() 使用serialize序列化時候呼叫,
__wakeup() 使用unserialize反序列化的時候呼叫,
__call() 呼叫一個不存在的方法的時候呼叫,
__callStatic()呼叫一個不存在的靜態方法是呼叫,
__toString() 把物件轉換成字串的時候會呼叫,比如 echo,
__invoke() 當嘗試把物件當方法呼叫時呼叫,
__set_state() 當使用var_export()函式時候呼叫,接受一個陣列引數,
__clone() 當使用clone復制一個物件時候呼叫,
34、$this和self、parent這三個關鍵詞分別代表什么?在哪些場合下使用?
$this 當前物件
self 當前類
parent 當前類的父類
$this在當前類中使用,使用->呼叫屬性和方法
self也在當前類中使用,不過需要使用::呼叫
parent在類中使用
35、作用域運算子::如何使用?都在哪些場合下使用?
呼叫類常量
呼叫靜態方法
36、__autoload()方法的作業原理是什么?
答:使用這個魔術函式的基本條件是類檔案的檔案名要和類的名字保持一致,
當程式執行到實體化某個類的時候,如果在實體化前沒有引入這個類檔案,那么就自動執行__autoload()函式,
這個函式會根據實體化的類的名稱來查找這個類檔案的路徑,當判斷這個類檔案路徑下確實存在這個類檔案后
就執行include或者require來載入該類,然后程式繼續執行,如果這個路徑下不存在該檔案時就提示錯誤,
使用自動載入的魔術函式可以不必要寫很多個include或者require函式,
37、簡述高并發網站解決方案,
A、前端優化(CND加速、建立獨立圖片服務器)
B、服務端優化(頁面靜態化、并發處理[異步|多執行緒]、佇列處理)
C、資料庫優化(資料庫快取[Memcachaed|Redis]、讀寫分離、分庫分表、磁區)
D、Web服務器優化(負載均衡、反向代理)
很多人在剛接觸這個行業的時候或者是在遇到瓶頸期的時候,總會遇到一些問題,比如學了一段時間感覺沒有方向感,不知道該從那里入手去學習,對此我整理了一些資料,需要的可以免費分享給大家(11年架構師帶你解讀年薪50萬面試通關秘籍,)
如果喜歡我的文章,想與一群資深開發者一起交流學習的話,獲取更多相關大廠面試咨詢和指導,歡迎加入我的學習交流群點擊此處PHP高級交流
38、PHP遍歷檔案夾下所有檔案
1 <?php 2 function read_all($dir){ 3 if(!is_dir($dir)) return false; 4 $handle = opendir($dir); 5 if($handle){ 6 while(($fl = readdir($handle)) !== false){ 7 $temp = $dir.$fl; 8 //$fl !='.' && $fl != '..' 排除當前目錄及父級目錄 9 if(is_dir($temp) && $fl!='.' && $fl != '..'){ 10 echo '目錄:'.$temp.'<br>'; 11 read_all($temp); 12 }else{ 13 if($fl !='.' && $fl != '..'){ 14 echo '檔案:'.$temp.'<br>'; 15 } 16 } 17 } 18 } 19 } 20 read_all("./dir/"); 21 ?>
39、在命令列中運行php程式
php indx.php
A、從命令列運行php非常簡單,但有些注意事項需要各位了解下,諸如$_SESSION之類的服務器變數是無法在命令列中使用的,其他代碼的運行則和web服務器中完全一樣;
B、在命令列中執行php檔案的好處之一就是可以通過腳本實作一些計劃任務(crontab)的執行,而無須通過web服務器,
延伸1:
php -v 顯示當前PHP版本
php -m 顯示當前php加載的有效模塊
php -i 輸出無html格式的phpinfo
php --rf function
延伸2:向php腳本傳遞引數:
提示:命令列下執行php,是不走Apache/Nginx等這類東西的,沒有什么http協議,所以get,post傳引數根本不起作用,并且還會報錯,有些時候需要在shell命令下把PHP當作腳本執行,比如定時任務,這就涉及到在shell命令下如何給php傳參的問題,通常有三種方式傳參,
A、使用$argv or $argc引數接收
echo "接收到{$argc}個引數";
print_r($argv);
?>
B、使用getopt函式
$param_arr = getopt('a:b:');
print_r($param_arr);
?>
C、提示用戶輸入
fwrite(STDOUT,'Please enter your name:');
echo 'Your name is:'.fgets(STDIN);
?>
40、你用什么方法檢查PHP腳本的執行效率(通常是腳本執行時間)和資料庫SQL的效率(通常是資料庫Query時間),并定位和分析腳本執行和資料庫查詢的瓶頸所在?
A、PHP腳本的執行效率
a、代碼腳本里計時;
b、xdebug統計函式執行次數和具體時間進行分析,最好使用工具winCacheGrind分析;
c、在線系統用strace跟蹤相關行程的具體系統呼叫,
B、資料庫SQL的效率
a、sql的explain(mysql),啟用slow query log記錄慢查詢;
b、通常還要看資料庫設計是否合理,需求是否合理等,
41、對于大流量的網站,您采用什么樣的方法來解決各頁面訪問量統計問題,
A、確認服務器是否能支撐當前訪問量;
B、優化資料庫訪問;
C、禁止外部訪問鏈接(盜鏈), 比如圖片防盜鏈;
D、控制檔案下載,尤其是大檔案;
E、使用不同主機分流(負載均衡);
F、使用瀏覽統計軟體,了解訪問量,有針對性的進行優化,
42、 MySQL資料庫作發布系統的存盤,一天五萬條以上的增量,預計運維三年,怎么優化?
A、設計良好的資料庫結構,允許部分資料冗余,盡量避免join查詢,提高效率;
B、選擇合適的表欄位資料型別和存盤引擎,適當的添加索引;
C、mysql庫主從讀寫分離;
D、找規律分表,減少單表中的資料量提高查詢速度;
E、添加快取機制,比如memcached,redis等;
F、不經常改動的頁面,生成靜態頁面;
G、書寫高效率的SQL,比如 SELECT * FROM TABEL 改為 SELECT field_1, field_2, field_3 FROM TABLE,
43、Mysql的存盤引擎,myisam和innodb的區別,
A、MyISAM型別不支持事務處理等高級處理,而InnoDB型別支持;
B、MyISAM型別的表強調的是性能,其執行速度比InnoDB型別更快;
C、InnoDB不支持FULLTEXT型別的索引;
D、InnoDB中不保存表的具體行數,也就是說,執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出保存好的行數即可;
E、對于AUTO_INCREMENT型別的欄位,InnoDB中必須包含只有該欄位的索引,但是在MyISAM表中,可以和其他欄位一起建立聯合索引;
F、DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的洗掉;
G、LOAD TABLE FROM MASTER操作對InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,匯入資料后再改成InnoDB表,但是對于使用的額外的InnoDB特性(例如外鍵)的表不適用;
H、MyISAM支持表鎖,InnoDB支持行鎖,
MyISAM:成熟、穩定、易于管理,快速讀取,一些功能不支持(事務等),表級鎖,
InnoDB:支持事務、外鍵等特性、資料行鎖定,空間占用大,不支持全文索引等,
其他,主要是一些面試后的個人看法和玄學了:
1.很多在職的同學覺得請假面試麻煩,其實作在很多公司都有安排晚上面試和周末面試專場的,提前溝通好就行了,請假的話一天面試三家應該不是問題,
2.投遞公司的順序建議,首先是一兩家公司預熱一下,然后比較心儀的很有把握的公司,然后才是非常心儀的公司,最后是選擇 性的面試,安排這個順序主要是,雖然可能你業務很厲害,但是進入面試狀態時需要一個程序的,面試預熱很有必要,這里順便強調下面試提前準備,比如看下面試題,復習下技術書籍都很有必要的,提前選擇比較心儀的很有把握的公司,主要是為了拿到offer,一是做自我價值驗證,二是心中有底氣,
3.調整好心態,其實有些offer是帶有運氣成分的,畢竟對于有些體量公司來說,面試常有,編制不常有,所以拿不到offer也不要氣餒,
最后,祝所有大家在面試中過關斬將,拿到心儀offer,
精品內容推薦閱讀:
面試10家公司,識訓9個offer,2020年PHP 面試問題
騰訊T3-T4標準精品PHP架構師教程目錄大全,只要你看完保證薪資上升一個臺階(持續更新)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/134862.html
標籤:PHP
