摘要:由一層函數調用進入下一層函數調用的遞推。此時,中的一個稱為孤兒的類就會收留這個對象。禁止訪問服務器拒絕請求服務器找不到請求的頁面服務器內部錯誤壞的網關一般是網關服務器請求后端服務時,后端服務沒有按照協議正確返回結果。
持續更新。。。。
php 1. 簡述 php 中的 autoloadAutoload 的加載機制,當通過 new 來實例化一個類時,PHP 會通過定義的 autoload 函數加載相應的文件,如果這個類文件使用了 extends 或者 implements 需要用到其他的類文件,php 會重新運行 autoload 去進行類文件的查找和加載,如果發生了兩次對同一類文件的請求,就會報錯。2. 靜態變量及有什么優缺點?
靜態局部變量的特點:3. strtr 和 str_replace 有什么區別,兩者分別用在什么場景下?
1.不會隨著函數的調用和退出而發生變化。
2.靜態局部變量只會初始化一次。
3.靜態屬性只能被初始化為一個字符值或一個常量,不能使用表達式。
4.當多次調用一個函數且要求在調用之間保留某些變量的值時,可考慮采用靜態局部變量。
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():當打印對象時會被直接調用。
__clone():當對象被拷貝時直接調用。
__isset():對不存在或者不可訪問的屬性使用 isset() 或者 empty() 時,__isset() 會被調用;
__destruct():類的析構函數,當該對象的所有引用都被刪除,或者對象被顯式銷毀時執行。
__sleep()執行 serialize() 函數時會調用
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 )6. 遞歸的次數限制
遞歸是一種函數調用自身(直接或間接)的一種機制,這種強大的思想可以把某些復雜的概念變得極為簡單。邏輯上的遞歸可以無次數限制, 但語言執行器或者程序堆棧會限制遞歸的次數.
php 手冊注解:但是要避免遞歸函數/方法調用超過 100-200 層,因為可能會使堆棧崩潰從而使當前腳本終止。 無限遞歸可視為編程錯誤。
遞歸的兩個基本條件:
遞歸的退出條件,這是遞歸能夠正常執行的必要條件,也是保證遞歸能夠正確返回的必要條件。缺乏這個條件,遞歸就會無限進行,直到系統給予的資源耗盡。如果碰到“max nest level of 100 reached”(php 中,超出遞歸限制)是沒有正確的退出條件,導致了遞歸深度過大或者無限遞歸。
遞推過程。由一層函數調用進入下一層函數調用的遞推。
7. 單引號和雙引號的區別雙引號內部變量會解析,單引號則不解析.
雙引號中特殊字符( 之類)會被轉義,單引號中的內容不會被轉義。
執行效率:單引號串中的內容總被認為是普通字符,因此單引號中的內容不會被轉義從而效率更高。
8. array 數組排序并去重;如:$arr = [10,4,6,4,19,3,5];
1、 array_multisort可以用來一次對多個數組進行排序,或者根據某一維或多維對多維數組進行排序。
2、思路:想到的是排序算法(如冒泡) + 去重函數 array_unique
代碼:
function bubbleSort(array $arr){ $count = count($arr); //數組長度 for($i = 1;$i < $count;$i++){ for ($k = 0;$k < $count - $i;$k++){ if ($arr[$k] > $arr[$k+1]){ $temp = $arr[$k]; $arr[$k] = $arr[$k+1]; $arr[$k+1] = $temp; } } } return array_unique($arr); } bubbleSort($arr);9. 面向對象是什么?
是一種程序設計范型,同時也是一種程序開發方法。它將對象作為程序的基本單元,將程序和數據封裝其中,以提高軟件的重用性、靈活性和可擴展性。10. 類和對象的區別及關系
類是定義一系列屬性和操作的模板,而對象則把屬性進行具體化,然后交給類處理。
對象就是數據,對象本身不包含方法。但是對象有一個“指針”指向一個類,這個類里可以有方法。
類和對象是不可分割的,有對象就必定有一個類和其對應,否則這個對象也就成了沒有親人的孩子(有一個特殊情況存在,就是由標量進行強制類型轉換的 object,沒有一個類和它對象。此時,PHP 中的一個稱為“孤兒”的 stdClass 類就會收留這個對象)。
11、for 和 foreach 的區別1、foreach 也叫增強 for 循環,foreach 其實是 for 循環的一個特殊簡化版。
2、foreach 適用于只進行集合或數組遍歷, for 則在較復雜的循環中效率更高。
3、foreach 不能對數組或集合進行修改(添加刪除操作),如果想要修改就要用 for 循環。
所以相比較下來 for 循環更為靈活。
include 和 require 都是引入指定的文件。加上 _once 表示只引入一次,已經引入過的不再引入。
include 在引入不存文件時產生一個警告且腳本還會繼續執行,require 則會導致一個致命性錯誤且腳本停止執行。
include 有返回值,而 require 沒有。
兩者的使用不同:
require 這個函數通常放在 PHP 程序的最前面,PHP 程序在執行前,就會先讀入 require 所指定引入的文件,使它變成 PHP 程序網頁的一部份。常用的函數,亦可以這個方法將它引入網頁中。
include 這個函數一般是放在流程控制的處理部分中。PHP 程序網頁在讀到 include 的文件時,才將它讀進來。這種方式,可以把程序執行時的流程簡單化。
13、isset()、empty()、is_null() 的區別?當變量未定義時,is_null() 是不允許作為參數判斷的,會報 Notice 警告錯誤;
empty ,isset 首先都會檢查變量是否存在,然后對變量值進行檢測。而 is_null 只是直接檢查變量值是否為 null,因此如果變量未定義就會出現錯誤!
isset():僅當 null 和未定義,返回 false;
empty():""、0、"0"、NULL、FALSE、array(),未定義,均返回 false ;
is_null():僅判斷是否為 null,未定義報警告;
變量本身作為參數,與 empty() 一致,但接受未定義變量時,報警告;
""、0、"0"、NULL、FALSE、array() 這幾個中,empty() 和“變量本身作為參數”結果一致,均作為“空”來處理,而 isset() 和 is_null() 僅當是 null 時,才作為“空”來處理(注意 false 并不會被認為是空)
14、常用的 php 數組函數及其作用array_values($arr):獲得數組的值
array_keys($arr):獲得數組的鍵名
array_flip($arr):數組中的值與鍵名互換(如果有重復前面的會被后面的覆蓋)
in_array("apple",$arr): 在數組中檢索apple
array_search("apple",$arr): 在數組中檢索apple ,如果存在返回鍵名
array_push($arr,"apple","pear"):將一個或多個元素壓入數組棧的末尾(入棧),返回入棧元素的個數
array_pop($arr):將數組棧的最后一個元素彈出(出棧)
array_shift($arr):數組中的第一個元素移出并作為結果返回(數組長度減1,其他元素向前移動一位,數字鍵名改為從零技術,文字鍵名不變)
array_unshift($arr,"a",array(1,2)):在數組的開頭插入一個或多個元素
echo date("Y-m-d H:i:s",strtotime("-1 day",time()));16、php 中 error_reporting 函數的作用
error_reporting() 設置 PHP 的報錯級別并返回當前級別。
17、寫一個函數、盡可能高效的從一個標準 url 中取出文件的擴展名,如 http://www.abcs.com/abc/de/fg... 中的 php 和 .phpfunction getExt2($url) { $urlinfo = pathinfo($url); if(isset($urlinfo["extension"])) { if(strpos($urlinfo["extension"],"?") !== false) return explode("?",$urlinfo["extension"])[0]; else return $urlinfo["extension"]; } return "no extension"; }18、實現一個字符串反轉函數
public function strrev($str) { $newstr = ""; $len = strlen($str); //獲取字符串長度 for($i = $len; $i >= 0; $i--) { $newstr .= $str{$i}; //從最大下標拼接至最小即是反轉了 } return $newst; }19、寫出常用的 http 狀態碼及其作用
Name | Academy | score |
---|---|---|
200 | OK | 請求成功,服務器成功返回網頁 |
301 | Moved Permanently | 永久跳轉,請求的網頁已永久跳轉到新位置。 |
403 | Forbidden | 禁止訪問,服務器拒絕請求 |
404 | Not Found | 服務器找不到請求的頁面 |
500 | Internal Server Error | 服務器內部錯誤 |
502 | Bad Gateway | 壞的網關,一般是網關服務器請求后端服務時,后端服務沒有按照 http 協議正確返回結果。 |
503 | Service Unavailable | 服務當前不可用,可能因為超載或停機維護。 |
504 | Gateway Timeout | 網關超時,一般是網關服務器請求后端服務時,后端服務沒有在特定的時間內完成服務。 |
function check_email($email){ $preg = "/^w+([-_.]w+)*@w+([-_.]w+)*(.w+){0,3}$/i"; preg_match($preg,$email,$res); return $res;//匹配成功返回1,匹配失敗返回0 }21、mvc 的理解
MVC 是模型( model ) -視圖( view )-控制器( controller )的縮寫,一種軟件設計典范,用一種業務邏輯、數據、界面顯示分離的方法組織代碼,將業務邏輯聚集到一個部件里面,在改進和個性化定制界面及用戶交互的同時,不需要重新編寫業務邏輯。
22、 post 和 patch 的區別 23、php內存回收機制php的內存管理機制是:預先給出一塊空間,用來存儲變量,當空間不夠時,再申請一塊新的空間。
1.存儲變量名,存在符號表。
2.變量值存儲在內存空間。
3.在刪除變量的時候,會將變量值存儲的空間釋放,而變量名所在的符號表不會減小。
雖然刪除后內存變小了,但還是比沒定義變量之前時大,這是因為雖然刪除了變量的值,但變量名沒有被刪除。
php垃圾回收機制
PHP 變量存儲是存儲在一個 zval 容器里面的
1.類型 2.值 3. is_ref 代表是否有地址引用 4.refcount 指向該值的變量數量
垃圾回收:
1.在 5.2 版本或之前版本,PHP會根據 refcount 值來判斷是不是垃圾。如果 refcount 值為 0,PHP 會當做垃圾釋放掉。這種回收機制有缺陷,對于環狀引用的變量無法回收
2.在 5.3 之后版本改進了垃圾回收機制。如果發現一個zval容器中的refcount在增加,說明不是垃圾。如果發現一個zval容器中的refcount在減少,如果減到了 0,直接當做垃圾回收。如果發現一個 zval 容器中的 refcount 在減少,并沒有減到 0,PHP 會把該值放到緩沖區,當做有可能是垃圾的懷疑對象。當緩沖區達到了臨界值,PHP 會自動調用一個方法去遍歷每一個值,如果發現是垃圾就清理
24、
laravel
優點: 使用人數全球第一,文檔齊全,框架結構組織清晰,大量第三方擴展包供引用,適合大型網站協同開發,提供的 artisan 開發工具開發效率高。composer 擴展自動加載,中間件
缺點:稍復雜,上手比一般框架要慢;大量引用第三方包,但某些場景下我們只使用類中的部分方法,代碼顯得有些冗余
ThinkPHP
優點:輕量級 PHP 開發框架,易于上手,有豐富的中文文檔;框架的兼容性較強,PHP4和PHP5完全兼容;適合中小項目的開發,學習成本低,社區活躍度高
缺點:對Ajax的支持不是很好;缺少面向對象的設計,5的版本基本面向對象,框架社區相關的輔助工具少;目錄結構混亂,需要花時間整理;
Yaf
優點:用C語言開發的PHP框架, 相比原生的PHP, 幾乎不會帶來額外的性能開銷.不需要編譯, 在PHP啟動的時候加載, 并常駐內存.更快的執行速度, 更少的內存占用.
缺點:C的擴展,如果程序有漏洞,作者未及時更新,使用者在不懂C的情況下,只能看著網站受辱或者祈禱,或者關閉網站.
2、 laravel 依賴注入依賴注入,實質是通過構造函數或者某些情況下通過 setter 方法將類依賴注入到類中。通俗的講就是一個類中要多次引入某個 model 的時候,可以在構造函數中一次引入,類中的方法直接調用即可。3、依賴注入的原理
依賴注入原理利用類方法反射,取得參數類型,然后利用容器構造好實例。然后再使用回調函數調起。
注入對象構造函數不能有參數。否則會報錯。Missing argument 1
依賴注入故然好,但它必須要由 Router 類調起,否則直接用 new 方式是無法實現注入的。所以這就為什么只有 Controller 、Job 類才能用這個特性了。
4、 ComposerComposer 是一款跨平臺的 PHP 依賴管理工具。讓 組件式編程 成為可能,編寫軟件時,就如拼接樂高玩具一樣。極大的提高了開發的效率和代碼的可復用性,解放了生產力。5. laravel 生命周期Laravel 使用 Composer 來作為擴展包的管理工具。
Laravel 應用的所有請求入口都是 public/index.php 文件。index.php 文件載入 Composer 生成的自動加載設置,然后從 bootstrap/app.php 腳本獲取 Laravel 應用實例,Laravel 的第一個動作就是創建服務容器實例。
請求被發送到 HTTP 內核或 Console 內核(分別用于處理 Web 請求和 Artisan 命令),這取決于進入應用的請求類型。
內核啟動過程中最重要的動作之一就是為應用載入服務提供者,應用的所有服務提供者都被配置在 config/app.php 配置文件的 providers 數組中。首先,所有提供者的 register 方法被調用,然后,所有提供者被注冊之后,boot 方法被調用。
一旦應用被啟動并且所有的服務提供者被注冊,Request 將會被交給路由器進行分發,路由器將會分發請求到路由或控制器,同時運行所有路由指定的中間件。
服務提供者是啟動 Laravel 應用中最關鍵的部分,應用實例被創建后,服務提供者被注冊,請求被交給啟動后的應用進行處理,整個過程就是這么簡單!
int(M) M 指示最大顯示寬度,在數據庫里面存儲的都是4個字節的長度。最大有效顯示寬度是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 文件出現損壞,導致主從不一致。
mysq l本身的 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 26.事務的特性
原子性(Atomicity)
原子性是指事務包含的所有操作要么全部成功,要么全部失敗回滾。
一致性(Consistency)
一致性是指事務執行之前和執行之后都必須處于一致性狀態。
隔離性(Isolation)
隔離性是當多個用戶并發訪問數據庫時,比如操作同一張表時,數據庫為每一個用戶開啟的事務,不能被其他事務的操作所干擾,多個并發事務之間要相互隔離。
持久性(Durability)
持久性是指一個事務一旦被提交,對數據庫中的數據的改變就是永久性的7.事務的隔離級別和高并發
如果不考慮事務的隔離性,會發生的幾種問題:
臟讀 (dirty read) :指在一個事務處理過程里讀取了另一個未提交的事務中的數據。
不可重復讀 (unrepeated read):指在對于數據庫中的某個數據,一個事務范圍內多次查詢卻返回了不同的數據值,這是由于在查詢間隔,被另一個事務修改并提交了。
幻讀(phantom read):一個事務執行兩次查詢,第二次查詢比第一次多出或少一些數據,造成兩次結果不一致。只是另一個事務在這兩次查詢中間插入或者 刪除了數據造成的。
第一類丟失更新(lost update): 在完全未隔離事務的情況下,兩個事物更新同一條數據資源,某一事物異常終止,回滾造成第一個完成的更新也同時丟失 。
第二類丟失更新(second lost updates):是不可重復讀的特殊情況,如果兩個事務都讀取同一行,然后兩個都進行寫操作,并提交,第一個事務所做的改變就會丟失。
四種事務隔離級別:
1. Serializable 串行化
2. Repeatable Read 可重復讀
3. Read Commited 可讀已提交
4. Read Uncommited 可讀未提交
并發控制:
數據庫系統采用不同的鎖類型來實現以上四種隔離級別,具體的實現過程對用戶是透明的。用戶關心的是如何選擇隔離級別。
對于多數應用程序,可以優先考慮把數據庫系統的隔離級別設為 Read Committed,它能夠避免臟讀,而且具有較好的并發性能。
每個數據庫連接都有一個全局變量 @@tx_isolation ,表示當前的事務隔離級別。JDBC 數據庫連接使用數據庫系統默認的隔離級別。
在 Hibernate 的配置文件中可以顯示地設置隔離級別。每一種隔離級別對應著一個正整數。
需要注意的是,在受管理環境中,如果 Hibernate 使用的數據庫連接來自于應用服務器提供的數據源,Hibernate不會改變這些連接的事務隔離級別。在這種情況下,應該通過修改應用服務器的數據源配置來修改隔離級別。
當數據庫系統采用 Red Committed 隔離級別時,會導致不可重復讀和第二類丟失更新的并發問題,在可能出現這種問題的場合。可以在應用程序中采用悲觀鎖或樂觀鎖來避免這類問題。
mysql查看當前事務隔離級別:select @@tx_isolation8. 悲觀鎖和樂觀鎖
設置事務隔離級別:set [glogal | session] transaction isolation level 隔離級別名稱;或set tx_isolation=’隔離級別名稱;’
悲觀鎖
正如其名,它指的是對數據被外界(包括本系統當前的其他事務,以及來自外部系統的事務處理)修改持保守態度,在整個數據處理過程中,將數據處于鎖定狀態。基于數據庫的鎖機制實現(也只有數據庫層提供的鎖機制才能真正保證數據訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無法保證外部系統不會修改數據)。
在Hibernate使用悲觀鎖十分容易,但實際應用中悲觀鎖是很少被使用的,因為它每次發送的SQL語句都會加上"for update"用于告訴數據庫鎖定相關數據,大大限制了并發性,數據庫性能的大量開銷
樂觀鎖
樂觀鎖,大多是基于數據版本( Version )記錄機制實現。何謂數據版本?即為數據增加一個版本標識,在基于數據庫表的版本解決方案中,一般是通過為數據庫表增加一個 "version" 字段來實現。
樂觀鎖的工作原理:讀取出數據時,將此版本號一同讀出,之后更新時,對此版本號加一。此時,將提交數據的版本數據與數據庫表對應記錄的當前版本信息進行比對,如果提交的數據版本號大于數據庫表當前版本號,則予以更新,否則認為是過期數據。
概念:用戶可以在多個列上建立索引,這種索引叫做復合索引(組合索引);10. like 的優化復合索引在數據庫操作期間所需的開銷更小,可以代替多個單一索引;
窄索引是指索引列為1-2列的索引,寬索引也就是索引列超過2列的索引;
設計索引的一個重要原則就是能用窄索引不用寬索引,因為窄索引往往比組合索引更有效;
like寫法一般為 select cat from animal where name like "%貓%"
用 explain 解釋來看 sql 語句并沒有運用索引(name 已經創建索引),而是全表掃描。
盡量不要使用 like "%..%"
對于 like "..%.." (不以 % 開頭), 對于 like "%..." 的 (不以 % 結尾),加個 reverse 函數,又可以用上索引了"(需要反向索引的支持)SQL> select * from test_like where reverse(object_name)like reverse("%AS");
使用locate函數代替like
語法一 LOCATE(substr,str)返回字符串substr中第一次出現子字符串的位置 str。
語法二:LOCATE(substr,str,pos)返回 substr 在 str 中第一次出現的位置,如果 substr 在 str 中不存在,返回值為 0 。如果pos存在,返回 substr 在 str 第pos個位置后第一次出現的位置,如果 substr 在 str 中不存在,返回值為0。
mysql 優化sql 語句優化
索引優化
選擇合適的存儲引擎
字段選擇合適的數據類型
對表進行水平或者垂直拆分
針對存儲引擎的優化
磁盤 I/O 優化
負載均衡
主從復制
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
代碼中實現,開頭寫入時間,結尾寫入時間
2. 自動腳本crond 是 linux 下用來周期性的執行某種任務或等待處理某些事件的一個守護進程。
系統任務調度:系統周期性所要執行的工作,比如寫緩存數據到硬盤、日志清理等。在/etc目錄下有一個 crontab 文件,這個就是系統任務調度的配置文件。
* 用戶任務調度:用戶定期要執行的工作,比如用戶數據備份、定時郵件提醒等。用戶可以使用 crontab 工具來定制自己的計劃任務。所有用戶定義的 crontab 文件都被保存在 /var/spool/cron目錄中。其文件名與用戶名一致。
語法:
minute hour day month week command
還可以使用以下特殊字符:
星號(*):代表所有可能的值,例如 month 字段如果是星號,則表示在滿足其它字段的制約條件后每月都執行該命令操作。
逗號(,):可以用逗號隔開的值指定一個列表范圍,例如,“1,2,5,7,8,9”
中杠(-):可以用整數之間的中杠表示一個整數范圍,例如“2-6”表示“2,3,4,5,6”
正斜線(/):可以用正斜線指定時間的間隔頻率,例如“0-23/2”表示每兩小時執行一次。同時正斜線可以和星號一起使用,例如*/10,如果用在 minute 字段,表示每十分鐘執行一次。
3.Nginx負載均衡方案常用的幾種方式:
輪詢 (Round Robin)
根據Nginx配置文件中的順序,每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器 down 掉,能自動剔除。
upstream web { server server1; server server2; }
最少連接
Web 請求會被轉發到連接數最少的服務器上。least_conn 算法很簡單,首選遍歷后端集群,比較每個后端的 conns/weight,選取該值最小的后端。如果有多個后端的 conns/weight 值同為最小的,那么對它們采用加權輪詢算法。
upstream web { least_conn; server server1; server server2; }
IP地址哈希
同一客戶端連續的 Web 請求可能會被分發到不同的后端服務器進行處理,因此如果涉及到會話 Session,可以使用基于 IP 地址哈希的負載均衡方案。這樣的話,同一客戶端連續的 Web 請求都會被分發到同一服務器進行處理(每個請求按訪問 ip 的 hash 結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決 session 的問題)。
upstream web { ip_hash; server server1; server server2; }
權重 (Weighted Load Balancing)
可以根據服務器的性能狀況有選擇的分發 web 請求。指定輪詢幾率,weight 越高、訪問比率越大。weight=2,意味著每接收到3個請求,前2個請求會被分發到第一個服務器,第3個請求會分發到第二個服務器,其它的配置同輪詢配置。
upstream web { server server1 weight=2; server server2; }
基于權重的負載均衡和基于 IP 地址哈希的負載均衡可以組合在一起使用。
fair(第三方)
按后端服務器的響應時間來分配請求,響應時間短的優先分配。
upstream web { server server1; server server2; fair; }
url_hash(第三方)
按訪問 url 的 hash 結果來分配請求,使每個 url 定向到同一個后端服務器,后端服務器為緩存時比較有效。 hash_method 是使用的 hash 算法
upstream web {
server server1:3128; server server1:3128; hash $request_uri; hash_method crc32;
}
每個設備的狀態設置為:4. Keepalived
1.down 表示單前的 server 暫時不參與負載
2.weight 默認為1.weight 越大,負載的權重就越大。
3.max_fails:允許請求失敗的次數默認為1.當超過最大次數時,返回 proxy_next_upstream 模塊定義的錯誤
4.fail_timeout:max_fails 次失敗后,暫停的時間。
5.backup: 其它所有的非 backup 機器 down 或者忙的時候,請求 backup 機器。所以這臺機器壓力會最輕。sorry server 提供非業務功能。
Keepalived是通過VRRP(虛擬路由器冗余協議)協議實現高可用功能的。VRRP 出現的目的就是為了解決靜態路由單點故障問題的,它能夠保證當個別節點宕機時,整個網絡可以不間斷地運行。5.vi 和 vim 的區別
它們都是多模式編輯器,不同的是 vim 是 vi 的升級版本,它不僅兼容 vi 的所有指令,而且還有一些新的特性在里面。vim 的這些優勢主要體現在以下幾個方面:
1、多級撤消
我們知道在 vi 里,按 u 只能撤消上次命令,而在 vim 里可以無限制的撤消。
2、易用性
vi只能運行于 unix 中,而 vim 不僅可以運行于 unix,windows ,mac 等多操作平臺。
3、語法加亮
vim 可以用不同的顏色來加亮你的代碼。
4、可視化操作
就是說 vim 不僅可以在終端運行,也可以運行于 x window、 mac os、 windows。
5、對 vi 的完全兼容
某些情況下,你可以把 vim 當成 vi 來使用。vi 和 vim 都是 Linux 中的編輯器,不同的是 vim 比較高級,可以視為 vi 的升級版本。vi 使用于文本編輯,但是 vim 更適用于 coding。6. awk 命令
AWK是一種處理文本文件的語言,是一個強大的文本分析工具。通常,awk 是以文件的一行為處理單位的。awk 每接收文件的一行,然后執行相應的命令,來處理文本。
語法: awk "{pattern + action}" {filenames}
pattern 表示 AWK 在數據中查找的內容,而 action 是在找到匹配內容時所執行的一系列命令。花括號({})不需要在程序中始終出現,但它們用于根據特定的模式對一系列指令進行分組。 pattern就是要表示的正則表達式,用斜杠括起來。
RSA 是非對稱加密,公鑰加密,私鑰解密, 反之亦然。缺點:運行速度慢,不易于硬件實現。常私鑰長度有512bit,1024bit,2048bit,4096bit,長度越長,越安全,但是生成密鑰越慢,加解密也越耗時。
AES 對稱加密,密鑰最長只有256個 bit,執行速度快,易于硬件實現。由于是對稱加密,密鑰需要在傳輸前通訊雙方獲知。
AES加密數據塊分組長度必須為128比特,密鑰長度可以是128比特、192比特、256比特中的任意一個(如果數據塊及密鑰 長度不足時,會補齊)
總結:采用非對稱加密算法管理對稱算法的密鑰,然后用對稱加密算法加密數據,這樣我們就集成了兩類加密算法的優點,既實現了加密速度快的優點,又實現了安全方便管理密鑰的優點。2. 一次完整的 http 請求詳解
客戶端輸入 URL 。
客戶端檢測緩存(有緩存且較新,客戶端直接讀取本地緩存進行資源展示,有緩存但是不新,準備 http 請求包,發送至服務端進行緩存校驗)。
提取請求首部 HOST通過 DNS 域名解析獲取服務 IP(DNS 緩存遞歸等)。
通過 IP 與默認端口創建 TCP 連接,進行 http 請求報文數據發送,其中重點就三次握手進行描述(客戶端向服務端發送 syn,服務端向客戶端發送 syn、ack,客戶端向服務端發送 syn,ack,data)。
服務端程序接受請求,定向到請求路徑處理程序,準備http響應。
通過建立的 tcp 連接來返回相關的 http 響應報文及 http 狀態信息,然后根據實際情況看是否關閉連接( Connection的keep-alive )。
TCP 連接關閉經歷 4 次握手。
客戶端拿到 http 響應的報文信息,經過一系列前端處理過程最終將請求的資源進行展示。
3. cookie 和 session 的區別和用法。session 鎖cookie 數據存放在客戶的瀏覽器上,session數據放在服務器上.
cookie 不是很安全,別人可以分析存放在本地的 COOKIE 并進行 COOKIE 欺騙,考慮到安全應當使用 session。
session 會在一定時間內保存在服務器上。當訪問增多,會比較占用你服務器的性能考慮到減輕服務器性能方面,應當使用 COOKIE。
單個 cookie 保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個 cookie。(Session 對象沒有對存儲的數據量的限制,其中可以保存更為復雜的數據類型)
session 鎖
php 的 session 默認用文件存儲,當請求一個需要操作 session 的 php 文件(session_start())時,這個文件是會被第一個操作 session 的進程鎖定,導致其他請求阻塞。其他請求會掛起在 session_start() 直到s ession文件解鎖。這樣保證了讀取-寫入,讀取-寫入的順序。對數據流來說很理想,但是,對于目前這種頁面大量應用ajax的情況,所有請求排隊處理,將大大加大頁面展現的耗時,甚至出現請求超時等不可用故障。4. XSS、CSRF、SSRF、SQL 注入原理
解決:由于鎖定的 session 文件直到腳本執行結束或者 session 正常關閉才會解鎖,為了防止大量的 php 請求(需要使用 $_SESSION 數據)被鎖定,可以在寫完 session 后馬上關閉(使用session_write_close()),這樣就釋放了鎖;
Memcache 或者 Redis 做 session 的存儲,是能解決“鎖定”的問題,但處理不好會導致連接數飆高(在 session 操作后如果有耗時操作,連接是不回收的,可以主動在 session 寫操作完成后做 session_write_close() 操作);
XSS:跨站腳本一種網站應用程序的安全漏洞攻擊,是代碼注入的一種。它允許惡意用戶將代碼注入到網頁上。通常包含了 HTML 以及用戶端腳本語言。防御:頁面上直接輸出的所有不確定(用戶輸入)內容都進行 html 轉義;對用戶輸入內容格式做校驗;script 腳本中不要使用不確定的內容;
CSRF:跨站請求偽造是一種挾制用戶在當前已登錄的 Web 應用程序上執行非本意的操作的攻擊方法;防御:驗證 HTTP Referer 字段;在請求地址中(或 HTTP 頭中)添加 token 并驗證;
SSRF:模擬服務器對其他服務器資源進行請求,沒有做合法性驗證。構造惡意內網IP做探測,或者使用其余所支持的協議對其余服務進行攻擊。防御:禁止跳轉,限制協議,內外網限制,URL 限制。繞過:使用不同協議,針對IP,IP 格式的繞過,針對 URL,惡意 URL 增添其他字符,@之類的。301跳轉 + dns rebindding。
SQL注入:是通過把 SQL 命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,欺騙服務器執行惡意的 SQL 命令。防御:過濾特殊符號特殊符號過濾或轉義處理(addslashes函數);綁定變量,使用預編譯語句;
5. NPM 、Yarn 概念NPM 是 Node.js(一個基于 Google V8 引擎的 JavaScript 運行環境)的包管理和分發工具。
Yarn 是 Facebook 在 2016 年 10 月開源的一個新的包管理器,用于替代現有的 NPM 客戶端或者其他兼容 NPM 倉庫的包管理工具。Yarn 在保留 NPM 原有工作流特性的基礎上,使之變得更快、更安全、更可靠。
String(字符串): mongodb 中的字符串是 UTF-8 有效的。
Integer(整數): 存儲數值。整數可以是 32 位或 64 位,具體取決于您的服務器。
* Boolean(布爾): 存儲布爾( true/false )值。
Arrays(數組): 將數組或列表或多個值存儲到一個鍵中。
Timestamp(時間戳): 存儲時間戳。
Object(對象): 嵌入式文檔。
Null (空值): 存儲 Null 值。
Date(日期): 以 UNIX 時間格式存儲當前日期或時間。
* 快速排序
快速排序:我先選一個標尺,用它把整個隊列過一遍篩選,以保證其左邊的元素都不大于它,其右邊的元素都不小與它
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; }
優點:
1、讀寫性能優異2、支持數據持久化,支持 AOF 和 RDB 兩種持久化方式
3、支持主從復制,主機會自動將數據同步到從機,可以進行讀寫分離。
4、數據結構豐富:除了支持 string 類型的 value 外還支持 string、hash、set、sortedset、list等數據結構。
缺點:2、redis 的應用場景
1、 Redis 不具備自動容錯和恢復功能,主機從機的宕機都會導致前端部分讀寫請求失敗,需要等待機器重啟或者手動切換前端的 IP 才能恢復。2、 主機宕機,宕機前有部分數據未能及時同步到從機,切換IP后還會引入數據不一致的問題,降低了系統的可用性。
3、 redis 的主從復制采用全量復制,復制過程中主機會 fork 出一個子進程對內存做一份快照,并將子進程的內存快照保存為文件發送給從機,這一過程需要確保主機有足夠多的空余內存。若快照文件較大,對集群的服務能力會產生較大的影響,而且復制過程是在從機新加入集群或者從機和主機網絡斷開重連時都會進行,也就是網絡波動都會造成主機和從機間的一次全量的數據復制,這對實際的系統運營造成了不小的麻煩。
4、 Redis 較難支持在線擴容,在集群容量達到上限時在線擴容會變得很復雜。為避免這一問題,運維人員在系統上線時必須確保有足夠的空間,這對資源造成了很大的浪費。
* 緩存——熱數據
熱點數據(經常會被查詢,但是不經常被修改或者刪除的數據)
計數器
諸如統計點擊數等應用。由于單線程,可以避免并發問題,保證不會出錯,而且 100% 毫秒級性能!別忘記持久化,畢竟是 redis 只是存了內存!
* 命令:INCRBY
隊列
相當于消息系統。由于 redis 把數據添加到隊列是返回添加元素在隊列的第幾位,所以可以做判斷用戶是第幾個訪問這種業務。隊列不僅可以把并發請求變成串行,并且還可以做隊列或者棧使用
分布式鎖與單線程機制
驗證前端的重復請求(可以自由擴展類似情況),可以通過 redis 進行過濾:每次請求將request Ip、參數、接口等 hash 作為 key 存儲 redis(冪等性請求),設置多長時間有效期,然后下次請求過來的時候先在 redis 中檢索有沒有這個 key,進而驗證是不是一定時間內過來的重復提交.
秒殺系統,基于 redis 是單線程特征,防止出現數據庫“爆破”
全局增量 ID 生成,類似“秒殺”
最新列表
例如新聞列表頁面最新的新聞列表,如果總數量很大的情況下,盡量不要使用 select a from A limit 10 這種 low 貨,嘗試 redis 的 LPUSH命令構建 List,一個個順序都塞進去就可以啦。不過萬一內存清掉了咋辦?也簡單,查詢不到存儲 key 的話,用 mysql 查詢并且初始化一個 List 到 redis 中就好了。
排行榜
誰得分高誰排名往上。命令:ZADD(有續集,sorted set)
3、MongoDB 優缺點缺點
1、 不支持事務操作
2、 占用空間過大
3、 MongoDB 沒有如 MySQL 那樣成熟的維護工具
4、 無法進行關聯表查詢,不適用于關系多的數據
5、 復雜聚合操作通過 mapreduce 創建,速度慢
6、 模式自由,自由靈活的文件存儲格式帶來的數據錯誤優點
1、 文檔結構的存儲方式,能夠更便捷的獲取數據
2、 內置 GridFS,支持大容量的存儲
3、 內置 Sharding,分片簡單
4、 海量數據下,性能優越
5、 支持自動故障恢復(復制集)
參考:https://www.cnblogs.com/shiji...
內容為本人收集整理,如有表達錯誤歡迎指正。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/28409.html
摘要:個人也建議不要滿足于自己當下所知道的,多去拓展自己,多去學新的東西。作為一個面試者來說,知識點的記憶準備為的是更好的應對面試中技術面中問到的各種問題。 你好,是我琉憶——PHP程序員面試筆試系列圖書的作者。 隨著越來越多的人開始邁入PHP開發工程師的隊列,不管是一個PHP新手還是一個有一兩年開發經驗的PHPer都不得不去面對找工作前面試這件事。 我現在以個人對面試的經歷和見解來全面的對...
摘要:最近面試了不少公司,正好把記得的問題做個總結。抽象類的接口的區別,不在于編程實現,而在于程序設計模式的不同。一般來講,抽象用于不同的事物,而接口用于事物的行為。 最近面試了不少公司,正好把記得的問題做個總結。 本文 github 會持續更新 公眾號 搜索 蘇生不惑 或者掃二維碼關注,每周更新。 showImg(https://segmentfault.com/img/bVbsYyM?w...
摘要:最近面試了不少公司,正好把記得的問題做個總結。抽象類的接口的區別,不在于編程實現,而在于程序設計模式的不同。一般來講,抽象用于不同的事物,而接口用于事物的行為。 最近面試了不少公司,正好把記得的問題做個總結。 本文 github 會持續更新 公眾號 搜索 蘇生不惑 或者掃二維碼關注,每周更新。 showImg(https://segmentfault.com/img/bVbsYyM?w...
閱讀 720·2023-04-25 20:32
閱讀 2265·2021-11-24 10:27
閱讀 4519·2021-09-29 09:47
閱讀 2241·2021-09-28 09:36
閱讀 3633·2021-09-22 15:27
閱讀 2756·2019-08-30 15:54
閱讀 370·2019-08-30 11:06
閱讀 1271·2019-08-30 10:58