1. 簡述php中的autoload
在PHP中使用類時,我們必須在使用前載入進來,不管是通過 require 的方式還是 include 的方式,但是會有兩個問題影響我們做出載入的決定。首先是不知道這個類檔案存放在什麼地方,另外一個就是不知道什麼時候需要用到這個檔案。特別是專案檔特別多時,不可能每個檔案都在開始的部分寫很長一串的require。
Autoload 的載入機制,當通過 new 來執行個體化一個類時,PHP會通過定義的autoload 函數載入相應的檔案,如果這個類檔案使用了 extends 或者 implements 需要用到其他的類檔案,php會重新運行 autoload 去進行類檔案的尋找和載入,如果發生了兩次對同一類檔案的請求,就會報錯。
2. 靜態變數及有什麼優缺點?
靜態局部變數的特點: 1.不會隨著函數的調用和退出而發生變化,不過,儘管該變數還繼續存在,但不能使用它。倘若再次調用定義它的函數時,它又可繼續使用,而且儲存了前次被調用後留下的值。2.靜態局部變數只會初始化一次。3.靜態屬性只能被初始化為一個字元值或一個常量,不能使用運算式。即使局部靜態變數定義時沒有賦初值,系統會自動賦初值0(對數值型變數)或Null 字元(對字元變數);靜態變數的初始值為0。4.當多次調用一個函數且要求在調用之間保留某些變數的值時,可考慮採用靜態局部變數。雖然用全域變數也可以達到上述目的,但全域變數有時會造成意外的副作用,因此仍以採用局部靜態變數為宜.
3. strtr 和 str_replace 有什麼區別,兩者分別用在什麼情境下?
str_replace() 函數以其他字元替換字串中的一些字元(區分大小寫)
strtr() 函數轉換字串中特定的字元。
5.6版本 str_replace 比 strtr 效率高10+倍, 7.0版本效率基本相同, 但5.6的 str_replace 竟比 7.0高 3倍
4. 魔術方法
__construct():類的預設構造方法,如果__construct()和與類同名的方法共同出現時,預設調用__construct()而不是同類名方法。
__call():當調用不存在或者不可訪問的方法時,會調用__call($name, $arguments)方法。
__toString():當列印對象時會被直接調用。如echo $object;
__clone():當對象被拷貝時直接調用。
__isset():對不存在或者不可訪問的屬性使用isset()或者empty()時,__isset()會被調用;
__destruct():類的解構函式,當該對象的所有引用都被刪除,或者對象被顯式銷毀時執行。
5. 如下所示,會輸出什麼結果?
foreach ($array as $key => $item) { $array[$key + 1] = $item + 2; echo "$item"; } print_r($array);結果樣本: $array = [3,6,7,8];3678 //echo 輸出數組內元素的值Array( [0] => 3 //$key 保持不變 [1] => 5 //每次的$eky + 1,對應的值加2, [2] => 8 [3] => 9 [4] => 10)
laravel
laravel和其他架構對比的優缺點
laravel
優點: 使用人數全球第一,文檔齊全,架構結構組織清晰,大量第三方擴充包供引用,適合大型網站協同開發,提供的artisan開發工具開發效率高。composer擴充自動載入,中介軟體
缺點:稍複雜,上手比一般架構要慢;大量引用第三方包,但某些情境下我們只使用類中的部分方法,代碼顯得有些冗餘
ThinkPHP
優點:是一個快速、簡單的基於MVC和物件導向的輕量級PHP開發架構,遵循Apache2開源協議發布,秉承簡潔實用的設計原則,在保持出色的效能和至簡的代碼的同時,尤其注重開發體驗和易用性,並且擁有眾多的原創功能和特性,為WEB應用開發提供了強有力的支援。簡單明了方便快捷,上手快
缺點:缺少物件導向的設計,5的版本基本物件導向,架構社區相關的協助工具輔助少
Mysql
1. Mysql中,int(10)和int(11)的區別
BIT[M]位欄位類型,M表示每個值的位元,範圍從1到64,如果M被忽略,預設為1
TINYINT [(M)] [UNSIGNED] [ZEROFILL] M預設為4。很小的整數。帶符號的範圍是-128到127。無符號的範圍是0到255。
SMALLINT[(M)] [UNSIGNED] [ZEROFILL] M預設為6。小的整數。帶符號的範圍是-32768到32767。無符號的範圍是0到65535。
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] M預設為9。中等大小的整數。帶符號的範圍是-8388608到8388607。無符號的範圍是0到16777215。
INT[(M)] [UNSIGNED] [ZEROFILL] M預設為11。普通大小的整數。帶符號的範圍是-2147483648到2147483647。無符號的範圍是0到4294967295。
BIGINT[(M)] [UNSIGNED] [ZEROFILL] M預設為20。大整數。帶符號的範圍是-9223372036854775808到9223372036854775807。無符號的範圍是0到18446744073709551615。
注意:這裡的M代表的並不是儲存在資料庫中的具體的長度,以前總是會誤以為int(3)只能儲存3個長度的數字,int(11)就會儲存11個長度的數字,這是大錯特錯的。其實當我們在選擇使用int的類型的時候,不論是int(3)還是int(11),它在資料庫裡面儲存的都是4個位元組的長度,在使用int(3)的時候如果你輸入的是10,會預設給你儲存位010,也就是說這個3代表的是預設的一個長度,當你不足3位時,會幫你不全,當你超過3位時,就沒有任何的影響。
**int(M) M指示最大顯示寬度。最大有效顯示寬度是255。該可選顯示寬度規定用於顯示寬度小於指定的列寬度的值時從左側填滿寬度。顯示寬度並不限制可以在列內儲存的值的範圍,也不限制超過列的指定寬度的值的顯示。
2.索引左原則:
like,匹配字串時,不以萬用字元開頭,左側必須固定,該欄位索引才會起作用
複合索引,左側的欄位固定時,在索引匹配時,右側的索引才有效。因為複合索引關鍵字排序,按照左邊欄位進行排序,如果左邊欄位相同,才依據右邊欄位。
3.索引建立的優缺點:
優點:
建立索引可以大大提高系統的效能
通過唯一性索引,可以保證資料庫表中每一行資料的唯一性
大大加快檢索速度
加速表與表之間的串連
使用分組和排序子句進行資料檢索時,減少查詢中分組和排序的時間
通過使用索引,可以在查詢過程中,使用最佳化隱藏器,提高系統效能
缺點:
建立索引和維護索引要耗費時間,隨資料量的增加而增加
索引佔用物理空間
對錶中的資料進行增刪改的時候,索引需動態維護,降低了資料的維護速度
4. 請描述一下mysql主從伺服器之間是如何同步資料的,什麼樣的sql會造成主從無法正確同步?
網路的延遲
由於mysql主從複製是基於binlog的一種非同步複製,通過網路傳送binlog檔案,理所當然網路延遲是主從不同步的絕大多數的原因,特別是跨機房的資料同步出現這種幾率非常的大,所以做讀寫分離,注意從業務層進行前期設計。
主從兩台機器的負載不一致
由於mysql主從複製是主要資料庫上面啟動1個io線程,而從上面啟動1個sql線程和1個io線程,當中任何一台機器的負載很高,忙不過來,導致其中的任何一個線程出現資源不足,都將出現主從不一致的情況。
max_allowed_packet設定不一致
主要資料庫上面設定的max_allowed_packet比從資料庫大,當一個大的sql語句,能在主要資料庫上面執行完畢,從資料庫上面設定過小,無法執行,導致的主從不一致。
key自增鍵開始的索引值跟自增步長設定不一致引起的主從不一致。
mysql異常宕機情況下,如果未設定sync_binlog=1或者innodb_flush_log_at_trx_commit=1很有可能出現binlog或者relaylog檔案出現損壞,導致主從不一致。
mysql本身的bug引起的主從不同步。
版本不一致,特別是高版本是主,低版本為從的情況下,主要資料庫上面支援的功能,從資料庫上面不支援該功能
5.有一個order表,如下,求購買次數最多的兩個使用者
order_id
user_id
goods
100000 100 蘋果
100001 100 蘋果
100002 101 橘子
100003 102 蘋果
100004 102 香蕉
sql:
SELECT order_id,user_id,COUNT(order_id) AS count FROM order GROUP BY user_id ORDER BY count DESC limit 2
Linux
如何發現web服務慢
top:查看系統效能
Nginx:最後一個欄位加入$request_time
列出php頁面請求時間超過3秒的頁面,並統計其出現的次數,顯示前100條
cat access.log|awk '($NF > 1 && $7~/\.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100
代碼中實現,開頭寫入時間,結尾寫入時間
綜合
1. AES和RSA的區別:
RSA是非對稱式加密,公開金鑰加密,私密金鑰解密, 反之亦然。缺點:運行速度慢,不易於硬體實現。常私密金鑰長度有512bit,1024bit,2048bit,4096bit,長度越長,越安全,但是產生密鑰越慢,加解密也越耗時。
AES對稱式加密,密鑰最長只有256個bit,執行速度快,易於硬體實現。由於是對稱式加密,密鑰需要在傳輸前通訊雙方獲知。
AES加密資料塊分組長度必須為128位元,密鑰長度可以是128位元、192位元、256位元中的任意一個(如果資料區塊及密鑰 長度不足時,會補齊)
總結:採用非對稱式加密演算法管理對稱演算法的密鑰,然後用對稱式加密演算法加密資料,這樣我們就整合了兩類密碼編譯演算法的優點,既實現了加密速度快的優點,又實現了安全方便管理密鑰的優點。
RBAC:角色型存取控制
一個使用者屬於多個角色
角色擁有多個動作的許可權
使用者是否具有某些動作的許可權
表:使用者表、角色表、動作表,使用者角色關聯表、角色動作關聯表
MongoDB
MongoDB資料類型:
String(字串): mongodb中的字串是UTF-8有效。
Integer(整數): 儲存數值。整數可以是32位或64位,具體取決於您的伺服器。
* Boolean(布爾): 儲存布爾(true/false)值。
Double(雙精確度): 儲存浮點值。
Min/ Max keys(最小/最大鍵): 將值與最低和最高BSON元素進行比較。
Arrays(數組): 將數組或列表或多個值儲存到一個鍵中。
Timestamp(時間戳記): 儲存時間戳記。
Object(對象): 嵌入式文檔。
Null (空值): 儲存Null值。
Symbol(符號): 與字串相同,用於具有特定符號類型的語言。
Date(日期): 以UNIX時間格式儲存當前日期或時間。
Object ID(對象ID) : 儲存文檔ID。
Binary data(位元據): 儲存位元據。
Code(代碼): 將JavaScript代碼儲存到文檔中。
Regular expression(Regex): 儲存Regex
演算法
1. 排序演算法
* 快速排序
快速排序是十分常用的高效率的演算法,其思想是:我先選一個尺規,用它把整個隊列過一遍篩選,以保證其左邊的元素都不大於它,其右邊的元素都不小與它function quickSort($arr){ // 擷取數組長度
$length = count($arr); // 判斷長度是否需要繼續二分比較 if($length <= 1){ return $arr; } // 定義基準元素 $base = $arr[0]; // 定義兩個空數組,用於存放和基準元素的比較後的結果 $left = []; $right = []; // 遍曆數組 for ($i=1; $i < $length; $i++) { // 和基準元素作比較 if ($arr[$i] > $base) { $right[] = $arr[$i]; }else { $left[] = $arr[$i]; } } // 然後遞迴分別處理left和right $left = quickSort($left); $right = quickSort($right); // 合并 return array_merge($left,[$base],$right); }
冒泡排序
思路:法如其名,就像冒泡一樣,每次從數組中冒出一個最大的數
比如:2,4,1
第一次冒出4:2,1,4
第二次冒出2:1,2,4
function bubbleSort($arr){ // 擷取數組長度 $length = count($arr); // 第一層迴圈控制冒泡輪次 for ($i=0; $i < $length-1; $i++) { // 內層迴圈控制從第0個索引值和後一個索引值比較,每次冒出一個最大的數 for ($k=0; $k < $length-$i; $k++) { if($arr[$k] > $arr[$k+1]){ $tmp = $arr[$k+1]; $arr[$k+1] = $arr[$k]; $arr[$k] = $tmp; } } } return $arr;}
選擇排序
思路:每次選擇一個相應的元素,然後將其放到指定的位置
function selectSort($arr){ // 實現思路 // 雙重迴圈完成,外層控制輪數,當前的最小值,內層控制比較次數 // 擷取長度 $length = count($arr); for ($i=0; $i < $length - 1; $i++) { // 假設最小值的位置 $p = $i; // 使用假設的最小值和其他值比較,找到當前的最小值 for ($j=$i+1; $j < $length; $j++) { // $arr[$p] 是已知的當前最小值 // 判斷當前迴圈值和已知最小值的比較,當發下更小的值時記錄下鍵,並進行下一次比較 if ($arr[$p] > $arr[$j]) { $p = $j; // 比假設的值更小 } } // 通過內部for迴圈找到了當前最小值的key,並儲存在$p中 // 判斷 日光當前$p 中的鍵和假設的最小值的鍵不一致增將其互換 if ($p != $i) { $tmp = $arr[$p]; $arr[$p] = $arr[$i]; $arr[$i] = $tmp; } } // 返回最終結果 return $arr;}