1. 程式人生 > >2018年3月php開發面試最新快報(鏈家+一下科技+新浪+自如+百度)-熱氣騰騰[題目+答案]

2018年3月php開發面試最新快報(鏈家+一下科技+新浪+自如+百度)-熱氣騰騰[題目+答案]

===========================

寫在前面:

這兩天面了幾家,趕緊趁著還記得,把面試題記錄下來,以供參考。

鏈家:注重基礎和底層原理,還有程式碼的異常處理,摳細節。不過比較人性化,注重持久化發展,上下班不用打卡,活幹完了67想撤就可以撤,好任性的有沒有。然後php界的number 1鳥哥就在此廠。再然後技術交流也比較多比較成體系化,一週最少3次,其中還有教人穿衣搭配的學習,好全面啊,包3餐,住房優惠,連生活上的穿搭都照顧到了,哈哈,感動1秒鐘。。。

新浪:新浪看點這個部門注重高併發時的處理:sql優化,程式碼質量要求比較高,還有他們承諾他們開發的產品7*24隨時發現問題隨時響應,這就有點尷尬了,說不準哪天半夜睡著睡著,一個異常電話過來,你就得爬起來修bug…

一下科技:新興公司,主要是攻短視訊這塊,旗下產品有秒拍、小咖秀、一直播、VPlayer全能播放器、Vitamio多媒體SDK

包三餐,996單雙休,晚上加班到22:30之後打車報銷。工作滿半年可以享受1萬塊的住房補貼。工作滿1年以後公司每個季度給你父母1000塊錢,相當於一年給員工父母4K,這個福利還是第一次聽說。。然後再有就是這個公司注重廣告宣傳和明星效應,一搜,哇,趙麗穎,還有3小隻TFBoys,他們在此公司也掛著榮譽職位。

自如:地方有點偏,上來就是一張試卷要在45分鐘寫完。

百度:不用說,路人皆知。

===========================

鏈家(4輪技術+1hr)

一串11位的手機號,將php

中間4位變為4*  

//1.字串擷取法

$new_tel1 = substr($tel, 0, 3).'****'.substr($tel, 7);

var_dump($new_tel1);

//2.替換字串的子串

$new_tel2 = substr_replace($tel, '****', 3, 4);

var_dump($new_tel2);

//3.用正則

$new_tel3 = preg_replace('/(\d{3})\d{4}(\d{4})/', '$1****$2', $tel);

var_dump($new_tel3);

php常用的資料型別

int, float, double, double,

mysql索引

1select * from table name where b=xx and a=xx and c=xx

建索引:索引與where裡出現的順序無關。所以===>(a,b,c)

2select * from table name where a=xx and c=xx

建索引:索引不一定要全部包括where查詢的子列。所以===>(a),然篩選出記錄中含有b的記錄

3select * from table name where a=xx and b=xx

         select * from table name where b=xx and c=xx

         select * from table name where b=xx and a=xx

這三條語句如何加索引?

如果建2個索引(a,b)和(b,c)

如果建1個索引(b)還是(a,b,c)??????我猜想是(b),然後再篩。有不對之處歡迎留言拍磚~

簡述whereorder by原理,查詢的時候是先where還是先order by 

select  * d from table name where a>1000 and b<1000 and c=foo order by b desc這句如何加索引優化?

分情況:根據結果集判斷優化方向,加索引後篩選剩下的結果集越少,這個索引假的必要性越大。

(1)如果資料庫裡所有記錄的c=foo’,c的命中率是100%c就不用加索引,==>索引(a,b)

(2)如果a的命中率1%b的命中率30%c的命中率20%,那麼加索引的順序按照命中率從小到達排序,==>索引(a,c,b)

(3)如果b的命中率比較大,可以不用給b加索引,==>索引(a,b)

(4)加索引優先考慮where子列,其次才是order by子列,主要還是根據上面所說的結果集來判斷如何加索引

issetemty的區別


當變數是未定義,NULL=====>if(!isset)和if(empty)效果相同,都是false

當變數是"",0,"0",array(),flase====>if(!isset)和if(empty)效果相反,變數存在但是為空

綜上:(1)判斷變數是夠存在,用isset

(2)判斷一個存在的變數是否為空,用empty

Linuxawk的使用

i++, i+=1, i=i+1哪個執行快,為什麼?

在有優化的編譯器下,生成的機器程式碼是相同的,在沒有優化的情況下,i++效率最好,另外兩個完全等效。

i++相比 ++i哪個更高效?為什麼?

++i的效率高些,++i在運算過程中不產生臨時物件,返回的就是i,是個左值,類似++i=1這樣的表示式是合法的,而i++在運算的過程中會產生臨時物件,返回的是零時物件的值,是個右值,像i++=1這樣的表示式是非法的

對於內建型別,單獨的i++++i語句,現在的編譯器基本上都會優化成++i,所以就沒什麼區別了

foreach內部原理,php底層是c語言,簡單說說底層的一些理解。

redismemcache比較,redis過期鍵的處理,redis資料結構,redis底層資料結構

redis2大特性:持久化、支援除k-v外更多的資料結構

php常用的幾大框架的優缺點,php幾大設計模式以及使用場景

一堆數,按照元素出現次數按從大到小排序

(1)如果數無限大:

(2)如果數有限大:先hash,統計元素次數,然後針對次數做大根堆排序。

如果讓你封裝一個數據庫類,怎麼做?

(1)單例設計模式去使資料庫連線只有1個,每次使用完立馬關閉。介面卡模式資料庫連線方式多樣化,可以連mysql,mysqli,pdo

(2)許可權控制。不能讓外人隨隨便便就能訪問資料庫。

快取cookiesession的區別,快取存放位置(file,redis,memcache),redismemcache區別以及各自的內部實現。

海量日誌檔案的存放

(1)如每天入庫的資料量特大,可以考慮按照月去存表

(2)日誌可以不放在資料庫里加重伺服器負擔,可放在redis,訊息佇列(kafka)、ELC。目前鏈家就用的後兩個。

mysql的儲存引擎以及比較。聚合索引以及非聚合索引的底層資料結構(B+樹,前者葉子結點存放實際資料,後者葉子結點存放實際資料的地址)

array_walkarray_map的區別

===========================

一下科技(3輪技術+1hr)

簡述對fpm的理解

php各大設計模式和應用場景

常見php框架的優缺點

http常見狀態碼,httphttps區別

a、通訊使用明文不加密,內容可能被竊聽

b、不驗證通訊方身份,可能遭到偽裝

c、無法驗證報文完整性,可能被篡改

HTTPS就是HTTP加上SSL加密處理(一般是SSL安全通訊線路)+認證+完整性保護

http如何通過TCP連線的過程(stream)

TCP3次握手和4次揮手

tcpudp的區別

docker容器

swoller

快取的理解,memcacheredis區別,redis支援的資料型別,一個熱度前100排行榜,使用哪個資料型別(zset)

mysql索引的底層資料結構(B+樹),描述該結構。mysql幾種儲存引擎以及之間的區別。

常見linux命令,假設有個很大的檔案,達到沒辦法進去,取裡面第100-200條,另存到另一個檔案

直接取有三種方式
sed -n '100,200p' inputfile
awk 'NR>=100&&NR<=200{print}' inputfile
head -200 inputfile|tail -100
取完還得另存到另一檔案應該只能用awk

inputfile|awk '{if(NR>=100 && NR<=200) print $0}' > outfile

linux檢視磁碟佔用情況。

df -h 

簡述作業系統裡的堆和棧的理解

php的擷取類的函式。php的排序類函式,二維陣列排序,php的運算子優先順序(! != == & |)

擷取類的函式:array_slice  array_splice  array_chunk  implodeexplodesubstrstrstrstrrchr

排序類的函式:sort rsort  asort arsort  ksortkrsort  natsortnatcasesort  usort     

抽象類和介面的區別

php常見魔術函式

魔術方法:

__construct() :例項化物件時被呼叫;

__destuct():當刪除一個物件或者物件操作終止是被執行;

__call():呼叫物件不存在方法時被呼叫;

__get():呼叫物件不存在的屬性時被呼叫;

__set():設定物件不存在的屬性時被呼叫;

__toString():列印一個物件時被呼叫,比如echo $obj,print($obj);

__clone():克隆物件時被呼叫,比如$t = new Test();$tt = clone $t;

__sleep():serialize之前被呼叫,若物件比較大,想做一些刪除在序列化,可以考慮使用該方法;

__wakeup():unserialize之前被呼叫,做些物件的初始化;

__isset():檢測物件是否存在屬性的時候被呼叫,如 isset($c->name);

__unset():unset一個物件屬性時被呼叫,如:unset($c->name);

__set_state():呼叫var_export時被呼叫,用__set_state的返回值作為 var_export的返回值;

__autoload():例項化一個物件時,如果對應的類不存在,在該方法被呼叫。

魔術常量:

__LINE__:返回當前行號;

__FILE__:返回檔案的完整路徑和檔名,如果用在包含檔案裡面,則返回包含檔名,自 php4.0.2後,__FILE__總是包含一個絕對路徑,而在此前的版本有時候會包含一個相對路徑;

__FUNCTION__:返回函式名稱(自 php4.3.0新加的)。自php5起本常量返回該函式被定義時的名稱,區分大小寫,在php4中該值總是小寫;

__CLASS__:返回類的名稱,自 php4.3.0新加的,自php5起本常量返回該類被定義時的名稱,區分大小寫,在php4中該值總是小寫的;

__METHOD__:返回類的方法名。 php5新加的

mysql優化方法

如何提高web server效能

===========================

新浪

主要是高併發的處理比較多,新浪看點做公眾號,每天資料庫要插入20萬到40萬條資料。

mysql如何查詢優化

1、資料庫查詢分頁,perpagepage

2、查詢分頁當(limit 40萬,200)遍歷前40萬也會超慢,這時候可以採用切片來查

select min, max(id)然後計算分成若干片,每片的起始id和技術id可以算出來,然後放每片放快取中。

簡述單點登入

==========================

自如筆試題

1<script src="1.js">alert(1);</script>輸出啥  

彈出彈框,內容為1

2、有下面語句:<input type="text" id="txt" value="ziruroom"/>

編寫程式碼,當滑鼠滑過文字框,自動選中文字框中的內容

<input type="text" id="txt" value="ziruroom"/>

<script type="text/javascript">

    var textBox = document.getElementById('txt');

    textBox.onmouseover = function(){

        this.select();

    }

</script>

3、用php打印出前一天的時間格式是xxxx-xx-xx xx:xx:xx 

echo date('Y-m-d H:i:s',strtotime('-1 days')); 

4php可以將GBK轉換成UTF-8的函式有

echo $str= '你好,這裡是賣咖啡!'; 

$result=iconv("gbk","utf8",$str);

5、使用php正則匹配一段內容裡的所有ziruroom.com域名及其子域名的url

$preg='[0-9a-zA-Z]*\.ziruroom\.com\/';

preg_match($preg,$str,$target); 

var_dump($target);

6Linux系統下,使用什麼命令來設定一個目錄下的所有檔案與子目錄下的檔案具有可寫許可權

chmod -R a+w /tmp

7、新增一條作業crontab,每月1日,16點執行一次,記錄日誌

8、用php驗證手機號碼的正確性

2種方式,php和javascript

php

<?php 
$phonenumber = '13712345678';
if(preg_match("/^1[3|4|5|7|8]\d{9}$/",$phonenumber)){
    echo "是手機號碼";
}else{
    echo "不是手機號碼";

}

javascript

<!DOCTYPE html>

<html>
<head>
<title></title>
<meta charset="utf-8">
<script type="text/javascript">
function isPoneAvailable($poneInput) {  
  var myreg=/^[1][3,4,5,7,8][0-9]{9}$/;  
  if (!myreg.test($poneInput)) { 
   alert('fail'); return false;  
  } else { 
      alert('true'); return true;  
  }  


isPoneAvailable('18078678906');
</script>
</head>
<body></body>
</html> 

9Linux系統下,查詢/tmp/目錄下的以'.php'結尾的檔案,並將這些檔案複製到/home/phpfile/目錄下,請用一條命令寫出

cp /tmp/*.php /home/phpfile/

10、訪問日誌access.log,統計ip訪問次數,並倒序輸出

(

  LogFormat "%h %l %u %t ¥"%r¥" %>s %b" common

  CustomLog logs/access.log common  

cat access.log |cut -d ' ' -f 1 | sort |uniq -c | awk '{print $0 }' | sort -rn | less

11、將1234567890轉換成 1,234,567,890 3位用逗號隔開的形式

$str = '1234567890';
function mystr($str)
{
	$str = strrev($str);
	$str = chunk_split($str, 3, ',');
	$str = strrev($str);
	$str = ltrim($str, ',');
	return $str;
}
echo mystr($str); 

12、給定一個數組,將陣列中的數字連線起來,求最大數。例如:array(4,94,9,14,1)連線後,所得的最大數:9944141

13、寫出你所知道的,從一次web請求開始到結束這個過程中都會使用哪些快取?

(按照由客戶端到伺服器端的順序)
1.瀏覽器端儲存:
HTML5中的本地儲存功能允許在瀏覽器端儲存資料.
Flash等第三方外掛也有類似的功能.
JavaScript儲存一些資料在當前Context也算這種型別.
2.瀏覽器端檔案快取
HTTP協議中在時間未過期等情況下,不請求伺服器資料而直接使用本地的檔案 (請參考HTTP協議中關於快取控制的部分)
常用於html JavaScript css等檔案的快取,以減少請求次數
3.HTTP快取304:
HTTP協議中,如果伺服器檔案未發生變化,不返回使用者請求的資料,而只是返回一個304響應 (更多內容請參考HTTP協議)
不減少請求數量,但是減少了響應的體積
通過控制動態檔案的輸出內容實現快取(可以瞭解一下 Etag 等相關內容)
4.伺服器端檔案型別快取
動態頁面靜態化為html檔案;
代理伺服器, CDN等..
某些不常更新的的資料靜態化為檔案
主要是為了節省伺服器資源,例如CPU
5.普通記憶體快取:
這是我們平時用的最多的快取
功能很強,例如.net中的Cache類按照時間等規則定時過期資料,例如快取資料庫資料
6.分散式快取
例如Memcached,現代應用程式的規模越來越大,難免用上此類方案
經常通過自己分割程式實現分散式的快取
7.資料庫快取
大部分資料庫都會把資料載入到記憶體中以提高效能
8.表現層&DOM快取
在客戶端和伺服器端緩衝HTML片段,(只更新需要更新的部分,如很多ajax的實現)
例如jQuery中的鏈式表示式 (某些資料說明鏈式表示式會快25%)
以上涉及的部分都是可以通過開發或者配置實現控制的(有些不容易控制的快取型別就沒有提到)
此外:
許多程式語言中把資料放在靜態變數等成員中,其實也是一種快取
除了對於資料和檔案的快取以外,還有很多對於程式本身的快取
關於HTTP Cache部分可以檢視 RFC 2616
許多元件自帶快取功能,例如NHibernate,如果注意其配置可以獲得不錯的效能提升
按照常用程度從多到少,開發難度從容易到複雜,在開發中優先度從高到低
個人建議的順序為 5 > 2 > 3  > 8  > 4
伺服器快取直接在程式碼中開發,成本低,功能強
HTTP快取一般由伺服器(IIS,apache)等內建支援,當然 也可以程式設計實現,也是很推薦的做法
本地儲存還不夠普及,在對客戶端要求較高的網站中使用較多
MemCached之類的解決方案是對較大規模的網站必用的
資料庫快取是一個比較難以控制的範疇,(相比來說  優化索引和資料庫設計更為有效)


14、請寫出你所知道的設計模式,並寫出所適合的應用場景。

15、用過哪些php框架嗎?有什麼特點,優點,缺點?

16、反射性XSS漏洞的原理及危害?

17php的垃圾回收機制是怎麼樣的?

PHP使用了引用計數這種單純的垃圾回收機制。每個物件都內含一個引用計數器,每個reference連結到物件,計數器加1,當reference離開生存空間或者被設為null,計數器減1,當某個引用計數器的物件為0時,PHP知道你將不再需要使用這個物件,釋放其所佔有的記憶體空間。

18、是否使用過git,簡單寫下常用的命令,並描述下與svn的區別

git add 

git commit -m edit test.php

git -b checkout  dev

git clone [email protected]:username/projectname.git

沒用過svn。。。

19、寫出SQL語句的格式,插入、更新、刪除表名User

Name  Tel  Content  Date

張三  13333663366 大專畢業  2006-10-11

張三  13612312331 本科畢業  2006-10-15

張四  021-55665566中專畢業  2006-10-15

(a)有一條新記錄(小王 13254748547高中畢業 2007-05-06)請用SQL語句新增至表中

(b)請用sql語句把張三的時間更新成為當前系統時間

(c)請寫出刪除名為張四的全部記錄

20mysql出現ERROR:(2006,'Mysql server has gone away')報錯事什麼意思,如何解決

原因:一般出現在倒入較大資料庫的時候。SQL語句過大或者語句中含有BLOB或者longblob欄位,超出了預設允許最大的資料包。 
解決辦法:先檢視這些引數的值是否過小
show global variables like '%timeout';
show VARIABLES like '%max_allowed_packet%';
然後在my.cnf檔案中新增以下引數(windows中是my.ini檔案)
wait_timeout=2880000 #伺服器關閉非互動連線之前等待活動的秒數。預設值:28800秒(8小時)
interactive_timeout = 2880000 #伺服器關閉互動式連線前等待活動的秒數。預設值:28800秒(8小時)
max_allowed_packet = 10M #包或任何生成的中間字串的最大大小。如果表中包含BLOB列或長字串,就必須增加該值。
另外,
互動式操作:通俗的說,就是你在你的本機上開啟mysql的客戶端,就是那個黑視窗,在黑視窗下進行各種sql操作,當然走的肯定是tcp協議。 
非互動式操作:就是你在你的專案中進行程式呼叫。比如一邊是tomcat web伺服器,一邊是資料庫伺服器,兩者怎麼通訊?在java web裡,我們通常會選擇hibernate或者是jdbc來連線。那麼這時候就是非互動式操作。

線上程啟動時,根據全域性wait_timeout值或全域性interactive_timeout值初始化會話wait_timeout值,取決於客戶端型別(由mysql_real_connect()的連線選項CLIENT_INTERACTIVE定義)。 

如果這個值過大的話,很可能會造成大量的無用的閒置的連線存在,對資料庫壓力過大;如果設定的小,會增加系統伺服器的業務壓力。所以,設定為多大,得根據你的伺服器的壓力大小來配置的,可不是隨便寫一個數就行了的。

21mysql的主從複製的原理,開發過程中要注意的事項。

===========================

百度

1、php生命週期
2、call()函式的作用
當呼叫不到響應的類的時候,就呼叫call生成一個
3、redis的value空間固定分配比較省資源
4、訊息佇列的非同步跑指令碼
5、如何設計鐵路12306?
如:2000個城市,初始化,查詢代替縱橫線路上的各站點
6、TCP的三次握手和四次揮手
7、建議學python.原話是學php是為了現在找工作,學python是為了將來找工作

未完待續。。。