首頁 > 易卦

PHP中級進階架構面試題

作者:由 知足快樂田園 發表于 易卦日期:2022-09-17

非同步事務會生效嗎

題目1:如何判斷一個字串是否是合法的日期模式:2022-05-10 13:08:11,要求程式碼不超過5行。

(某訊)

PHP中級進階架構面試題

/*思路:如果用正則的話,會比較複雜,因為需要判斷2月份是否正確,例如2022-02-30 10:08:11,這個是明顯不合理的,二月份最多29天,而且這個還是閏年的情況下。要把問題簡單話,先把字串轉化為時間戳,再把時間戳轉化為對應的日期,然後判斷是不是和原來的字串相等*/function test($data){ return $data?date(“Y-m-d H:i:s”,strtotime($data))==$data:false;}var_dump(test(“2022-02-30 13:08:11”));

題目2:將1234567890轉換成1,234,567,890每3位用逗號隔開的形式(某大廠)。

PHP中級進階架構面試題

/* 思路:翻轉字元 3位分割 098,765,432,1,再翻轉回去1,234,567,890 */$str = “1234567890”;function str($str){ //翻轉字元 $str = strrev($str); //分割字元 $str = chunk_split($str,3,‘,’); //再翻轉回來 $str = strrev($str); //去掉左側 $str = ltrim($str,‘,’); return $str;}echo str($str);echo “\n”;

題目3:如何實現中文字串翻轉?

PHP中級進階架構面試題

/* 思路:使用正則和陣列實現 */ $str = “今天天氣真好666”; function str_utf8($str){ return join(“”,array_reverse(preg_split(“//u”,$str)));}echo str_utf8($str);

題目4:一群猴子排成圈,按1,2,。。。,n依次編號,然後從第1只開始數,數到第m只,把它踢出圈,從它後面再開始數,再數到第m只,再把它踢出去,如此不停地進行下去,直到最後一隻猴子為止,那隻猴子就叫做大王,要求模擬此過程,輸入m,n輸出最後那個大王的編號。

PHP中級進階架構面試題

function hou_king($n,$m){ //構造陣列 for($i=1;$i<=$n;$i++){ $arr[] = $i; } $i = 0;//設定陣列指標 while(count($arr)>1){//猴子數量大於1進行迴圈 //判斷猴子是否出局,如果出局刪除掉,沒出局放到陣列最後繼續迴圈 if(($i+1)%$m==0){ unset($arr[$i]); }else{ array_push($arr,$arr[$i]);//把值加入到陣列末尾 unset($arr[$i]); } $i++; } return $arr;}var_dump(hou_king(3,2));

題目5:給定一組無序整數陣列,找出其中未出現的最小整數,例如[1,2,3,5]輸出4

PHP中級進階架構面試題

/* 思路:把原來的陣列去掉負數、重複數字,然後排序然後把陣列下標+1跟值比較,找出第一個不同的,輸出小標+1,輸出最大值; */ function findMax($arr=[]){ $arr = array_unique($arr); $arr = array_merge($arr); $a=[]; for($i=0;$i0){ $a[] = $arr[$i]; } } for($i=0;$i$v){ if($k+1 !==$v){ return $k+1; } } return $a[count($a)-1]+1;}$result = findMax([1,2,3,5]);echo $result;

題目6:請寫一段程式碼,確保多個程序同時寫入一個檔案成功

PHP中級進階架構面試題

/*思路:加鎖*/$file = fopen(“。/test。txt”,“w+”);if(flock($file,LOCK_EX)){ //獲得寫鎖,開始寫資料 fwrite($file,“今天6668”); //解除鎖定 flock($file,LOCK_UN);}else{ echo “file is locking”;}fclose($file);

題目7:寫一個函式,算出兩個檔案的相對路徑,如$a=’a/b/c/d/e。php’;$b=’a/b/12/34/c。php’;

計算出$b相對於$a的相對路徑是。。/。。/c/d

/*寫一個函式,算出兩個檔案的相對路徑,如$a=’a/b/c/d/e。php’;$b=’a/b/12/34/c。php’;計算出$b相對於$a的相對路徑是。/。/c/d(新浪)思路:計算路徑裡面相同的部分,然後用。替換先拆分路徑,再比較*/function test($path1,$path2){ //拆分 $arr1 = explode(‘/’,dirname($path1)); $arr2 = explode(‘/’,dirname($path2)); //比較 for($i=0,$len=count($arr2);$i<$len;$i++){ if($arr1[$i] != $arr2[$i]){ break; } } if($i<$len){ $path = array_fill(0,$len-$i,“。”); } $path = array_merge($path,array_slice($arr1,$i)); return implode(‘/’,$path); }$a = ‘a/b/c/d/e。php’;$b = ‘a/b/12/34/c。php’;echo test($a,$b);

題目8:mysql中myisam與innodb的區別

myisam:,支援表級鎖,不支援mvcc,不支援外來鍵,支援全文索引Innodb:支援事務,支援行級鎖,支援MVCC,支援外來鍵,不支援全文索引

題目9:innodb引擎的四大特徵:

1、插入快取,2。二次寫 3自適應雜湊索引 4預讀

面試題10:使用selectcount(*)查詢哪個引擎更快?

myisam更快,因為myisam內部維護了計數器,可以直接呼叫

題目11:innodb的事務如何透過日誌實現的

預寫日誌方式:事物日誌是透過redo和innodb的儲存引擎日誌快取來實現;當開始一個事物的時候,會記錄事務的lsn號;當事物執行的時候,會往innodb儲存引擎的日誌的日誌快取裡面插入事物日誌;當事務提交時,必須將儲存引擎的日誌快取寫入磁碟(innodb_flush_log_at_trx_commit控制),也就是寫資料之前需要先寫日誌;

題目12:事物的隔離級別有哪些?

4種隔離級別,讀未提交(RU)讀已提交(RC)可重複讀(RR)序列

題目13:mysql有多少種日誌?

錯誤日誌查詢日誌慢查詢日誌二進位制日誌中繼日誌事物日誌、重做日誌redo回滾日誌undo

題目14:解釋 內連線,左連線,右連線,全連線?

內連線:僅選出二張表中互相匹配的欄位記錄左連線:只要左邊表中有資料,資料就能檢索出來,而右邊的資料必須在左表中有記錄才能檢索出來;右連線:只要左邊表中有記錄,資料就能檢索出來。。。全連線:返回二個表中所有的記錄;

題目15:如何設計或者配置mysql,才能達到高效使用的目的

資料庫設計方面:欄位、型別等系統架構方面:表雜湊、叢集、讀寫分離高效sql語句,查詢內容,連線代替子查詢引擎選擇事務、外來鍵、索引

題目16:資料庫設計時,常遇到的效能瓶頸有哪些,常用的解決方案?

瓶頸主要有:磁碟搜尋最佳化 將資料分佈在多個磁碟磁碟讀寫:最佳化從多個磁碟並行讀寫CPU週期最佳化擴衝記憶體記憶體寬頻

題目17:描述一下,大流量高併發量網站的解決方案?

硬體方面使用快取技術禁止外部盜鏈控制大檔案下載叢集統計每個頁面流量消耗,針對最佳化分庫分表,讀寫分離sphinx索引引擎

題目18:網站主要攻擊方式有哪些?

命令注入eval注入客戶端指令碼攻擊跨網站指令碼攻擊SQL注入跨網站請求偽造攻擊session會話劫持session固定攻擊http響應拆分攻擊檔案上傳漏洞目錄穿越漏洞遠端檔案包含攻擊動態函式注入攻擊URL攻擊表單提交欺騙攻擊HTTP請求欺騙攻擊

題目19:什麼是儲存過程(mysql相關試題)?

儲存過程是一些預編譯的Sql語句;儲存過程一個預編譯的程式碼塊,執行效率比較高,一個儲存過程代替大量的T_SQL語句,可以降低網路通訊量,提高通訊效率,在一定程度上確保資料安全;

題目20:索引是什麼?有什麼作用以及優缺點?

索引是對資料庫表中一或多個列的值進行排序的結構,是幫助mysql高效獲取資料的資料結構索引型別:普通索引,唯一索引,主鍵索引,全文索引

題目21:索引查詢一定能提高查詢效能嗎?

索引的範圍查詢使用於二種情況基於一個範圍索引,一般返回結果集小於表中記錄30%,基於非唯一性的索引檢索;

題目22:超鍵、候選鍵、主鍵、外來鍵分別是什麼?

超鍵:在關係中能唯一標識元組的屬性集稱為關係模式的超鍵。一個屬性可以作為一個超鍵,多個屬性集合在一起也可以作為超鍵。超鍵包含候選鍵和主鍵。候選鍵:是最小超鍵,即沒有冗餘元素的超鍵。主鍵:資料表資料列的唯一標識,不能缺失也不能為null外來鍵:在一個表中存在另一個的主鍵稱為外來鍵。

題目23:什麼是檢視?以及檢視的使用場景有哪些?

影片是一種虛擬的表,具有和物理表相同的功能;只暴露部分欄位給訪問者,所以就建立一個虛擬表 就是檢視多個表結果放檢視,不必考慮資料來源不同的錶帶來的差異

題目24:

說一說資料庫的三個正規化

第一正規化:每一列都不可分割第二正規化:要有主鍵,且實體屬性完全依賴主鍵第三正規化:消除依賴傳遞,第二正規化的一個子集;一個關係表中,不能包含其他表中,包含的非主鍵資訊,就是同一個資訊只能在一個地方儲存,不能出現在多個表中

題目25:設計模式六大原則

開放封閉原則里氏替換原則依賴倒置原則單一職責原則介面隔離原則迪米特法則

題目26:簡述單例模式?

//單例模式//三私一公class Date{private static $date;private function __construct(){}private function __clone(){}public static function getInstance(){if(!(self::$date)){self::$date = new self();}return self::$date;}}$a = Date::getInstance();$b = Date::getInstance();$c = Date::getInstance();var_dump($a);var_dump($b);var_dump($c);

題目27:簡述工廠設計模式?

interface people{public function say();}class man implements people{public function say(){echo “I am is a man\n”;}}class woman implements people{public function say(){echo “I am is woman”;}}class factory{public static function createman(){return new man();}public static function createwomen(){return new woman();}}$man = factory::createman();$man->say();$women = factory::createwomen();$women->say();

題目28:觀察者模式

/*觀察者模式需求:有事情變化的時候通知觀察者定義事件產生的介面*/abstract class getEvent{private $observer = [];//新增觀察者public function addob($observer){$this->observer[] = $observer;}//通知觀察者public function inform(){if(!empty($this->observer)){foreach($this->observer as $observer){$observer->update();}}}}//定義觀察者介面interface obServer{public function update();}class obServer1 implements obServer{public function update(){echo “觀察者1已經收到”;}}class obServer2 implements obServer{public function update(){echo “觀察者2已經收到”;}}class event extends getEvent{//事件觸發public function demo(){//通知觀察者$this->inform();}}$a = new event();$a->addob(new obServer1());$a->addob(new obServer2());$a->demo();

題目29:簡述介面卡模式?

//db類的適配模式interface Db{//資料庫連線public function connect($host,$user,$pass,$dbname);//查詢public function query($sql);}class Mysql implements Db{protected $con;public function connect($host,$user,$pass,$dbname){$this->con = mysql_connect($host,$user,$pass,$dbname);mysql_select_db($dbname);return $this->con;}public function query($sql){$res = mysql_query($sql);return $res;}}class newPdo implements Db{protected $con;public function connect($host,$user,$pass,$dbname){$this->con = new Pdo(“myql:host=$host;dbname = $dbname”,$user,$pass);}public function query($sql){return $this->con->query($sql);}}

題目30:怎麼在命令列中執行PHP程式?

注意1:cli 模式get post無法生效,不起作用(shell指令碼)

題目31:什麼是csrf攻擊?如何防範?

csrf跨站請求偽造防範:對post請求增加token令牌

題目32:redis的應用場景有哪些?

會話快取,全頁快取,佇列,排行榜,計數器,釋出,訂閱,聊天系統

題目33:協程與執行緒的區別

程序有一個獨立的地址空間有自己的堆作業系統以程序為單位,執行緒是程序實體,比程序更小,與同屬一個程序的執行緒共享全部的資源,相對於程序不夠穩定容易丟失資料,協程是一種使用者態的輕量級執行緒,協成的排程是使用者控制的,操作協程的時候是沒有核心切換開銷的程序包含執行緒,共享地址空間,程序有獨立的地址空間:程序是資源分配和擁有的單位同一個程序的執行緒共享程序的資源,執行緒是處理器排程的基本單位但程序不是,二者都可以併發執行,協程和執行緒的比較,1、一個執行緒可以有多個協程,也可以單獨擁有多個協程;2、執行緒和程序都是同步的,而協程可以非同步的;3協程能保留上一個呼叫的狀態

題目34:mysql裡面有2000w資料,redis中只存20w的資料,如何保證redis中的資料都是熱點資料

redis記憶體資料集大小上升到一定的時間,就會實行資料淘汰策略,volatile-lru設定過期時間的資料,挑選最近的最少的資料淘汰,volatile-ttl從設定的過期時間的資料,挑選將要過期的時間的資料淘汰Volatile-random設定過期時間的資料集中,任意選擇資料淘汰, allkeys-lru策略從資料集中最近最少的使用的資料淘汰allkeys-random從資料集中任意資料淘汰no-enviction禁止驅逐資料

題目35:假如redis裡面有1億個key,其中有10w個key是以某個固定的已知的字首開頭的,如何將他們全部找出來?

使用key指令可以掃出指定模式的key列表,redis是單執行緒的,key指令會導致我們執行緒,使用scan指令

題目36:使用過redis做非同步佇列麼?你是怎麼用的?

一般是使用list結構作為佇列,rpush生產訊息,lpop消費訊息,當lpop沒有訊息的時候,適當使用sleep進行重置,可不可以不用sleep,blpop, 如果對方繼續追問,使用的pub/sub訂閱者模式1:n訊息佇列,可不可以生產一次消費多次?訂閱者的缺點,消費者下線的情況下,生產的訊息會丟失Redis 如何實現的我們的延遲佇列,使用sortedset拿時間戳作為scorekey呼叫zadd來生產訊息,消費者用zrangebyscore指令來獲取n秒之前的,獲取之前的資料進行輪處理

題目37:linux怎麼清屏?怎麼退出當前命令?怎麼執行睡眠?怎麼檢視當前使用者id?檢視指定幫助用什麼命令?

清屏:clear退出當前命令:ctrl+c執行睡眠:ctrl+z檢視使用者id:檢視指定幫助 adduser ——helpman adduserInfo adduser

題目38:linux中程序有哪幾種狀態?在ps顯示出來的資訊中,分別用什麼符號表示的?

不可中斷狀態 D暫停狀態/跟蹤狀態就緒狀態正在執行狀態或者佇列中的程序 R可中斷睡眠狀態殭屍狀態 Z退出狀態休眠狀態:SW:進行記憶體交換X:死掉的程序T:停止或者被跟蹤

題目39:什麼是rabbitmq?

採用了amqp高階訊息佇列協議在分散式系統下具備非同步削峰,負載均衡等一系列高階功能擁有持久化機制,程序訊息,佇列中的資訊也可以保持下來,實現了消費者和生產者之間的解耦,對於高併發場景下,採用了訊息佇列可以使用使得同步訪問變為序列訪問,達到一定量的限流效果,利於資料庫操作,可以使用訊息佇列達到非同步下單的效果,排隊中,後臺進行邏輯下單

題目40:elasticsearch的調優手段

設計階段業務增量需求使用別名Fore_merge操作來釋放空間,凌晨做的,因為它比較耗時採用冷熱分離的機制,curator索引的生命週期設定分詞器寫入階段副本數設定為0寫入時候禁用我們的重新整理機制使用bulk批次寫入恢復副本數和重新整理間隔使用自動生成的id查詢階段:禁用wildcard禁用terms利用倒排索引機制資料大時,先基於時間敲定索引再檢索設定合理的路由機制