1.PHP 如何實現(xiàn)不用自帶的 cookie 函數(shù)為客戶端下發(fā) cookie。對于分布式系統(tǒng),如何來保存 session 值。
這個題有點繞投慈。考的還是 COOKIE 和 SESSION 的基礎(chǔ)知識冠骄。服務(wù)端通過 set-cookie 命令來通知客戶端保存 cookie伪煤。
只要按照 domain path 過期時間等規(guī)則 用 header 函數(shù)就可以實現(xiàn)。
分布式系統(tǒng) session凛辣,集中處理抱既。按我們公司的架構(gòu),為了實現(xiàn)高可用和高容災(zāi)扁誓,提供一個分布式的驗簽服務(wù)防泵。具體的可以看下 redis 的分布式服務(wù)架構(gòu)。
2蝗敢、數(shù)據(jù)庫中的存放了用戶 ID, 扣費很多行捷泞,redis 中存放的是用戶的錢包,現(xiàn)在要寫一個腳本寿谴,將數(shù)據(jù)庫中的扣費記錄同步到 redis 中锁右,每 5 分鐘執(zhí)行一次。請問要考慮哪些問題?
思路:生產(chǎn)者和消費者模式骡湖。這個問題也沒有說其他的狀態(tài)贱纠,比如數(shù)據(jù)庫的數(shù)據(jù)會實時增加么峻厚?redis 中每個錢包是否有其他服務(wù)在讀取或者寫入啊响蕴。什么的。數(shù)據(jù)庫和 REDIS 放一起惠桃,要么考數(shù)據(jù)一致性浦夷,要么考出現(xiàn)鎖,導致效率降低辜王。
3劈狐、根據(jù) access.log 文件統(tǒng)計最近 5 秒的 qps,并以如下格式顯示呐馆,01 1000(難點在 01 序號)
tail -f access.log | awk -F '[' '{print $2}' | awk '{print $1}' | uniq -c
4.redis 是如何進行同步的肥缔,同步的方式,同步回滾怎么辦汹来,數(shù)據(jù)異常怎么辦续膳,同時會問 MYSQL 的同步方式和相關(guān)異常情況
redis 集群主從同步的簡單原理
Redis 的復(fù)制功能是基于內(nèi)存快照的持久化策略基礎(chǔ)上的,也就是說無論你的持久化策略選擇的是什么收班,只要用到了 Redis 的復(fù)制功能坟岔,就一定會有內(nèi)存快照發(fā)生。
當 Slave 啟動并連接到 Master 之后摔桦,它將主動發(fā)送一個 SYNC 命令 (首先 Master 會啟動一個后臺進程社付,將數(shù)據(jù)快照保存到文件中 [rdb 文件] Master 會給 Slave 發(fā)送一個
Ping 命令來判斷 Slave 的存活狀態(tài) 當存活時 Master 會將數(shù)據(jù)文件發(fā)送給 Slave 并將所有寫命令發(fā)送到 Slave )。
Slave 首先會將數(shù)據(jù)文件保存到本地 之后再將 數(shù)據(jù) 加載到內(nèi)存中邻耕。
當?shù)谝淮捂溄?或者是 故障后 重新連接 都會先判斷 Slave 的存活狀態(tài) 在做全部數(shù)據(jù)的同步 鸥咖, 之后只會同步 Master 的寫操作 (將命令發(fā)送給 Slave)
問題:
當 Master 同步數(shù)據(jù)時 若數(shù)據(jù)量較大 而 Master 本身只會啟用一個后臺進程 來對多個 Slave 進行同步 , 這樣 Master 就會壓力過大 兄世, 而且 Slave 恢復(fù)的時間也會很慢啼辣!
redis 主從復(fù)制的優(yōu)點:
(1)在一個Redis集群中,master負責寫請求碘饼,slave負責讀請求熙兔,這么做一方面通過將讀請求分散到其他機器從而大大減少了master服務(wù)器的壓力,另一方面slave專注于提供
讀服務(wù)從而提高了響應(yīng)和讀取速度艾恼。
(2) 在一個 Redis 集群中住涉,如果 master 宕機,slave 可以介入并取代 master 的位置钠绍,因此對于整個 Redis 服務(wù)來說不至于提供不了服務(wù)舆声,這樣使得整個 Redis 服務(wù)足夠安全。
(3) 水平增加 Slave 機器可以提高性能
5.兩臺 mysql 服務(wù)器,其中一臺掛了媳握,怎么讓業(yè)務(wù)端無感切換碱屁,并保證正常情況下講臺服務(wù)器的數(shù)據(jù)是一致的
不是核心業(yè)務(wù)的話,先停寫蛾找,把備機拉起來娩脾,查看兩臺機器的日志,進行數(shù)據(jù)補償打毛,開寫柿赊。
如果是核心業(yè)務(wù)的話,現(xiàn)在所有的寫操作都在正常的狀態(tài)機器上幻枉。把好的這臺機器的備機拉起來碰声,當主機。
以上全是應(yīng)急操作熬甫。實際上數(shù)據(jù)庫的容災(zāi)設(shè)計要復(fù)雜的多胰挑。
面試官要是問你,備機的數(shù)據(jù)不一致怎么辦椿肩,你要勇敢懟回去瞻颂,你們每秒多少寫入操作。按照百萬級表覆旱,每秒 1000 的寫入效率蘸朋,正常的設(shè)計是,分布在 2 臺機器上每臺 500扣唱。這個級別的數(shù)據(jù)同步藕坯,出現(xiàn)差異的概率 可以忽略不計的。有一臺出現(xiàn)問題噪沙,另一臺也可以抗住炼彪。
(正常的操作,還是先停寫正歼,等數(shù)據(jù)一致辐马,切換,開寫局义。我們公司搞這些切換都是在凌晨 4.00 左右喜爷,核心業(yè)務(wù)的每秒寫操作,只有十幾個萄唇。前后耽擱不到 20 秒)檩帐。
6.請寫出自少三種截取文件名后綴的方法或函數(shù)(PHP 原生函數(shù)和自己實現(xiàn)函數(shù)均可)
echo substr(strrchr($file, '.'), 1);
echo substr($file, strrpos($file, '.')+1);
$arr=explode('.', $file);
echo $arr[count($arr)-1];
$arr=explode('.', $file);
echo end($arr);
echo strrev(explode('.', strrev($file))[0]);
echo pathinfo($file)['extension'];
echo pathinfo($file, PATHINFO_EXTENSION);
7.寫一個函數(shù),獲取一篇文章內(nèi)容中的全部圖片另萤,并下載
function download_images($article_url = '', $image_path = 'tmp'){
? ? // 獲取文章類容
? ? $content = file_get_contents($article_url);
? ? // 利用正則表達式得到圖片鏈接
? ? $reg_tag = '/<img.*?\"([^\"]*(jpg|bmp|jpeg|gif|png)).*?>/';
? ? $ret = preg_match_all($reg_tag, $content, $match_result);
? ? $pic_url_array = array_unique($match_result1[1]);
? ? // 創(chuàng)建路徑
? ? $dir = getcwd() . DIRECTORY_SEPARATOR .$image_path;
? ? mkdir(iconv("UTF-8", "GBK", $dir), 0777, true);
? ? foreach($pic_url_array as $pic_url){
? ? ? ? // 獲取文件信息
? ? ? ? $ch = curl_init($pic_url);
? ? ? ? curl_setopt($ch, CURLOPT_HEADER, 0);
? ? ? ? curl_setopt($ch, CURLOPT_NOBODY, 0);
? ? ? ? curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE );
? ? ? ? curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE );
? ? ? ? curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
? ? ? ? $fileInfo = curl_exec($ch);
? ? ? ? $httpinfo = curl_getinfo($ch);
? ? ? ? curl_close($ch);
? ? ? ? // 獲取圖片文件后綴
? ? ? ? $ext = strrchr($pic_url, '.');
? ? ? ? $filename = $dir . '/' . uniqid() . $ext;
? ? ? ? // 保存圖片信息到文件
? ? ? ? $local_file = fopen($filename, 'w');
? ? ? ? if(false !== $local_file){
? ? ? ? ? ? if( false !== fwrite($local_file, $filecontent) ){
? ? ? ? ? ? fclose($local_file);
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
8 瓶水湃密,其中一瓶有毒诅挑,小白鼠喝完有毒的水之后,會在 24 小時后死亡泛源,問:最少用幾只小白鼠可以在 24 小時后找到具體是哪一瓶水有毒拔妥。
四只
二進制問題。薛定諤的老鼠达箍。
一只老鼠有兩個狀態(tài)没龙,死活,對應(yīng) 01幻梯。假設(shè)老鼠的個數(shù)為 A兜畸,則有 2^A>=10; A=4努释;
思路很簡單碘梢,十瓶藥編號:0,1,10,11....1001;
0 不喝。第一只老鼠喝所有個位是 1 的:13579伐蒂,第二只喝十位是 1 的煞躬,第三只和百位是 1 的,第四只喝千位是 1 的逸邦。
24 小時后恩沛,看下死了的是 1,活著的是 0缕减。按老鼠的順序乖乖站好…… 假如第一只和第三只死了雷客,那就是 0101,就是 5 有問題桥狡。
最后搅裙,祝所有大家在面試中過關(guān)斬將,拿到心儀offer裹芝。
很多人在剛接觸這個行業(yè)的時候或者是在遇到瓶頸期的時候部逮,總會遇到一些問題,比如學了一段時間感覺沒有方向感嫂易,不知道該從那里入手去學習兄朋,對此我整理了一些資料,需要的可以免費分享給大家(點擊此處加入php高級交流群一起學習交流怜械,11年架構(gòu)師帶你解讀年薪50萬面試通關(guān)秘籍颅和。)
更多學習內(nèi)容請訪問:
騰訊T3-T4標準精品PHP架構(gòu)師教程目錄大全,只要你看完保證薪資上升一個臺階(持續(xù)更新)
推薦視頻:
PHP高級開發(fā)工程師簡歷打造缕允,祝你金三銀四跳槽加薪