昨天在思否上發了這篇整理,晚上10點多看到了不少贊收藏和關注,其實挺愧疚的,由於最近在找工做這篇文章並無整理完。看到這個還挺受歡迎的,也由於新工做基本定下來了,如今的公司正常交接中,打算下週末以前把這個知識梳理整理完,感謝各位的點贊、收藏和關注,你們一塊兒努力。javascript
另外,我本身的博客網站在這,哈哈:https://www.linganmin.cnphp
參考文章:https://www.jianshu.com/p/da5...html
快速排序
快速排序是十分經常使用的高效率的算法,其思想是:先選一個標尺,用它把整個隊列過一遍篩選,以保證其左邊的元素都不大於它,其右邊的元素都不小與它java
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,4mysql
function bubbleSort($arr){ // 獲取數組長度 $length = count($arr); // 第一層循環控制冒泡輪次 for ($i=0; $i < $length-1; $i++) { // 內層循環控制從第0個鍵值和後一個鍵值比較,每次冒出一個最大的數 for ($k=0; $k < $length-$i-1; $k++) { if($arr[$k] > $arr[$k+1]){ $tmp = $arr[$k+1]; $arr[$k+1] = $arr[$k]; $arr[$k] = $tmp; } } } return $arr; }
選擇排序
思路:每次選擇一個相應的元素,而後將其放到指定的位置git
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; }
在TCP/IP協議中,TCP協議提供可靠的鏈接服務,採用三次握手創建一個鏈接,完成三次握手,客戶端與服務器開始傳送數據。
簡單點說:A與B創建TCP鏈接時,首先A向B發送SYN(同步請求),而後B回覆SYN+ACK(同步請求應答),最後A回覆ACK確認,這樣TCP的一次鏈接(三次握手)就完成了。github
TCP三次握手web
所謂三次握手,是指簡歷一個TCP鏈接時須要客戶端和服務器總共發送三個包
三次握手的目的是鏈接服務器指定端口,簡歷TCP鏈接,並同步鏈接雙方的序列號並交換TCP窗口大小信息。
TCP三次握手圖解:
簡單解釋TCP三次握手:
參考:https://github.com/jawil/blog...面試
四次揮手
TCP的鏈接的拆除須要發送四個包,所以稱爲四次揮手。客戶端或服務器都可主動發起揮手動做。
因爲TCP鏈接時全雙工的,所以每一個方向都必須單獨進行關閉。這個原則是當一方完成他的數據發送任務後就能發送一個FIN來終止這個方向的鏈接。收到一個FIN只意味着這一方向上沒有數據流動,一個TCP鏈接在收到一個FIN後仍能發送數據。首先進行關閉的一方將執行主動關閉,而另外一方執行被動關閉。
TCP在真正的讀寫操做以前,server和client之間必須創建一個鏈接,當讀寫操做完成後,雙方再也不須要這個連接時他們可能釋放這個鏈接,鏈接的創建是經過三次握手,釋放則須要四次揮手,因此說每一個鏈接的創建都是須要消耗資源和時間的。
TCP短鏈接
因此短鏈接通常只會在client和server間傳遞一次讀寫操做,短鏈接管理起來比較簡單,存在的鏈接都是有用的鏈接,不須要額外的控制手段
長鏈接
長/短鏈接的操做過程
長/短鏈接的優缺點
設計模式是一套被反覆使用、多數人知曉的、通過分類編目的、代碼設計經驗的總結。使用設計模式是爲了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。
當須要保證對象只有一個實例的時候,單例模式是很是有用的。他把建立對象的控制權交給一個單一的點上,任什麼時候候應用程序都只會存在且僅存在一個實例。單例類不該該能在類的外部進行實例化。
一個單例類應該具有如下幾個因素:
private
的構造函數,用於阻止類被隨意實例化getInstance()
clone
方法,防止實例被克隆複製簡單實例:
class Single { public static $_instance; private function __construct() { } private function __clone() { } public static function getInstance() { if (!self::$_instance) { self::$_instance = new self(); } return self::$_instance; } public function sayHi() { echo "Hi \n"; } } $single = Single::getInstance(); $single->sayHi();
工廠模式解決的是如何不經過new
創建實例對象的方法
工廠模式是一種類,它具備爲你建立對象的某些方法,你可使用工廠類建立對象而不使用
new
。這樣,若是你想要更改所建立的對象類型只須要更改工廠便可,使用該工廠的全部代碼會自動更改。
工廠模式每每配合接口一塊兒使用,這樣應用程序就沒必要要知道這些被實例化的類的具體細節,只要知道工廠返回的是支持某個接口的類就能夠方便的使用了。
簡單舉例:
/** * 抽象出一我的的接口 * Interface Person */ interface Person { public function showInfo(); } /** * 一個繼承於抽象人接口的學生類 * Class Student */ class Student implements Person { public function showInfo() { echo "這是一個學生 \n"; } } /** * 一個繼承於抽象人接口的老師類 * Class Teacher */ class Teacher implements Person { public function showInfo() { echo "這是一個老師 \n"; } } /** * 人類工廠 * Class PersonFactory */ class PersonFactory { public static function factory($person_type) { // 將傳入的類型首字母大寫 $class_name = ucfirst($person_type); if(class_exists($class_name)){ return new $class_name; }else{ throw new Exception("類:$class_name 不存在",1); } } } // 須要一個學生 $student = PersonFactory::factory('student'); echo $student->showInfo(); // 須要一個老師的時候 $teacher = PersonFactory::factory('teacher'); echo $teacher->showInfo();
set key1 0 0 8
即永不過時,redis能夠經過expire設定,例如:expire name 10
String
字符串類型是redis最基礎的數據結構,首先鍵是字符串類型,並且其餘幾種結構都是在字符串類型基礎上構建的
字符串類型實際上能夠是字符串、數字、二進制(圖片、音頻),單最大不能超過512M
使用場景:
Hash
在redis中哈希類型是指鍵自己又是一種鍵值對結構,如 value = {{field1,value1}...{fieldn,valuen}}
使用場景:
list
列表類型是用來存儲多個有序的字符串,列表的每一個字符串成爲一個元素,一個列表最多能夠存儲2的32次方減1個元素。在redis中,能夠對列表插入(push)和彈出(pop),還能夠獲取指定範圍的元素列表。列表是一種比較靈活的數據結構,它能夠充當棧和隊列的角色。
使用場景:
lpush+brpop
命令組合就能夠實現阻塞隊列,生產者客戶端是用lpush
從列表左側插入元素,多個消費者客戶端使用brpop
命令阻塞式的搶列表尾部的元素,多個客戶端保證了消費的負載均衡的高可用性。使用技巧列表
lpush+lpop=Stack(棧) lpush+rpop=Queue(隊列) lpush+ltrim=Capped Collection(有限集合) lpush+brpop=Message Queue(消息隊列)
由於CPU並非Redis的瓶頸,Redis的瓶頸最有多是機器內存或者網絡帶寬。既然單線程容易實現,並且CPU不會成爲瓶頸,那麼久瓜熟蒂落的採用了單線程的方案。
固然單個Redis進程是沒辦法使用多核的 ,可是它來就不是很是計算密集型的服務。若是單核性能不夠用,能夠多開幾個進程。
參考文章:https://segmentfault.com/a/11...
參考文章:https://www.cnblogs.com/xifen...
參考文章:https://segmentfault.com/a/11...
什麼是隊列?什麼是棧?
一端進行
插入和在另外一端刪除
操做的線性表。一端進行插入和刪除
操做的線性表。隊列和棧的規則
隊列和棧的遍歷數據速度
雙引號單引號區別
GET和POST提交方式的區別
ip2long()
轉成數字注意:包含文件不存在或者語法錯誤的時候require是致命的,而include不是
在程序的開發中,如何提升程序的運行效率
SESSION與COOKIE的區別
isset和empty的區別
數據庫三範式
主鍵、外鍵和索引的區別
composer學習地址:http://docs.phpcomposer.com/0...
目前PSR-0
自動加載、PSR-4
自動加載、classmap
生成和files
引入都是被支持的,PSR-4
是首推的方法,由於它提供了更大的易用性。
PSR-4
PSR-4規範瞭如何指定文件路徑從而自動加載類,同時規範了自動加載文件的位置。乍一看這是和PSR-0重複了,實際上,在功能上確實有一部分重複。區別在於,PSR-4的規範比較乾淨,去除了兼容PHP5.3之前版本的內容。
PSR-4和PSR-0最大的區別是對下劃線的定義不一樣,PSR-4中,在類名中使用下劃線是沒有特殊含義的,而在PSR-0的規則中,下劃線或被轉化爲目錄分隔符
在PSR-4的鍵下,你能夠定義命名空間和路徑的映射關係,當自動加載類如Foo\\Bar\\Baz
時,命名空間Foo
指向一個名爲src/
的目錄意味着自動加載器將查找名爲src/Bar/Baz.php
文件並引用它。
命名空間的前綴必須以\\
結尾,以免相似前綴之間的衝突。在安裝和更新期間,PSR-4引用所有組合到一個key=>value
數組中,該數組能夠在生成的文件vendor/composer/autoload_psr4.php
中找到。
例子:
{ "autoload": { "psr-4": { "App\\": "App/" // 命名空間App映射到目錄App } } }
classmapclassmap
引用的全部組合,都會在安裝、更新的過程當中生成並存儲到vendor/composer/autoload_classmap.php
文件中。
你可使用classmap生成支持自定義加載的不遵循PSR-4
規範的類庫,要配置它指向的目錄,以便可以準確的搜索到類文件
例子:
{ "autoload": { "classmap": ["src/", "lib/", "Something.php"] } }
Files
若是你想要明確指定,在每次請求時都要載入某些文件,那麼你可使用files
字段加載。一般做爲函數庫的載入方式。
例子:
{ "autoload": { "files": ["src/MyLibrary/functions"] } }
Laravel是一套簡潔、優雅的PHP Web開發框架(PHP Web Framework)。它可讓你從麪條同樣雜亂的代碼中解脫出來;它能夠幫你構建一個完美的網絡APP,並且每行代碼均可以簡潔、富於表達力。
由於Laravel對底層的封裝很深,因此你可能須要先去了解什麼是依賴注入
,什麼是Laravel的服務容器
,關於這兩點我整理了下面兩個連接,一個是(Symfony框架做者)
寫的什麼是依賴注入,一個是深刻研究Laravel的依賴注入容器(是我翻譯的國外一大神的)
參考文章: 數值類型vs引用類型
JavaScript有5種經過複製數值傳值的數據類型:Boolean
、null
、undefind
、String
、Number
,稱之爲基本數據類型
。
JavaScript還有三種經過引用傳值的數據類型:Array
、Function
、Object
,他們統稱爲Objects
,故而稱爲對象。
基本數據類型
若是爲一個基本數據類型變量賦值,咱們能夠認爲變量包含這個原始值
var x = 100; var y = 'abx'; var z = null; var is_login = false;
當咱們使用=
將這些變量賦值給其餘變量時,咱們把這些值拷貝給了這些新變量,他們是經過值複製的,也就是說在內存中會同時存在兩個值相同的變量,並指向不一樣的內存空間:
var x = 100; var name = 'saboran'; var a = x; var b = name;
值傳遞的好處是:當改變其中一個變量的值時並不會影響另外一個變量的值。
對象
非基本數據類型的變量會保存對值(地址)的引用。該引用指向內存中對象的地址,變量實際不包含該實際值。對象建立於計算機內存中,當咱們寫下代碼var arr = []
,咱們其實是在內存中建立了一個新數組,arr
中如今包含了新數組在內存中的地址。
=
賦值給另外一個變量,其實是複製過去的是那個對象在內存中的地址。對象經過引用賦值而不是直接傳值,對象自己是靜態不變的、惟一改變的是對象的引用地址。參考文章:理解 JavaScript 做用域
參考文章:JavaScript 變量聲明提高
參考文檔:JavaScript閉包
參考文章:javascript中call()、apply()、bind()的用法終於理解
參考文章:獨家解析Javascript原型繼承
CORS的基本原理是經過設置HTTP請求和返回中header,告知瀏覽器該請求是合法的。這涉及到服務器端和瀏覽器端雙方的設置:請求的發起(Http Request Header)和服務器對請求正確的響應(Http response header)。