算法與資料結構
BTree和B+tree
- BTree B樹是為了磁盤或者其他儲存設備而設計的一種多叉平衡查找樹,相對于二叉樹,B樹的每個内節點有多個分支,即多叉。參考文章:https://www.jianshu.com/p/da5…
- B+Tree B+樹是B樹的變體,也是一種多路搜尋樹。參考文章:https://www.jianshu.com/p/da5…
排序算法
- 快速排序 快速排序是十分常用的高效率的算法,其思想是:先選一個标尺,用它把整個隊列過一遍篩選,以保證其左邊的元素都不大于它,其右邊的元素都不小與它
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);
}
工作十二年準備的PHP進階架構資料,如果你覺得有用,俺分享給大家:
【1000粉絲福利】12年架構師分享PHP進階架構資料,助力大家都能30K
點選進人暗号:知乎
- 冒泡排序 思路:法如其名,就像冒泡一樣,每次從數組中冒出一個最大的數 比如: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-1; $k++) {
if($arr[$k] > $arr[$k+1]){
$tmp = $arr[$k+1];
$arr[$k+1] = $arr[$k];
$arr[$k] = $tmp;
}
}
}
return $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/UDP差別
- TCP TCP是一種面向連接配接的、可靠的、基于位元組流的傳輸層通信協定 TCP面向連接配接,提供可靠地資料服務 TCP首部開銷20位元組 TCP邏輯通信信道是全雙工的可靠信道 TCP連接配接隻能是點到點的
- UDP UDP是參考模型中一種無連接配接的傳輸層協定,提供面向事務的簡單不可靠的資訊傳遞服務 UDP無連接配接,不可靠 UDP首部開銷8位元組 UDP邏輯通信信道是不可靠信道 UDP沒有擁塞機制,是以網絡出現擁堵不會使源主機的發送效率降低 UDP支援一對一,多對一,多對多的互動通信
三次握手,四次揮手,為什麼是三次握手四次揮手
在TCP/IP協定中,TCP協定提供可靠的連接配接服務,采用三次握手建立一個連接配接,完成三次握手,用戶端與伺服器開始傳送資料。 簡單點說:A與B建立TCP連接配接時,首先A向B發送SYN(同步請求),然後B回複SYN+ACK(同步請求應答),最後A回複ACK确認,這樣TCP的一次連接配接(三次握手)就完成了。
- TCP三向交握 所謂三次握手,是指履歷一個TCP連接配接時需要用戶端和伺服器總共發送三個包 三次握手的目的是連接配接伺服器指定端口,履歷TCP連接配接,并同步連接配接雙方的序列号并交換TCP視窗大小資訊。 TCP三向交握圖解:

- 第一次握手 用戶端發送一個TCP的SYN标志位置1的包,指明客戶打算連接配接的伺服器的端口,以及初始化序号,儲存在標頭的序列号字段裡
- 第二次握手 伺服器發揮确認包應答,即SYN标志位和ACK标志均為1,同時将确認序号設定為客戶的ISN加1,即X+1
- 第三次握手 用戶端再次發送确認包,SYN辨別為0,ACK辨別為1,并且把伺服器發來的序号字段+1,放在确定字段中發送給對方,并且在資料字段寫入ISN的+1
簡單解釋TCP三向交握: 參考:https://github.com/jawil/blog…
- 四次揮手 TCP的連接配接的拆除需要發送四個包,是以稱為四次揮手。用戶端或伺服器均可主動發起揮手動作。 由于TCP連接配接時全雙工的,是以每個方向都必須單獨進行關閉。這個原則是當一方完成他的資料發送任務後就能發送一個FIN來終止這個方向的連接配接。收到一個FIN隻意味着這一方向上沒有資料流動,一個TCP連接配接在收到一個FIN後仍能發送資料。首先進行關閉的一方将執行主動關閉,而另一方執行被動關閉。
- 為什麼是三次握手四次揮手 這是因為服務端的LISTEN狀态下的socket當收到SKY封包的履歷連接配接的請求後,它可以把ACK和SYN放在一個封包裡來發送。但關閉連接配接時,當收到對方的FIN封包通知時,他僅僅表示對方沒有資料發送給你了,但未必你的所有資料都全部發送給對方了,是以你可以不是馬上回關閉socket,即你可能還會發送一些資料給對方之後,在發送FIN封包給對方來表示你同意現在可以關閉連接配接了,是以這裡的ACK和FIN封包多情況下都是分開發送的。
長連接配接和短連接配接
TCP在真正的讀寫操作之前,server和client之間必須建立一個連接配接,當讀寫操作完成後,雙方不再需要這個連結時他們可能釋放這個連接配接,連接配接的建立是通過三次握手,釋放則需要四次揮手,是以說每個連接配接的建立都是需要消耗資源和時間的。
- TCP短連接配接
- client向server發起連接配接請求
- server接到請求,雙方建立連接配接
- client向server發消息
- server回應client
- 一次讀寫完成,此時雙方任何一個都可以發起close操作 一般都是client先發起close操作,因為一般的server不會回複完client就立即關閉連接配接
是以短連接配接一般隻會在client和server間傳遞一次讀寫操作,短連接配接管理起來比較簡單,存在的連接配接都是有用的連接配接,不需要額外的控制手段
- 長連接配接
- client向server發起連接配接
- server接到請求後,雙方建立連接配接
- client向server發送消息
- server回應client
- 一次讀寫完成,連接配接不關閉
- 後續讀寫操作
- 長/短連接配接的操作過程
- 短連接配接的操作步驟: 建立連接配接 -> 資料傳輸 -> 關閉連接配接
- 長連接配接的操作步驟: 建立連接配接 -> 資料傳輸 -> (保持連接配接) -> 資料傳輸 -> 關閉連接配接
- 長/短連接配接的優缺點
- 長連接配接可以省去較多的TCP建立和關閉操作,減少資源浪費,節省時間,對于比較頻繁的請求資源的用戶端比較适用于長連接配接
- 短連接配接對于伺服器來說管理較為簡單,存在的連接配接都是有用的連接配接,不需要額外的控制手段
如果你看到這裡說明你是個想進階的朋友,特此我準備了一個群。點選進人暗号:知乎,給大家也準備了進階資料,希望能幫助到大家!
從浏覽器輸入域名到展示頁面都發生了什麼
- DNS域名解析 先找本地hosts檔案,檢查對應域名ip的關系,有則想ip位址發送請求,沒有再去找DNS伺服器
- 建立TCP連接配接 拿到伺服器IP後,向伺服器發送求求,三次握手,建立TCP連接配接 簡單了解三次握手: 用戶端:您好,在家不,有你快遞 服務端:在的,送來吧 用戶端:好滴,來了
- 發送HTTP請求 與伺服器建立連接配接後,就可以向伺服器發起請求了。具體請求内容可以在浏覽器中檢視
- 伺服器處理請求 伺服器收到請求後由web伺服器(Apache,Nginx)處理請求,web伺服器解析使用者請求,知道了需要調用那些資源檔案,再通過相應的這些資源檔案處理使用者請求和參數,并調用資料庫等,然後将結果通過web伺服器傳回給浏覽器
- 傳回響應結果 在響應結果中都會有一個HTTP狀态碼,諸如我們熟知的200、404、500等 狀态碼都是由三位數字和原因短語組成,大緻為五類: 1XX 資訊性狀态碼 接收的請求正在處理 2XX 成功狀态碼 請求正常處理完畢 3XX 重定向狀态碼 需要附加操作以完成請求 4XX 用戶端錯誤狀态碼 伺服器也無法處理的請求 5XX 伺服器錯誤狀态碼 伺服器請求處理出錯
- 關閉TCP連接配接 為了避免伺服器與用戶端雙方資源占用和消耗,當雙方沒有請求或者響應傳遞時,任意一方都可以發起關閉請求,與建立TCP連接配接的三次握手類似,關閉TCP連接配接需要4次揮手 簡單比喻為: 用戶端:哥們,我這邊沒有資料要傳了,咱們關閉連接配接吧 服務端:好的,我看看我這邊還有資料不 服務端:兄弟,我這邊也沒資料要傳給你了,咱們可以關閉連接配接了 用戶端:好嘞
- 浏覽器解析HTML
- 浏覽器布局渲染
設計模式
設計模式是一套被反複使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人了解、保證代碼可靠性。
單例模式
當需要保證對象隻有一個執行個體的時候,單例模式是非常有用的。他把建立對象的控制權交給一個單一的點上,任何時候應用程式都隻會存在且僅存在一個執行個體。單例類不應該能在類的外部進行執行個體化。 一個單例類應該具備以下幾個因素:
- 必須擁有一個通路級别為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();
緩存相關
Redis和Memcached的差別
- Redis和Memcache都是将資料存放在記憶體中,都是記憶體資料庫。但是Memcache還可以緩存其他東西,比如圖檔、視訊
- Redis不隻支援簡單的k/v類型的資料,同時還提供list、set、hash等資料結構的存儲
- 虛拟記憶體,當實體記憶體用完時Redis可以将一些很久沒有用到的value交換到磁盤
- 過期政策,memcache在set時就指定,例如set key1 0 0 8即永不過期,redis可以通過expire設定,例如:expire name 10
- 分布式,設定memcache叢集,利用magent做一主多從;redis也可以做一主多從。
- 存儲安全,memcache挂掉後,資料沒了;redis可以定期儲存在磁盤(持久化)
- 災難恢複,memcache挂掉後資料不可恢複;redis資料丢失後可以通過aof恢複
- redis支援資料的備份,即master-slave模式的資料備份
- 應用場景不同:redis除了可以做nosql資料庫之外,還能做消息隊列、資料堆棧和資料緩存等。memcache适合于緩存sql語句、資料集、使用者臨時性資料、延遲查詢資料和session等
redis有哪些資料結構
- String 字元串類型是redis最基礎的資料結構,首先鍵是字元串類型,而且其他幾種結構都是在字元串類型基礎上建構的 字元串類型實際上可以是字元串、數字、二進制(圖檔、音頻),單最大不能超過512M 使用場景:
- 緩存 字元串最經典的使用場景,redis作為緩存層,mysql作為存儲層,絕大部分請求資料都是redis中擷取,由于redis具有支撐高并發特性,是以緩存通常能起到加速讀寫和降低後端壓力的作用
- 計數器 許多應用都會使用redis作為技術的基礎工具,它可以實作快速技術、查詢緩存的功能。
- 共享session 處于負載均衡的考慮,分布式服務會将使用者資訊的通路均衡到不同伺服器,使用者重新整理一次通路可讷讷個會需要重新登入,為了避免這個問題可以使用redis将使用者session集中管理,在這種模式下隻要保證redis的高可用和擴充性,每次擷取使用者更新或查詢登入資訊都直接從redis中集中擷取
- 限速 出于安全考慮,每次進行登入時讓使用者輸入手機驗證碼,為了短信接口不被頻繁通路,會限制使用者每分鐘擷取驗證碼的頻率
- Hash 在redis中哈希類型是指鍵本身又是一種鍵值對結構,如 value = {{field1,value1}…{fieldn,valuen}} 使用場景:
- 哈希結構相對于字元串序列化緩存資訊更加直覺,并且在更新操作上更加便捷。
- list 清單類型是用來存儲多個有序的字元串,清單的每個字元串成為一個元素,一個清單最多可以存儲2的32次方減1個元素。在redis中,可以對清單插入(push)和彈出(pop),還可以擷取指定範圍的元素清單。清單是一種比較靈活的資料結構,它可以充當棧和隊列的角色。 使用場景:
- 消息隊列 redis的lpush+brpop指令組合就可以實作阻塞隊列,生産者用戶端是用lpush從清單左側插入元素,多個消費者用戶端使用brpop指令阻塞式的搶清單尾部的元素,多個用戶端保證了消費的負載均衡的高可用性。
- 使用技巧清單 lpush+lpop=Stack(棧) lpush+rpop=Queue(隊列) lpush+ltrim=Capped Collection(有限集合) lpush+brpop=Message Queue(消息隊列)
- set
- sortedset
redis是單線程的麼,為什麼
因為CPU并不是Redis的瓶頸,Redis的瓶頸最有可能是機器記憶體或者網絡帶寬。既然單線程容易實作,而且CPU不會成為瓶頸,那麼久順理成章的采用了單線程的方案。
當然單個Redis程序是沒辦法使用多核的 ,但是它來就不是非常計算密集型的服務。如果單核性能不夠用,可以多開幾個程序。
redis的部署方式,主從、叢集
參考文章:https://segmentfault.com/a/11…
redis的哨兵模式
參考文章:https://www.cnblogs.com/xifen…
redis的持久化政策
- RDB(快照持久化)
- AOF(隻追加檔案持久化)
參考文章:https://segmentfault.com/a/11…
隊列和棧的差別
- 什麼是隊列?什麼是棧?
- 隊列(Queue):是限定隻能在表的一端進行插入和在另一端删除操作的線性表。
- 棧(Stack):是限定之能在表的一端進行插入和删除操作的線性表。
- 隊列和棧的規則
- 隊列:先進先出
- 棧:先進後出
- 隊列和棧的周遊資料速度
- 隊列:基于位址指針進行周遊,而且可以從頭部或者尾部進行周遊,但不能同時周遊,無需開辟空間,因為在周遊的過程中不影響資料結構,是以周遊速度要快。
- 棧:隻能從頂部取資料,也就是說最先進入棧底的,需要周遊整個棧才能取出來,而且在周遊資料的同僚需要微資料開辟臨時空間,保持資料在周遊前的一緻性。
PHP基礎
- 雙引号單引号差別
- 雙引号解釋變量,單引号不解釋變量
- 雙引号裡插入單引号,其中單引号裡如果有變量的話,變量解釋
- 雙引号的變量名後面必須要有一個非數字、字母、下劃線的特殊字元,或者用{}講變量括起來,否則會将變量名後面的部分當做一個整體,引起文法錯誤
- 能使單引号字元盡量使用單引号,單引号的效率比雙引号要高
- GET和POST送出方式的差別
- GET産生一個TCP資料包;POST産生兩個TCP資料包; 對于GET方式的請求,浏覽器會把http header和data一并發送出去,伺服器響應200(傳回資料) 對于POST,浏覽器先發送header,伺服器響應100 continue,浏覽器再發送data,伺服器響應200 ok(傳回資料)。
- GET在浏覽器回退時是無害的,而POST會再次送出請求
- GET請求會被浏覽器主動cache,而POST不會,除非手動設定
- GET請求參數會被完整保留在浏覽器曆史記錄裡,而POST中的參數不會被保留
- GET請求隻能進行url編碼,而POST支援多種編碼方式
- GET比POST更不安全,因為參數直接暴露在URL上,是以不能用來傳遞敏感資訊
- 如何擷取用戶端的真實ip $_SERVER[‘REMOTE_ADDR’]或getenv(‘REMOTE_ADDR’) 可以使用ip2long()轉成數字
- include和require的差別 require是無條件包含,也就是如果一個流程裡加入require,無論條件成立與否都會先執行require,當檔案不存在或者無法打開的時候,會提示錯誤,并且會終止程式執行 include有傳回值,而require沒有(可能因為如此require的速度比include快),如果被包含的檔案不存在的化,那麼會提示一個錯誤,但是程式會繼續執行下去注意:包含檔案不存在或者文法錯誤的時候require是緻命的,而include不是
- AJAX的優勢是什麼 ajax是異步傳輸技術,可以通過javascript實作,也可以通過JQuery架構實作,實作局部重新整理,減輕了伺服器的壓力,也提高了使用者體驗
- 在程式的開發中,如何提高程式的運作效率
- 優化SQL語句,查詢語句中盡量不使用select *,用哪個字段查哪個字段;
- 少用子查詢可用表連接配接代替;
- 少用模糊查詢;
- 資料表中建立索引;
- 對程式中經常用到的資料生成緩存;
- SESSION與COOKIE的差別
- 存儲位置:session存儲在伺服器,cookie存儲在浏覽器
- 安全性:session安全性高于cookie 參考連結:https://www.zhihu.com/questio…
- isset和empty的差別
- isset()函數 一般用來檢測變量是否設定 若變量不存在則傳回 FALSE 若變量存在且其值為NULL,也傳回 FALSE 若變量存在且值不為NULL,則傳回 TURE
- empty()函數是檢查變量是否為空 若變量不存在則傳回 TRUE 若變量存在且其值為""、0、“0”、NULL、、FALSE、array()、var $var; 以及沒有任何屬性的對象,則傳回 TURE 若變量存在且值不為""、0、“0”、NULL、、FALSE、array()、var $var; 以及沒有任何屬性的對象,則傳回 FALSE
- 資料庫三範式
- 第一範式:1NF是對屬性的原子性限制,要求屬性具有原子性,不可再分解;
- 第二範式:2NF是對記錄的惟一性限制,要求記錄有惟一辨別,即實體的惟一性;
- 第三範式:3NF是對字段備援性的限制,即任何字段不能由其他字段派生出來,它要求字段沒有備援。
- 主鍵、外鍵和索引的差別
- 定義 主鍵–唯一辨別一條記錄,不能有重複的,不允許為空 外鍵–表的外鍵是另一表的主鍵, 外鍵可以有重複的, 可以是空值 索引–該字段沒有重複值,但可以有一個空值
- 作用 主鍵–用來保證資料完整性 外鍵–用來和其他表建立聯系用的 索引–是提高查詢排序的速度
- 個數 主鍵–主鍵隻能有一個 外鍵–一個表可以有多個外鍵 索引–一個表可以有多個唯一索引
- 堆和棧的差別 棧是編譯期間就配置設定好的記憶體空間,是以你的代碼中必須就棧的大小有明确的定義; 堆是程式運作期間動态配置設定的記憶體空間,你可以根據程式的運作情況确定要配置設定的堆記憶體的大小。
PHP包管理器Composer與自動加載規範
composer學習位址:http://docs.phpcomposer.com/0…
composer.json中的自動加載映射
目前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 } } }
- classmap classmap引用的所有組合,都會在安裝、更新的過程中生成并存儲到vendor/composer/autoload_classmap.php檔案中。 你可以使用classmap生成支援自定義加載的不遵循PSR-4規範的類庫,要配置它指向的目錄,以便能夠準确的搜尋到類檔案 例子: { “autoload”: { “classmap”: [“src/”, “lib/”, “Something.php”] } }
- Files 如果你想要明确指定,在每次請求時都要載入某些檔案,那麼你可以使用files字段加載。通常作為函數庫的載入方式。 例子: { “autoload”: { “files”: [“src/MyLibrary/functions”] } }
PHP架構
Laravel相關
Laravel是一套簡潔、優雅的PHP Web開發架構(PHP Web Framework)。它可以讓你從面條一樣雜亂的代碼中解脫出來;它可以幫你建構一個完美的網絡APP,而且每行代碼都可以簡潔、富于表達力。
因為Laravel對底層的封裝很深,是以你可能需要先去了解什麼是依賴注入,什麼是Laravel的服務容器,關于這兩點我整理了下面兩個連結,一個是(Symfony架構作者)寫的什麼是依賴注入,一個是深入研究Laravel的依賴注入容器(是我翻譯的國外一大神的)
- 什麼是依賴注入
- 譯文深入研究Laravel的依賴注入容器
最全大廠面試題希望能幫助到到家
PHP面試題彙總,看完這些面試題助力你面試成功,工資必有20-25K
以上内容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那裡入手去提升,對此我整理了一些資料,包括但不限于:分布式架構、高可擴充、高性能、高并發、伺服器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點進階進階幹貨需要的可以免費分享給大家,需要的可以點選進入暗号:知乎。
喜歡我的文章就關注我吧,持續更新中…
喜歡我的文章就點贊關注吧