php面試總結

持續更新。。。。php

php

1. 簡述 php 中的 autoload

Autoload 的加載機制, 當經過 new 來實例化一個類時,PHP 會經過定義的 autoload 函數加載相應的文件,若是這個類文件使用了 extends 或者 implements 須要用到其餘的類文件,php 會從新運行 autoload 去進行類文件的查找和加載,若是發生了兩次對同一類文件的請求,就會報錯。

2. 靜態變量及有什麼優缺點?

靜態局部變量的特色:
1.不會隨着函數的調用和退出而發生變化。
2.靜態局部變量只會初始化一次。
3.靜態屬性只能被初始化爲一個字符值或一個常量,不能使用表達式。
4.當屢次調用一個函數且要求在調用之間保留某些變量的值時,可考慮採用靜態局部變量。

3. strtrstr_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():當打印對象時會被直接調用。
  • __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];html

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. 單引號和雙引號的區別

  • 雙引號內部變量會解析,單引號則不解析.
  • 雙引號中特殊字符( \r\n 之類)會被轉義,單引號中的內容不會被轉義。
  • 執行效率:單引號串中的內容總被認爲是普通字符,所以單引號中的內容不會被轉義從而效率更高。

8. array 數組排序並去重;

如:$arr = [10,4,6,4,19,3,5];mysql

  • 一、 array_multisort能夠用來一次對多個數組進行排序,或者根據某一維或多維對多維數組進行排序。
  • 二、思路:想到的是排序算法(如冒泡) + 去重函數 array_unique

代碼:linux

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. 類和對象的區別及關係

  1. 類是定義一系列屬性和操做的模板,而對象則把屬性進行具體化,而後交給類處理。
  2. 對象就是數據,對象自己不包含方法。可是對象有一個「指針」指向一個類,這個類裏能夠有方法。
  3. 類和對象是不可分割的,有對象就一定有一個類和其對應,不然這個對象也就成了沒有親人的孩子(有一個特殊狀況存在,就是由標量進行強制類型轉換的 object,沒有一個類和它對象。此時,PHP 中的一個稱爲「孤兒」的 stdClass 類就會收留這個對象)。

十一、for 和 foreach 的區別

一、foreach 也叫加強 for 循環,foreach 實際上是 for 循環的一個特殊簡化版。
二、foreach 適用於只進行集合或數組遍歷, for 則在較複雜的循環中效率更高。
三、foreach 不能對數組或集合進行修改(添加刪除操做),若是想要修改就要用 for 循環。
因此相比較下來 for 循環更爲靈活。laravel

十二、語句 include 和 require 的區別是什麼?

  • include 和 require 都是引入指定的文件。加上 _once 表示只引入一次,已經引入過的再也不引入。
  • include 在引入不存文件時產生一個警告且腳本還會繼續執行,require 則會致使一個致命性錯誤且腳本中止執行。
  • include 有返回值,而 require 沒有。

二者的使用不一樣:web

  • require 這個函數一般放在 PHP 程序的最前面,PHP 程序在執行前,就會先讀入 require 所指定引入的文件,使它變成 PHP 程序網頁的一部份。經常使用的函數,亦能夠這個方法將它引入網頁中。
  • include 這個函數通常是放在流程控制的處理部分中。PHP 程序網頁在讀到 include 的文件時,纔將它讀進來。這種方式,能夠把程序執行時的流程簡單化。

1三、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 並不會被認爲是空)

1四、經常使用的 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)):在數組的開頭插入一個或多個元素ajax

1五、php 打印前一天的日期,(格式:2015-01-01 11:11:00)

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

1六、php 中 error_reporting 函數的做用

error_reporting() 設置 PHP 的報錯級別並返回當前級別。正則表達式

1七、寫一個函數、儘量高效的從一個標準 url 中取出文件的擴展名,如 http://www.abcs.com/abc/de/fg... 中的 php 和 .php

function 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';
}

1八、實現一個字符串反轉函數

public function strrev($str)
{
    $newstr = '';
    $len = strlen($str); //獲取字符串長度
    
    for($i = $len; $i >= 0; $i--)
    {
        $newstr .= $str{$i}; //從最大下標拼接至最小便是反轉了
    }
    return $newst;
}

1九、寫出經常使用的 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 網關超時,通常是網關服務器請求後端服務時,後端服務沒有在特定的時間內完成服務。

20、寫一個驗證電子郵箱格式是否正確的函數

function check_email($email){

        $preg = "/^\w+([-_.]\w+)*@\w+([-_.]\w+)*(\.\w+){0,3}$/i";
        
        preg_match($preg,$email,$res);
        
        return $res;//匹配成功返回1,匹配失敗返回0
    }

2一、mvc 的理解

MVC 是模型( model ) -視圖( view )-控制器( controller )的縮寫,一種軟件設計典範,用一種業務邏輯、數據、界面顯示分離的方法組織代碼,將業務邏輯彙集到一個部件裏面,在改進和個性化定製界面及用戶交互的同時,不須要從新編寫業務邏輯。redis

2二、 post 和 patch 的區別

2三、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 會自動調用一個方法去遍歷每個值,若是發現是垃圾就清理

2四、


laravel

1. laravel 和其餘框架對比的優缺點

  • laravel

    • 優勢: 使用人數全球第一,文檔齊全,框架結構組織清晰,大量第三方擴展包供引用,適合大型網站協同開發,提供的 artisan 開發工具開發效率高。composer 擴展自動加載,中間件
    • 缺點:稍複雜,上手比通常框架要慢;大量引用第三方包,但某些場景下咱們只使用類中的部分方法,代碼顯得有些冗餘
  • ThinkPHP

    • 優勢:輕量級 PHP 開發框架,易於上手,有豐富的中文文檔;框架的兼容性較強,PHP4和PHP5徹底兼容;適合中小項目的開發,學習成本低,社區活躍度高
    • 缺點:對Ajax的支持不是很好;缺乏面向對象的設計,5的版本基本面向對象,框架社區相關的輔助工具少;目錄結構混亂,須要花時間整理;
  • Yaf

    • 優勢:用C語言開發的PHP框架, 相比原生的PHP, 幾乎不會帶來額外的性能開銷.不須要編譯, 在PHP啓動的時候加載, 並常駐內存.更快的執行速度, 更少的內存佔用.
    • 缺點:C的擴展,若是程序有漏洞,做者未及時更新,使用者在不懂C的狀況下,只能看着網站受辱或者祈禱,或者關閉網站.

二、 laravel 依賴注入

依賴注入,實質是經過構造函數或者某些狀況下 經過 setter 方法將類依賴注入到類中。通俗的講就是一個類中要屢次引入某個 model 的時候,能夠在構造函數中一次引入,類中的方法直接調用便可。

三、依賴注入的原理

  • 依賴注入原理利用類方法反射,取得參數類型,而後利用容器構造好實例。而後再使用回調函數調起。
  • 注入對象構造函數不能有參數。不然會報錯。Missing argument 1
  • 依賴注入故然好,但它必需要由 Router 類調起,不然直接用 new 方式是沒法實現注入的。因此這就爲何只有 Controller 、Job 類才能用這個特性了。

四、 Composer

Composer 是一款跨平臺的 PHP 依賴管理工具。讓 組件式編程 成爲可能,編寫軟件時,就如拼接樂高玩具同樣。極大的提升了開發的效率和代碼的可複用性,解放了生產力。

Laravel 使用 Composer 來做爲擴展包的管理工具。

5. laravel 生命週期

  • Laravel 應用的全部請求入口都是 public/index.php 文件。index.php 文件載入 Composer 生成的自動加載設置,而後從 bootstrap/app.php 腳本獲取 Laravel 應用實例,Laravel 的第一個動做就是建立服務容器實例
  • 請求被髮送到 HTTP 內核或 Console 內核(分別用於處理 Web 請求和 Artisan 命令),這取決於進入應用的請求類型。
  • 內核啓動過程當中最重要的動做之一就是爲應用載入服務提供者,應用的全部服務提供者都被配置在 config/app.php 配置文件的 providers 數組中。首先,全部提供者的 register 方法被調用,而後,全部提供者被註冊以後,boot 方法被調用。
  • 一旦應用被啓動而且全部的服務提供者被註冊,Request 將會被交給路由器進行分發,路由器將會分發請求到路由或控制器,同時運行全部路由指定的中間件。
服務提供者是啓動 Laravel 應用中最關鍵的部分,應用實例被建立後,服務提供者被註冊,請求被交給啓動後的應用進行處理,整個過程就是這麼簡單!

Mysql

1. Mysql 中,int(1) 和 int(10) 的區別

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 2

6.事務的特性

  • 原子性(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 可讀未提交

  • 併發控制:

    1. 數據庫系統採用不一樣的鎖類型來實現以上四種隔離級別,具體的實現過程對用戶是透明的。用戶關心的是如何選擇隔離級別。
    2. 對於多數應用程序,能夠優先考慮把數據庫系統的隔離級別設爲 Read Committed,它可以避免髒讀,並且具備較好的併發性能。
    3. 每一個數據庫鏈接都有一個全局變量 @@tx_isolation ,表示當前的事務隔離級別。JDBC 數據庫鏈接使用數據庫系統默認的隔離級別。
    4. 在 Hibernate 的配置文件中能夠顯示地設置隔離級別。每一種隔離級別對應着一個正整數。
    5. 須要注意的是,在受管理環境中,若是 Hibernate 使用的數據庫鏈接來自於應用服務器提供的數據源,Hibernate不會改變這些鏈接的事務隔離級別。在這種狀況下,應該經過修改應用服務器的數據源配置來修改隔離級別。
    6. 當數據庫系統採用 Red Committed 隔離級別時,會致使不可重複讀和第二類丟失更新的併發問題,在可能出現這種問題的場合。能夠在應用程序中採用悲觀鎖或樂觀鎖來避免這類問題。
mysql查看當前事務隔離級別: select @@tx_isolation
設置事務隔離級別: set [glogal | session] transaction isolation level 隔離級別名稱;set tx_isolation=’隔離級別名稱;’

8. 悲觀鎖和樂觀鎖

  • 悲觀鎖

  正如其名,它指的是對數據被外界(包括本系統當前的其餘事務,以及來自外部系統的事務處理)修改持保守態度,在整個數據處理過程當中,將數據處於鎖定狀態基於數據庫的鎖機制實現(也只有數據庫層提供的鎖機制才能真正保證數據訪問的排他性,不然,即便在本系統中實現了加鎖機制,也沒法保證外部系統不會修改數據)。
  在Hibernate使用悲觀鎖十分容易,但實際應用中悲觀鎖是不多被使用的,由於它每次發送的SQL語句都會加上"for update"用於告訴數據庫鎖定相關數據,大大限制了併發性,數據庫性能的大量開銷

  • 樂觀鎖

  樂觀鎖,大可能是基於數據版本( Version )記錄機制實現。何謂數據版本?即爲數據增長一個版本標識,在基於數據庫表的版本解決方案中,通常是經過爲數據庫表增長一個 "version" 字段來實現
  樂觀鎖的工做原理:讀取出數據時,將此版本號一同讀出,以後更新時,對此版本號加一。此時,將提交數據的版本數據與數據庫表對應記錄的當前版本信息進行比對,若是提交的數據版本號大於數據庫表當前版本號,則予以更新,不然認爲是過時數據。

9.複合索引

概念:用戶能夠在 多個列上創建索引,這種索引叫作複合索引(組合索引);

複合索引在數據庫操做期間所需的開銷更小,能夠代替多個單一索引;
窄索引是指索引列爲1-2列的索引,寬索引也就是索引列超過2列的索引;
設計索引的一個重要原則就是能用窄索引不用寬索引,由於窄索引每每比組合索引更有效;

10. like 的優化

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)返回 substrstr 中第一次出現的位置,若是 substrstr 中不存在,返回值爲 0 。若是pos存在,返回 substrstrpos個位置後第一次出現的位置,若是 substrstr 中不存在,返回值爲0

mysql 優化

  • sql 語句優化
  • 索引優化
  • 選擇合適的存儲引擎
  • 字段選擇合適的數據類型
  • 對錶進行水平或者垂直拆分
  • 針對存儲引擎的優化
  • 磁盤 I/O 優化
  • 負載均衡
  • 主從複製

Linux

1. 如何檢測 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
  • 代碼中實現,開頭寫入時間,結尾寫入時間

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;

}

每一個設備的狀態設置爲:
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 提供非業務功能。

4. Keepalived

Keepalived是經過VRRP(虛擬路由器冗餘協議)協議實現 高可用功能的。VRRP 出現的目的就是爲了解決靜態路由單點故障問題的,它可以保證當個別節點宕機時,整個網絡能夠不間斷地運行。

5.vi 和 vim 的區別

它們都是 多模式編輯器,不一樣的是 vim 是 vi 的升級版本,它不只兼容 vi 的全部指令,並且還有一些新的特性在裏面。vim 的這些優點主要體如今如下幾個方面:
  • 一、多級撤消
咱們知道在 vi 裏,按 u 只能撤消上次命令,而在 vim 裏能夠無限制的撤消。
  • 二、易用性
vi只能運行於 unix 中,而 vim 不只能夠運行於 unix,windows ,mac 等多操做平臺。
  • 三、語法加亮
vim 能夠用不一樣的顏色來加亮你的代碼。
  • 四、可視化操做
就是說 vim 不只能夠在終端運行,也能夠運行於 x window、 mac os、 windows。
  • 五、對 vi 的徹底兼容
某些狀況下,你能夠把 vim 當成 vi 來使用。vi 和 vim 都是 Linux 中的編輯器,不一樣的是 vim 比較高級,能夠視爲 vi 的升級版本。vi 使用於文本編輯,可是 vim 更適用於 coding。

6. awk 命令

AWK是一種 處理文本文件的語言,是一個強大的文本分析工具。一般,awk 是以文件的一 行爲處理單位的。awk 每接收文件的一行,而後執行相應的命令,來處理文本。
語法: awk '{pattern + action}' {filenames}
pattern 表示 AWK 在數據中查找的內容,而 action 是在找到匹配內容時所執行的一系列命令。花括號( {})不須要在程序中始終出現,但它們用於根據特定的模式對一系列指令進行分組。 pattern就是要表示的正則表達式,用斜槓括起來。

綜合

1. AES 和 RSA 的區別:

  • RSA 是非對稱加密,公鑰加密,私鑰解密, 反之亦然。缺點:運行速度慢,不易於硬件實現。常私鑰長度有512bit,1024bit,2048bit,4096bit,長度越長,越安全,可是生成密鑰越慢,加解密也越耗時。
  • AES 對稱加密,密鑰最長只有256個 bit,執行速度快,易於硬件實現。因爲是對稱加密,密鑰須要在傳輸前通信雙方獲知。
  • AES加密數據塊分組長度必須爲128比特,密鑰長度能夠是128比特、192比特、256比特中的任意一個(若是數據塊及密鑰 長度不足時,會補齊)
總結 採用非對稱加密算法管理對稱算法的密鑰,而後用對稱加密算法加密數據,這樣咱們就集成了兩類加密算法的優勢,既實現了加密速度快的優勢,又實現了安全方便管理密鑰的優勢。

2. 一次完整的 http 請求詳解

  1. 客戶端輸入 URL 。
  2. 客戶端檢測緩存(有緩存且較新,客戶端直接讀取本地緩存進行資源展現,有緩存可是不新,準備 http 請求包,發送至服務端進行緩存校驗)。
  3. 提取請求首部 HOST經過 DNS 域名解析獲取服務 IP(DNS 緩存遞歸等)。
  4. 經過 IP 與默認端口建立 TCP 鏈接,進行 http 請求報文數據發送,其中重點就三次握手進行描述(客戶端向服務端發送 syn,服務端向客戶端發送 syn、ack,客戶端向服務端發送 syn,ack,data)。
  5. 服務端程序接受請求,定向到請求路徑處理程序,準備http響應。
  6. 經過創建的 tcp 鏈接來返回相關的 http 響應報文及 http 狀態信息,而後根據實際狀況看是否關閉鏈接( Connection的keep-alive )。
  7. TCP 鏈接關閉經歷 4 次握手。
  8. 客戶端拿到 http 響應的報文信息,通過一系列前端處理過程最終將請求的資源進行展現

3. cookie 和 session 的區別和用法。session 鎖

  1. cookie 數據存放在客戶的瀏覽器上,session數據放在服務器上.
  2. cookie 不是很安全,別人能夠分析存放在本地的 COOKIE 並進行 COOKIE 欺騙,考慮到安全應當使用 session。
  3. session 會在必定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能考慮到減輕服務器性能方面,應當使用 COOKIE。
  4. 單個 cookie 保存的數據不能超過4K,不少瀏覽器都限制一個站點最多保存20個 cookie。(Session 對象沒有對存儲的數據量的限制,其中能夠保存更爲複雜的數據類型)
  • session 鎖
php 的 session 默認用文件存儲,當請求一個須要操做 session 的 php 文件(session_start())時,這個文件是會被第一個操做 session 的進程鎖定,致使其餘請求阻塞。其餘請求會掛起在 session_start() 直到s ession文件解鎖。這樣保證了讀取-寫入,讀取-寫入的順序。對數據流來講很理想,可是,對於目前這種頁面大量應用ajax的狀況,全部請求排隊處理,將大大加大頁面展示的耗時,甚至出現請求超時等不可用故障。
解決:因爲鎖定的 session 文件直到腳本執行結束或者 session 正常關閉纔會解鎖,爲了防止大量的 php 請求(須要使用 $_SESSION 數據)被鎖定,能夠在寫完 session 後立刻關閉(使用 session_write_close()),這樣就釋放了鎖;
Memcache 或者 Redis 作 session 的存儲,是能解決「鎖定」的問題,但處理很差會致使鏈接數飆高(在 session 操做後若是有耗時操做,鏈接是不回收的,能夠主動在 session 寫操做完成後作 session_write_close() 操做);

4. XSS、CSRF、SSRF、SQL 注入原理

  • 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 原有工做流特性的基礎上,使之變得更快、更安全、更可靠。

MongoDB

MongoDB 數據類型:

  • String(字符串): mongodb 中的字符串是 UTF-8 有效的。
  • Integer(整數): 存儲數值。整數能夠是 32 位或 64 位,具體取決於您的服務器。

* Boolean(布爾): 存儲布爾( true/false )值。

  • Arrays(數組): 將數組或列表或多個值存儲到一個鍵中。
  • Timestamp(時間戳): 存儲時間戳。
  • Object(對象): 嵌入式文檔。
  • Null (空值): 存儲 Null 值。
  • Date(日期): 以 UNIX 時間格式存儲當前日期或時間。

算法

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;
}

正則表達式



緩存及 nosql

一、redis 的優缺點

優勢:
一、讀寫性能優異

二、支持數據持久化,支持 AOFRDB 兩種持久化方式

三、支持主從複製,主機會自動將數據同步到從機,能夠進行讀寫分離。

四、數據結構豐富:除了支持 string 類型的 value 外還支持 stringhashsetsortedsetlist等數據結構。

缺點:
一、 Redis 不具有自動容錯和恢復功能,主機從機的宕機都會致使前端部分讀寫請求失敗,須要等待機器重啓或者手動切換前端的 IP 才能恢復。

二、 主機宕機,宕機前有部分數據未能及時同步到從機,切換IP後還會引入數據不一致的問題,下降了系統的可用性。

三、 redis 的主從複製採用全量複製,複製過程當中主機會 fork 出一個子進程對內存作一份快照,並將子進程的內存快照保存爲文件發送給從機,這一過程須要確保主機有足夠多的空餘內存。若快照文件較大,對集羣的服務能力會產生較大的影響,並且複製過程是在從機新加入集羣或者從機和主機網絡斷開重連時都會進行,也就是網絡波動都會形成主機和從機間的一次全量的數據複製,這對實際的系統運營形成了不小的麻煩。

四、 Redis 較難支持在線擴容,在集羣容量達到上限時在線擴容會變得很複雜。爲避免這一問題,運維人員在系統上線時必須確保有足夠的空間,這對資源形成了很大的浪費。

二、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)

    三、MongoDB 優缺點

    缺點
    一、 不支持事務操做
    二、 佔用空間過大
    三、 MongoDB 沒有如 MySQL 那樣成熟的維護工具
    四、 沒法進行關聯表查詢,不適用於關係多的數據
    五、 複雜聚合操做經過 mapreduce 建立,速度慢
    六、 模式自由,自由靈活的文件存儲格式帶來的數據錯誤

    優勢
    一、 文檔結構的存儲方式,可以更便捷的獲取數據
    二、 內置 GridFS,支持大容量的存儲
    三、 內置 Sharding,分片簡單
    四、 海量數據下,性能優越
    五、 支持自動故障恢復(複製集)
    參考:https://www.cnblogs.com/shiji...


    內容爲本人收集整理,若有表達錯誤歡迎指正
    相關文章
    相關標籤/搜索