出于一些原因近期做了一次工作變動(dòng),在職交接近一個(gè)半月時(shí)間大概面試了十家公司,并且得到了自己比較滿意的offer,最后基本上無縫銜接了新工作??傮w來說,雖然準(zhǔn)備的很充分,但面試期間還是暴露了許多問題,所以做下總結(jié),供大家和自己以后參考,主要分四部分講述: 簡(jiǎn)歷方面,格式內(nèi)容包括七個(gè)板塊,個(gè)人簡(jiǎn)介,求職意向,工作經(jīng)歷,項(xiàng)目經(jīng)歷,技能描述,學(xué)歷背景,自我評(píng)價(jià)。如果自己或公司沒有其他特殊要求,這些一般就夠了,具體格式不再贅述。
(點(diǎn)擊此處加入php高級(jí)交流群一起學(xué)習(xí)交流,10年架構(gòu)師帶你解讀年薪50萬面試通關(guān)秘籍。)
總結(jié)幾個(gè)要素:?
個(gè)人簡(jiǎn)介名字大寫,內(nèi)容需要詳實(shí),一是可以給人留下映像,二是減少不必要的與面試官交換個(gè)人信息的時(shí)間。準(zhǔn)備一份好的口頭自我介紹是很有必要的,畢竟準(zhǔn)備一次能用很久,時(shí)間花在上面很實(shí)用,面外企英文版的最好也提前準(zhǔn)備下。
簡(jiǎn)歷上不要寫上期望薪資,能夠根據(jù)面試情況變化是最好的,如果寫上建議高于自身期望,詳細(xì)參考錨定效應(yīng)。
簡(jiǎn)歷要簡(jiǎn)潔,最好不要超過兩頁。項(xiàng)目經(jīng)歷要突出重點(diǎn)(可以具體到某次解決線上問題,某次優(yōu)化效率提升),兩到三個(gè)為宜,不重要的可以放在工作經(jīng)歷中一筆帶過。這樣有個(gè)好處,即面試官根據(jù)項(xiàng)目問的問題就會(huì)很集中,在你的預(yù)料之中,如果你的項(xiàng)目夸夸 其談寫了很多,那面試官發(fā)揮起來,你就容易被帶著走。
很多人不重視個(gè)人評(píng)價(jià)欄目,我的技巧是評(píng)價(jià)最后中帶上自己的博客,個(gè)人項(xiàng)目,因?yàn)樵谖膊窟€是很容易被看到并當(dāng)做加分項(xiàng)的。
面試流程,其實(shí)每個(gè)公司大同小異,電話面試,筆試,技術(shù)面(可能兩面),Hr面,部門經(jīng)理面,可能不同公司有稍微做調(diào)整。
這里需要強(qiáng)調(diào)兩點(diǎn):
1.電話面試,很多大公司都會(huì)有電話面試,有些朋友接到面試不管當(dāng)前情況如何,環(huán)境如何都會(huì)爭(zhēng)取這個(gè)機(jī)會(huì),而我想說的是,如果身邊環(huán)境尚可接了也就接了,但是如果身處鬧市,或者下班回家地鐵上信號(hào)不好,或者自己完全沒有準(zhǔn)備,建議直接回復(fù)面試官目前不 合適,改約其他時(shí)間,這么做好處一是沒有環(huán)境影響,二是自己有心理準(zhǔn)備。
2.抓住機(jī)會(huì)問問題,如果對(duì)技術(shù)有追求一定要向技術(shù)官問清楚項(xiàng)目所使用技術(shù),問開發(fā)人員上下班時(shí)間。向HR問清楚公司的薪酬福利體系,決定自己開價(jià)。向管理層問清楚項(xiàng)目目前所處的階段,以及規(guī)劃方向。 面試題概覽,基本上匯總了這次面試中遇到的所有問題,中間也有一些是自己當(dāng)時(shí)沒有答上來的,這里只做羅列:
1.get,post 的區(qū)別
1、GET在瀏覽器回退時(shí)是無害的,而POST會(huì)再次提交請(qǐng)求。
2、GET產(chǎn)生的URL地址可以被Bookmark,而POST不可以。
3、GET請(qǐng)求會(huì)被瀏覽器主動(dòng)cache,而POST不會(huì),除非手動(dòng)設(shè)置。
4、GET請(qǐng)求只能進(jìn)行url編碼,而POST支持多種編碼方式。
5、GET請(qǐng)求參數(shù)會(huì)被完整保留在瀏覽器歷史記錄里,而POST中的參數(shù)不會(huì)被保留。
6、GET請(qǐng)求在URL中傳送的參數(shù)是有長(zhǎng)度限制的,而POST沒有。
7、對(duì)參數(shù)的數(shù)據(jù)類型,GET只接受ASCII字符,而POST沒有限制。
8、GET比POST更不安全,因?yàn)閰?shù)直接暴露在URL上,所以不能用來傳遞敏感信息。
9、GET參數(shù)通過URL傳遞,POST放在Request body中。
10、GET產(chǎn)生一個(gè)TCP數(shù)據(jù)包,POST產(chǎn)生兩個(gè)TCP數(shù)據(jù)包
2.require,include 區(qū)別
require是無條件包含也就是如果一個(gè)流程里加入require,無論條件成立與否都會(huì)先執(zhí)行require include有返回值,而require沒有(可能因?yàn)槿绱藃equire的速度比include快) 包含文件不存在或者語法錯(cuò)誤的時(shí)候require是致命的錯(cuò)誤終止執(zhí)行,include不是
3.PHP 的垃圾回收機(jī)制
PHP 可以自動(dòng)進(jìn)行內(nèi)存管理,清除不需要的對(duì)象。
PHP 使用了引用計(jì)數(shù) (reference counting) GC 機(jī)制。
每個(gè)對(duì)象都內(nèi)含一個(gè)引用計(jì)數(shù)器 refcount,每個(gè) reference 連接到對(duì)象,計(jì)數(shù)器加 1。當(dāng) reference 離開生存空間或被設(shè)為 NULL,計(jì)數(shù)器減 1。當(dāng)某個(gè)對(duì)象的引用計(jì)數(shù)器為零時(shí),PHP 知道你將不再需要使用這個(gè)對(duì)象,釋放其所占的內(nèi)存空間。
4.常見的排序算法
1. 冒泡排序
思路分析:在要排序的一組數(shù)中,對(duì)當(dāng)前還未排好的序列,從前往后對(duì)相鄰的兩個(gè)數(shù)依次進(jìn)行比較和調(diào)整,讓較大的數(shù)往下沉,較小的往上冒。即,每當(dāng)兩相鄰的數(shù)比較后發(fā)現(xiàn)它們的排序與排序要求相反時(shí),就將它們互換。
代碼實(shí)現(xiàn):
$arr=array(1,43,54,62,21,66,32,78,36,76,39);?
function bubbleSort($arr)
{?
? $len=count($arr);
? //該層循環(huán)控制 需要冒泡的輪數(shù)
? for($i=0;$i<$len-1;$i++)
? { //該層循環(huán)用來控制每輪 冒出一個(gè)數(shù) 需要比較的次數(shù)
? ? for($k=0;$k<$len-$i-1;$k++)
? ? {
? ? ? if($arr[$k]>$arr[$k+1])
? ? ? ? {
? ? ? ? ? ? $tmp=$arr[$k+1];
? ? ? ? ? ? $arr[$k+1]=$arr[$k];
? ? ? ? ? ? $arr[$k]=$tmp;
? ? ? ? }
? ? }
? }
? return $arr;
}
2. 選擇排序
思路分析:在要排序的一組數(shù)中,選出最小的一個(gè)數(shù)與第一個(gè)位置的數(shù)交換。然后在剩下的數(shù)當(dāng)中再找最小的與第二個(gè)位置的數(shù)交換,如此循環(huán)到倒數(shù)第二個(gè)數(shù)和最后一個(gè)數(shù)比較為止。
代碼實(shí)現(xiàn):
function selectSort($arr) {
//雙重循環(huán)完成,外層控制輪數(shù),內(nèi)層控制比較次數(shù)
$len=count($arr);
? ? for($i=0; $i<$len-1; $i++) {
? ? ? ? //先假設(shè)最小的值的位置
? ? ? ? $p = $i;
? ? ? ? for($j=$i+1; $j<$len; $j++) {
? ? ? ? ? ? //$arr[$p] 是當(dāng)前已知的最小值
? ? ? ? ? ? if($arr[$p] > $arr[$j]) {
? ? ? ? ? ? //比較,發(fā)現(xiàn)更小的,記錄下最小值的位置;并且在下次比較時(shí)采用已知的最小值進(jìn)行比較。
? ? ? ? ? ? ? ? $p = $j;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? //已經(jīng)確定了當(dāng)前的最小值的位置,保存到$p中。如果發(fā)現(xiàn)最小值的位置與當(dāng)前假設(shè)的位置$i不同,則位置互換即可。
? ? ? ? if($p != $i) {
? ? ? ? ? ? $tmp = $arr[$p];
? ? ? ? ? ? $arr[$p] = $arr[$i];
? ? ? ? ? ? $arr[$i] = $tmp;
? ? ? ? }
? ? }
? ? //返回最終結(jié)果
? ? return $arr;
}
3.插入排序
思路分析:在要排序的一組數(shù)中,假設(shè)前面的數(shù)已經(jīng)是排好順序的,現(xiàn)在要把第n個(gè)數(shù)插到前面的有序數(shù)中,使得這n個(gè)數(shù)也是排好順序的。如此反復(fù)循環(huán),直到全部排好順序。
代碼實(shí)現(xiàn):
function insertSort($arr) {
? ? $len=count($arr);
? ? for($i=1, $i<$len; $i++) {
? ? ? ? $tmp = $arr[$i];
? ? ? ? //內(nèi)層循環(huán)控制,比較并插入
? ? ? ? for($j=$i-1;$j>=0;$j--) {
? ? ? ? ? ? if($tmp < $arr[$j]) {
? ? ? ? ? ? ? ? //發(fā)現(xiàn)插入的元素要小,交換位置,將后邊的元素與前面的元素互換
? ? ? ? ? ? ? ? $arr[$j+1] = $arr[$j];
? ? ? ? ? ? ? ? $arr[$j] = $tmp;
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? //如果碰到不需要移動(dòng)的元素,由于是已經(jīng)排序好是數(shù)組,則前面的就不需要再次比較了。
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? return $arr;
}
4.快速排序
思路分析:選擇一個(gè)基準(zhǔn)元素,通常選擇第一個(gè)元素或者最后一個(gè)元素。通過一趟掃描,將待排序列分成兩部分,一部分比基準(zhǔn)元素小,一部分大于等于基準(zhǔn)元素。此時(shí)基準(zhǔn)元素在其排好序后的正確位置,然后再用同樣的方法遞歸地排序劃分的兩部分。
代碼實(shí)現(xiàn):
function quickSort($arr) {
? ? //先判斷是否需要繼續(xù)進(jìn)行
? ? $length = count($arr);
? ? if($length <= 1) {
? ? ? ? return $arr;
? ? }
? ? //選擇第一個(gè)元素作為基準(zhǔn)
? ? $base_num = $arr[0];
? ? //遍歷除了標(biāo)尺外的所有元素,按照大小關(guān)系放入兩個(gè)數(shù)組內(nèi)
? ? //初始化兩個(gè)數(shù)組
? ? $left_array = array();? //小于基準(zhǔn)的
? ? $right_array = array();? //大于基準(zhǔn)的
? ? for($i=1; $i<$length; $i++) {
? ? ? ? if($base_num > $arr[$i]) {
? ? ? ? ? ? //放入左邊數(shù)組
? ? ? ? ? ? $left_array[] = $arr[$i];
? ? ? ? } else {
? ? ? ? ? ? //放入右邊
? ? ? ? ? ? $right_array[] = $arr[$i];
? ? ? ? }
? ? }
? ? //再分別對(duì)左邊和右邊的數(shù)組進(jìn)行相同的排序處理方式遞歸調(diào)用這個(gè)函數(shù)
? ? $left_array = quick_sort($left_array);
? ? $right_array = quick_sort($right_array);
? ? //合并
? ? return array_merge($left_array, array($base_num), $right_array);
}
5、給出一個(gè)字符串,返回里面連續(xù)字母的個(gè)數(shù),比如:abbcddde,返回 1a2b1c3de;
代碼實(shí)現(xiàn):
public function str($str)
? ? {
? ? ? ? $re = '';
? ? ? ? $arr = str_split($str);//把字符串變成數(shù)組,開始我想到的是用for循環(huán)來處理,這個(gè)函數(shù)同事提醒了才發(fā)現(xiàn)
? ? ? ? $key = 0; //key 用來記錄下標(biāo),為了方便計(jì)算前面的數(shù)字
? ? ? ? for ($i = 0; $i < count($arr); $i++) {
? ? ? ? ? ? $v = $arr[$i];
? ? ? ? ? ? if ($arr[$i] == $arr[$i + 1]) {
? ? ? ? ? ? ? ? continue;//如果當(dāng)前的值和下一個(gè)值相等,跳出當(dāng)前循環(huán),進(jìn)入下一個(gè)
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? $re? .= ($i - $key + 1) . $v; //不相等時(shí)計(jì)算出前面的數(shù)字,
? ? ? ? ? ? ? ? $key = $i + 1;// 同時(shí) key 下標(biāo)重新復(fù)制
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return $re;
? ? }
6、約瑟夫環(huán)問題,猴子選大王
一群猴子排成一圈,按1,2,…,n依次編號(hào)。然后從第1只開始數(shù),數(shù)到第m只,把它踢出圈,從它后面再開始數(shù),再數(shù)到第m只,在把它踢出去…,如此不停的進(jìn)行下去,直到最后只剩下一只猴子為止,那只猴子就叫做大王。要求編程模擬此過程,輸入m、n, 輸出最后那個(gè)大王的編號(hào)。用程序模擬該過程。
unction mk($n ,$m){
? ? ? ? $arr = range(1,$n);//構(gòu)造一個(gè)數(shù)組
? ? ? ? $i = 1; //從第一個(gè)開始循環(huán)
? ? ? ? while(count($arr)>1){ //如果總數(shù)大于1
? ? ? ? ? ? ($i % $m != 0) && array_push($arr,$arr[$i-1]);//不被踢出則壓入數(shù)組尾部
? ? ? ? ? ? unset($arr[$i-1]);//壓入數(shù)組然后刪除
? ? ? ? ? ? $i++;//繼續(xù)循環(huán)
? ? ? ? }?
? ? ? ? return $arr[$i-1]; //直至最后剩下一個(gè)為大王
}
print_r(mk(6,8));? //第3只為大王
很多人在剛接觸這個(gè)行業(yè)的時(shí)候或者是在遇到瓶頸期的時(shí)候,總會(huì)遇到一些問題,比如學(xué)了一段時(shí)間感覺沒有方向感,不知道該從那里入手去學(xué)習(xí),對(duì)此我整理了一些資料,需要的可以免費(fèi)分享給大家(點(diǎn)擊此處加入php高級(jí)交流群一起學(xué)習(xí)交流,12年架構(gòu)師帶你解讀年薪50萬面試通關(guān)秘籍。)
如果喜歡我的文章,想與一群資深開發(fā)者一起交流學(xué)習(xí)的話,獲取更多相關(guān)大廠面試咨詢和指導(dǎo),歡迎加入我的學(xué)習(xí)交流群
一.什么是 CGI?什么是 FastCGI?php-fpm,F(xiàn)astCGI,Nginx 之間是什么關(guān)系?
CGI,通用網(wǎng)關(guān)接口,用于WEB服務(wù)器和應(yīng)用程序間的交互,定義輸入輸出規(guī)范,用戶的請(qǐng)求通過WEB服務(wù)器轉(zhuǎn)發(fā)給FastCGI進(jìn)程,F(xiàn)astCGI進(jìn)程再調(diào)用應(yīng)用程序進(jìn)行處理,如php解析器,應(yīng)用程序的處理結(jié)果如html返回給FastCGI,F(xiàn)astCGI返回給Nginx 進(jìn)行輸出。假設(shè)這里WEB服務(wù)器是Nginx,應(yīng)用程序是 PHP,而 php-fpm 是管理 FastCGI 的,這也就是 php-fpm,F(xiàn)astCGI,和 Nginx 之間的關(guān)系。
FastCGI 用來提高 cgi 程序性能,啟動(dòng)一個(gè)master,再啟動(dòng)多個(gè) worker,不需要每次解析 php.ini. 而 php-fpm 實(shí)現(xiàn)了 FastCGI 協(xié)議,是 FastCGI 的進(jìn)程管理器,支持平滑重啟,可以啟動(dòng)的時(shí)候預(yù)先生成多個(gè)進(jìn)程。
二.memcache 和 Redis 的區(qū)別
數(shù)據(jù)結(jié)構(gòu):memcache僅支持簡(jiǎn)單的key-value形式,Redis支持的數(shù)據(jù)更多(string字符串,set集合,list列表,hash散列,zset有序集合);
多線程:memcache支持多線程,Redis支持單線程
持久化:Redis支持持久化,memcache不支持持久化
分布式:Redis做主從結(jié)構(gòu),memcache服務(wù)器需要通過hash一致化來支撐主從結(jié)構(gòu)
實(shí)際運(yùn)用中可以redis,memcache結(jié)合,memcache可作為session存儲(chǔ)的方式,session都是KV類型鍵值對(duì)。
1. Redis中,并不是所有的數(shù)據(jù)都一直存儲(chǔ)在內(nèi)存中的,這是和Memcache相比一個(gè)最大的區(qū)別。
2. Redis在很多方面具備數(shù)據(jù)庫(kù)的特征,或者說就是一個(gè)數(shù)據(jù)庫(kù)系統(tǒng),而Memcache只是簡(jiǎn)單的K/V緩存。
3. 他們的擴(kuò)展都需要做集群;實(shí)現(xiàn)方式:master-slave、Hash。
4. 在100k以上的數(shù)據(jù)中,Memcache性能要高于Redis。
5. 如果要說內(nèi)存使用效率,使用簡(jiǎn)單的key-value存儲(chǔ)的話,Memcached的內(nèi)存利用率更高,而如果Redis采用hash結(jié)構(gòu)來做key-value存儲(chǔ),由于其組合式的壓縮,其內(nèi)存利用率會(huì)高于Memcache。當(dāng)然,這和你的應(yīng)用場(chǎng)景和數(shù)據(jù)特性有關(guān)。
6. 如果你對(duì)數(shù)據(jù)持久化和數(shù)據(jù)同步有所要求,那么推薦你選擇Redis,因?yàn)檫@兩個(gè)特性Memcache都不具備。即使你只是希望在升級(jí)或者重啟系統(tǒng)后緩存數(shù)據(jù)不會(huì)丟失,選擇Redis也是明智的。
7. Redis和Memcache在寫入性能上面差別不大,讀取性能上面尤其是批量讀取性能上面Memcache更強(qiáng)
8.Redis 提供了多種不同級(jí)別的持久化方式:
RDB 持久化可以在指定的時(shí)間間隔內(nèi)生成數(shù)據(jù)集的時(shí)間點(diǎn)快照(point-in-time snapshot)。
AOF 持久化記錄服務(wù)器執(zhí)行的所有寫操作命令,并在服務(wù)器啟動(dòng)時(shí),通過重新執(zhí)行這些命令來還原數(shù)據(jù)集。 AOF 文件中的命令全部以 Redis 協(xié)議的格式來保存,新命令會(huì)被追加到文件的末尾。 Redis 還可以在后臺(tái)對(duì) AOF 文件進(jìn)行重寫(rewrite),使得 AOF 文件的體積不會(huì)超出保存數(shù)據(jù)集狀態(tài)所需的實(shí)際大小。
Redis 還可以同時(shí)使用 AOF 持久化和 RDB 持久化。 在這種情況下, 當(dāng) Redis 重啟時(shí), 它會(huì)優(yōu)先使用 AOF 文件來還原數(shù)據(jù)集, 因?yàn)?AOF 文件保存的數(shù)據(jù)集通常比 RDB 文件所保存的數(shù)據(jù)集更完整。
你甚至可以關(guān)閉持久化功能,讓數(shù)據(jù)只在服務(wù)器運(yùn)行時(shí)存在。
三.什么是 Redis 穿透和雪崩
**緩存穿透**:就是訪問redis中一個(gè)不存在的key的時(shí)候,會(huì)直接穿過緩存,去數(shù)據(jù)庫(kù)中進(jìn)行查詢.
如果是黑客,進(jìn)行惡意攻擊的時(shí)候,每次都請(qǐng)求超過2000個(gè)/秒的時(shí)候,這個(gè)時(shí)候mysql基本上就掛了.
解決辦法是:每次從數(shù)據(jù)庫(kù)中查詢到一個(gè)不存在的key的時(shí)候,就寫一個(gè)空值到緩存庫(kù)中,有惡意攻擊的時(shí)候,直接從緩存中取到這個(gè)空值.
**緩存雪崩**:就是每秒有5000個(gè)請(qǐng)求過來時(shí)候,redis緩存庫(kù)崩了,然后這些請(qǐng)求瞬間落在了mysql數(shù)據(jù)庫(kù)上,直接導(dǎo)致數(shù)據(jù)庫(kù)死機(jī).
解決方案就是:
事前:提高緩存庫(kù)的高可用, 使用主從結(jié)構(gòu)加哨兵 cluster集群,
事中:使用ehcache+hystrix限流組件(當(dāng)請(qǐng)求量非常巨大的時(shí)候,就調(diào)用自己開發(fā)好的一個(gè)降級(jí)餓組件,返回一些默認(rèn)值,如友情提示,或者空白值)
事后:做持久化,盡快恢復(fù)緩存集群,一旦恢復(fù),自動(dòng)從磁盤上讀取數(shù)據(jù),恢復(fù)內(nèi)存中的數(shù)據(jù).
四.redis 消息隊(duì)列先進(jìn)先出需要注意什么?
通常使用一個(gè)list來實(shí)現(xiàn)隊(duì)列操作,這樣有一個(gè)小限制,所以的任務(wù)統(tǒng)一都是先進(jìn)先出,如果想優(yōu)先處理某個(gè)任務(wù)就不太好處理了,這就需要讓隊(duì)列有優(yōu)先級(jí)的概念,我們就可以優(yōu)先處理高級(jí)別的任務(wù),實(shí)現(xiàn)方式有以下幾種方式:
1)單一列表實(shí)現(xiàn):隊(duì)列正常的操作是 左進(jìn)右出(lpush,rpop)為了先處理高優(yōu)先級(jí)任務(wù),在遇到高級(jí)別任務(wù)時(shí),可以直接插隊(duì),直接放入隊(duì)列頭部(rpush),這樣,從隊(duì)列頭部(右側(cè))獲取任務(wù)時(shí),取到的就是高優(yōu)先級(jí)的任務(wù)(rpop)
2)使用兩個(gè)隊(duì)列,一個(gè)普通隊(duì)列,一個(gè)高級(jí)隊(duì)列,針對(duì)任務(wù)的級(jí)別放入不同的隊(duì)列,獲取任務(wù)時(shí)也很簡(jiǎn)單,redis的BRPOP命令可以按順序從多個(gè)隊(duì)列中取值,BRPOP會(huì)按照給出的 key 順序查看,并在找到的第一個(gè)非空 list 的尾部彈出一個(gè)元素,redis> BRPOP list1 list2 0
`list1 做為高優(yōu)先級(jí)任務(wù)隊(duì)列`
`list2 做為普通任務(wù)隊(duì)列`
`這樣就實(shí)現(xiàn)了先處理高優(yōu)先級(jí)任務(wù),當(dāng)沒有高優(yōu)先級(jí)任務(wù)時(shí),就去獲取普通任務(wù)`
`方式1最簡(jiǎn)單,但實(shí)際應(yīng)用比較局限,方式3可以實(shí)現(xiàn)復(fù)雜優(yōu)先級(jí),但實(shí)現(xiàn)比較復(fù)雜,不利于維護(hù)`
`方式2是推薦用法,實(shí)際應(yīng)用最為合適`
五.Redis 如何防止高并發(fā)?
其實(shí)redis是不會(huì)存在并發(fā)問題的,因?yàn)樗菃芜M(jìn)程的,再多的命令都是一個(gè)接一個(gè)地執(zhí)行的。我們使用的時(shí)候,可能會(huì)出現(xiàn)并發(fā)問題,比如獲得和設(shè)定這一對(duì)。Redis的為什么 有高并發(fā)問題?Redis的的出身決定
Redis是一種單線程機(jī)制的nosql數(shù)據(jù)庫(kù),基于key-value,數(shù)據(jù)可持久化落盤。由于單線程所以redis本身并沒有鎖的概念,多個(gè)客戶端連接并不存在競(jìng)爭(zhēng)關(guān)系,但是利用jedis等客戶端對(duì)redis進(jìn)行并發(fā)訪問時(shí)會(huì)出現(xiàn)問題。發(fā)生連接超時(shí)、數(shù)據(jù)轉(zhuǎn)換錯(cuò)誤、阻塞、客戶端關(guān)閉連接等問題,這些問題均是由于客戶端連接混亂造成。
同時(shí),單線程的天性決定,高并發(fā)對(duì)同一個(gè)鍵的操作會(huì)排隊(duì)處理,如果并發(fā)量很大,可能造成后來的請(qǐng)求超時(shí)。
在遠(yuǎn)程訪問redis的時(shí)候,因?yàn)榫W(wǎng)絡(luò)等原因造成高并發(fā)訪問延遲返回的問題。
解決辦法
在客戶端將連接進(jìn)行池化,同時(shí)對(duì)客戶端讀寫Redis操作采用內(nèi)部鎖synchronized。
服務(wù)器角度,利用setnx變向?qū)崿F(xiàn)鎖機(jī)制。
六.說說對(duì) SQL 語句優(yōu)化有哪些方法?
(1)Where子句中:where表之間的連接必須寫在其他Where條件之前,那些可以過濾掉最大數(shù)量記錄的條件必須寫在Where子句的末尾.HAVING最后。
(2)用EXISTS替代IN、用NOT EXISTS替代NOT IN。
(3) 避免在索引列上使用計(jì)算
(4)避免在索引列上使用IS NULL和IS NOT NULL
(5)對(duì)查詢進(jìn)行優(yōu)化,應(yīng)盡量避免全表掃描,首先應(yīng)考慮在 where 及 order by 涉及的列上建立索引。
(6)應(yīng)盡量避免在 where 子句中對(duì)字段進(jìn)行 null 值判斷,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描
(7)應(yīng)盡量避免在 where 子句中對(duì)字段進(jìn)行表達(dá)式操作,這將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描
一.數(shù)據(jù)庫(kù)三范式
第一范式:1NF是對(duì)屬性的原子性約束,要求屬性具有原子性,不可再分解;
第二范式:2NF是對(duì)記錄的惟一性約束,要求記錄有惟一標(biāo)識(shí),即實(shí)體的惟一性;
第三范式:3NF是對(duì)字段冗余性的約束,即任何字段不能由其他字段派生出來,它要求字段沒有冗余。
范式化設(shè)計(jì)優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
可以盡量得減少數(shù)據(jù)冗余,使得更新快,體積小
缺點(diǎn):對(duì)于查詢需要多個(gè)表進(jìn)行關(guān)聯(lián),減少寫得效率增加讀得效率,更難進(jìn)行索引優(yōu)化
反范式化:
優(yōu)點(diǎn):可以減少表得關(guān)聯(lián),可以更好得進(jìn)行索引優(yōu)化
缺點(diǎn):數(shù)據(jù)冗余以及數(shù)據(jù)異常,數(shù)據(jù)得修改需要更多的成本
二.Mysql 中有哪幾種鎖
- MyISAM支持表鎖,InnoDB支持表鎖和行鎖,默認(rèn)為行鎖
- 表級(jí)鎖:開銷小,加鎖快,不會(huì)出現(xiàn)死鎖。鎖定粒度大,發(fā)生鎖沖突的概率最高,并發(fā)量最低
- 行級(jí)鎖:開銷大,加鎖慢,會(huì)出現(xiàn)死鎖。鎖力度小,發(fā)生鎖沖突的概率小,并發(fā)度最高
三.什么是存儲(chǔ)過程
我們常用的操作數(shù)據(jù)庫(kù)語言SQL語句在執(zhí)行的時(shí)候需要要先編譯,然后執(zhí)行,而存儲(chǔ)過程(Stored Procedure)是一組為了完成特定功能的SQL語句集,經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫(kù)中,用戶通過指定存儲(chǔ)過程的名字并給定參數(shù)(如果該存儲(chǔ)過程帶有參數(shù))來調(diào)用執(zhí)行它。
一個(gè)存儲(chǔ)過程是一個(gè)可編程的函數(shù),它在數(shù)據(jù)庫(kù)中創(chuàng)建并保存。它可以有SQL語句和一些特殊的控制結(jié)構(gòu)組成。當(dāng)希望在不同的應(yīng)用程序或平臺(tái)上執(zhí)行相同的函數(shù),或者封裝特定功能時(shí),存儲(chǔ)過程是非常有用的。數(shù)據(jù)庫(kù)中的存儲(chǔ)過程可以看做是對(duì)編程中面向?qū)ο蠓椒ǖ哪M。它允許控制數(shù)據(jù)的訪問方式。
優(yōu)點(diǎn):
(1).存儲(chǔ)過程增強(qiáng)了SQL語言的功能和靈活性。存儲(chǔ)過程可以用流控制語句編寫,有很強(qiáng)的靈活性,可以完成復(fù)雜的判斷和較復(fù)雜的運(yùn)算。
(2).存儲(chǔ)過程允許標(biāo)準(zhǔn)組件是編程。存儲(chǔ)過程被創(chuàng)建后,可以在程序中被多次調(diào)用,而不必重新編寫該存儲(chǔ)過程的SQL語句。而且數(shù)據(jù)庫(kù)專業(yè)人員可以隨時(shí)對(duì)存儲(chǔ)過程進(jìn)行修改,對(duì)應(yīng)用程序源代碼毫無影響。
(3).存儲(chǔ)過程能實(shí)現(xiàn)較快的執(zhí)行速度。如果某一操作包含大量的Transaction-SQL代碼或分別被多次執(zhí)行,那么存儲(chǔ)過程要比批處理的執(zhí)行速度快很多。因?yàn)榇鎯?chǔ)過程是預(yù)編譯的。在首次運(yùn)行一個(gè)存儲(chǔ)過程時(shí)查詢,優(yōu)化器對(duì)其進(jìn)行分析優(yōu)化,并且給出最終被存儲(chǔ)在系統(tǒng)表中的執(zhí)行計(jì)劃。而批處理的Transaction-SQL語句在每次運(yùn)行時(shí)都要進(jìn)行編譯和優(yōu)化,速度相對(duì)要慢一些。
(4).存儲(chǔ)過程能過減少網(wǎng)絡(luò)流量。針對(duì)同一個(gè)數(shù)據(jù)庫(kù)對(duì)象的操作(如查詢、修改),如果這一操作所涉及的Transaction-SQL語句被組織程存儲(chǔ)過程,那么當(dāng)在客戶計(jì)算機(jī)上調(diào)用該存儲(chǔ)過程時(shí),網(wǎng)絡(luò)中傳送的只是該調(diào)用語句,從而大大增加了網(wǎng)絡(luò)流量并降低了網(wǎng)絡(luò)負(fù)載。
(5).存儲(chǔ)過程可被作為一種安全機(jī)制來充分利用。系統(tǒng)管理員通過執(zhí)行某一存儲(chǔ)過程的權(quán)限進(jìn)行限制,能夠?qū)崿F(xiàn)對(duì)相應(yīng)的數(shù)據(jù)的訪問權(quán)限的限制,避免了非授權(quán)用戶對(duì)數(shù)據(jù)的訪問,保證了數(shù)據(jù)的安全。
四.如何處理負(fù)載、高并發(fā)
1、HTML靜態(tài)化
其實(shí)大家都知道,效率最高、消耗最小的就是純靜態(tài)化的html頁面,所以我們盡可能使我們的 網(wǎng)站上的頁面采用靜態(tài)頁面來實(shí)現(xiàn),這個(gè)最簡(jiǎn)單的方法其實(shí)也是最有效的方法。
2、圖片服務(wù)器分離
把圖片單獨(dú)存儲(chǔ),盡量減少圖片等大流量的開銷,可以放在一些相關(guān)的平臺(tái)上,如七牛等。
3、數(shù)據(jù)庫(kù)集群和庫(kù)表散列及緩存
數(shù)據(jù)庫(kù)的并發(fā)連接為100,一臺(tái)數(shù)據(jù)庫(kù)遠(yuǎn)遠(yuǎn)不夠,可以從讀寫分離、主從復(fù)制,數(shù)據(jù)庫(kù)集群方面來著手。另外盡量減少數(shù)據(jù)庫(kù)的訪問,可以使用緩存數(shù)據(jù)庫(kù)如memcache、redis。
4、鏡像
盡量減少下載,可以把不同的請(qǐng)求分發(fā)到多個(gè)鏡像端。
5、負(fù)載均衡:
Apache的最大并發(fā)連接為1500,只能增加服務(wù)器,可以從硬件上著手,如F5服務(wù)器。當(dāng)然硬件的成本比較高,我們往往從軟件方面著手。
負(fù)載均衡 (Load Balancing) 建立在現(xiàn)有網(wǎng)絡(luò)結(jié)構(gòu)之上,它提供了一種廉價(jià)有效透明的方法擴(kuò)展網(wǎng)絡(luò)設(shè)備和服務(wù)器的帶寬、增加吞吐量、加強(qiáng)網(wǎng)絡(luò)數(shù)據(jù)處理能力,同時(shí)能夠提高網(wǎng)絡(luò)的靈活性和可用性。目前使用最為廣泛的負(fù)載均衡軟件是Nginx、LVS、HAProxy。我分別來說下三種的優(yōu)缺點(diǎn):
**Nginx的優(yōu)點(diǎn)是:**
工作在網(wǎng)絡(luò)的7層之上,可以針對(duì)http應(yīng)用做一些分流的策略,比如針對(duì)域名、目錄結(jié)構(gòu),它的正則規(guī)則比HAProxy更為強(qiáng)大和靈活,這也是它目前廣泛流行的主要原因之一,Nginx單憑這點(diǎn)可利用的場(chǎng)合就遠(yuǎn)多于LVS了。
Nginx對(duì)網(wǎng)絡(luò)穩(wěn)定性的依賴非常小,理論上能ping通就就能進(jìn)行負(fù)載功能,這個(gè)也是它的優(yōu)勢(shì)之一;相反LVS對(duì)網(wǎng)絡(luò)穩(wěn)定性依賴比較大,這點(diǎn)本人深有體會(huì);
Nginx安裝和配置比較簡(jiǎn)單,測(cè)試起來比較方便,它基本能把錯(cuò)誤用日志打印出來。LVS的配置、測(cè)試就要花比較長(zhǎng)的時(shí)間了,LVS對(duì)網(wǎng)絡(luò)依賴比較大。
可以承擔(dān)高負(fù)載壓力且穩(wěn)定,在硬件不差的情況下一般能支撐幾萬次的并發(fā)量,負(fù)載度比LVS相對(duì)小些。
Nginx可以通過端口檢測(cè)到服務(wù)器內(nèi)部的故障,比如根據(jù)服務(wù)器處理網(wǎng)頁返回的狀態(tài)碼、超時(shí)等等,并且會(huì)把返回錯(cuò)誤的請(qǐng)求重新提交到另一個(gè)節(jié)點(diǎn),不過其中缺點(diǎn)就是不支持url來檢測(cè)。比如用戶正在上傳一個(gè)文件,而處理該上傳的節(jié)點(diǎn)剛好在上傳過程中出現(xiàn)故障,Nginx會(huì)把上傳切到另一臺(tái)服務(wù)器重新處理,而LVS就直接斷掉了,如果是上傳一個(gè)很大的文件或者很重要的文件的話,用戶可能會(huì)因此而不滿。
Nginx不僅僅是一款優(yōu)秀的負(fù)載均衡器/反向代理軟件,它同時(shí)也是功能強(qiáng)大的Web應(yīng)用服務(wù)器。LNMP也是近幾年非常流行的web架構(gòu),在高流量的環(huán)境中穩(wěn)定性也很好。
Nginx現(xiàn)在作為Web反向加速緩存越來越成熟了,速度比傳統(tǒng)的Squid服務(wù)器更快,可以考慮用其作為反向代理加速器。
Nginx可作為中層反向代理使用,這一層面Nginx基本上無對(duì)手,唯一可以對(duì)比Nginx的就只有 lighttpd了,不過 lighttpd目前還沒有做到Nginx完全的功能,配置也不那么清晰易讀,社區(qū)資料也遠(yuǎn)遠(yuǎn)沒Nginx活躍。
Nginx也可作為靜態(tài)網(wǎng)頁和圖片服務(wù)器,這方面的性能也無對(duì)手。還有Nginx社區(qū)非?;钴S,第三方模塊也很多。
**Nginx的缺點(diǎn)是:**
Nginx僅能支持http、https和Email協(xié)議,這樣就在適用范圍上面小些,這個(gè)是它的缺點(diǎn)。
對(duì)后端服務(wù)器的健康檢查,只支持通過端口來檢測(cè),不支持通過url來檢測(cè)。不支持Session的直接保持,但能通過ip_hash來解決。
LVS:使用Linux內(nèi)核集群實(shí)現(xiàn)一個(gè)高性能、高可用的負(fù)載均衡服務(wù)器,它具有很好的可伸縮性(Scalability)、可靠性(Reliability)和可管理性(Manageability)。
**LVS的優(yōu)點(diǎn)是:**
抗負(fù)載能力強(qiáng)、是工作在網(wǎng)絡(luò)4層之上僅作分發(fā)之用,沒有流量的產(chǎn)生,這個(gè)特點(diǎn)也決定了它在負(fù)載均衡軟件里的性能最強(qiáng)的,對(duì)內(nèi)存和cpu資源消耗比較低。
配置性比較低,這是一個(gè)缺點(diǎn)也是一個(gè)優(yōu)點(diǎn),因?yàn)闆]有可太多配置的東西,所以并不需要太多接觸,大大減少了人為出錯(cuò)的幾率。
工作穩(wěn)定,因?yàn)槠浔旧砜关?fù)載能力很強(qiáng),自身有完整的雙機(jī)熱備方案,如LVS+Keepalived,不過我們?cè)陧?xiàng)目實(shí)施中用得最多的還是LVS/DR+Keepalived。
無流量,LVS只分發(fā)請(qǐng)求,而流量并不從它本身出去,這點(diǎn)保證了均衡器IO的性能不會(huì)受到大流量的影響。
應(yīng)用范圍比較廣,因?yàn)長(zhǎng)VS工作在4層,所以它幾乎可以對(duì)所有應(yīng)用做負(fù)載均衡,包括http、數(shù)據(jù)庫(kù)、在線聊天室等等。
**LVS的缺點(diǎn)是:**
軟件本身不支持正則表達(dá)式處理,不能做動(dòng)靜分離;而現(xiàn)在許多網(wǎng)站在這方面都有較強(qiáng)的需求,這個(gè)是Nginx/HAProxy+Keepalived的優(yōu)勢(shì)所在。
如果是網(wǎng)站應(yīng)用比較龐大的話,LVS/DR+Keepalived實(shí)施起來就比較復(fù)雜了,特別后面有 Windows Server的機(jī)器的話,如果實(shí)施及配置還有維護(hù)過程就比較復(fù)雜了,相對(duì)而言,Nginx/HAProxy+Keepalived就簡(jiǎn)單多了。
**HAProxy的特點(diǎn)是:**
HAProxy也是支持虛擬主機(jī)的。
HAProxy的優(yōu)點(diǎn)能夠補(bǔ)充Nginx的一些缺點(diǎn),比如支持Session的保持,Cookie的引導(dǎo);同時(shí)支持通過獲取指定的url來檢測(cè)后端服務(wù)器的狀態(tài)。
HAProxy跟LVS類似,本身就只是一款負(fù)載均衡軟件;單純從效率上來講HAProxy會(huì)比Nginx有更出色的負(fù)載均衡速度,在并發(fā)處理上也是優(yōu)于Nginx的。
HAProxy支持TCP協(xié)議的負(fù)載均衡轉(zhuǎn)發(fā),可以對(duì)MySQL讀進(jìn)行負(fù)載均衡,對(duì)后端的MySQL節(jié)點(diǎn)進(jìn)行檢測(cè)和負(fù)載均衡,大家可以用LVS+Keepalived對(duì)MySQL主從做負(fù)載均衡。
HAProxy負(fù)載均衡策略非常多,HAProxy的負(fù)載均衡算法現(xiàn)在具體有如下8種:
① roundrobin,表示簡(jiǎn)單的輪詢,這個(gè)不多說,這個(gè)是負(fù)載均衡基本都具備的;
② static-rr,表示根據(jù)權(quán)重,建議關(guān)注;
③ leastconn,表示最少連接者先處理,建議關(guān)注;
④ source,表示根據(jù)請(qǐng)求源IP,這個(gè)跟Nginx的IP_hash機(jī)制類似,我們用其作為解決session問題的一種方法,建議關(guān)注;
⑤ ri,表示根據(jù)請(qǐng)求的URI;
⑥ rl_param,表示根據(jù)請(qǐng)求的URl參數(shù)’balance url_param’ requires an URL parameter name;
⑦ hdr(name),表示根據(jù)HTTP請(qǐng)求頭來鎖定每一次HTTP請(qǐng)求;
⑧ rdp-cookie(name),表示根據(jù)據(jù)cookie(name)來鎖定并哈希每一次TCP請(qǐng)求。
**Nginx和LVS對(duì)比的總結(jié):**
Nginx工作在網(wǎng)絡(luò)的7層,所以它可以針對(duì)http應(yīng)用本身來做分流策略,比如針對(duì)域名、目錄結(jié)構(gòu)等,相比之下LVS并不具備這樣的功能,所以Nginx單憑這點(diǎn)可利用的場(chǎng)合就遠(yuǎn)多于LVS了;但Nginx有用的這些功能使其可調(diào)整度要高于LVS,所以經(jīng)常要去觸碰觸碰,觸碰多了,人為出問題的幾率也就會(huì)大。
Nginx對(duì)網(wǎng)絡(luò)穩(wěn)定性的依賴較小,理論上只要ping得通,網(wǎng)頁訪問正常,Nginx就能連得通,這是Nginx的一大優(yōu)勢(shì)!Nginx同時(shí)還能區(qū)分內(nèi)外網(wǎng),如果是同時(shí)擁有內(nèi)外網(wǎng)的節(jié)點(diǎn),就相當(dāng)于單機(jī)擁有了備份線路;LVS就比較依賴于網(wǎng)絡(luò)環(huán)境,目前來看服務(wù)器在同一網(wǎng)段內(nèi)并且LVS使用direct方式分流,效果較能得到保證。另外注意,LVS需要向托管商至少申請(qǐng)多一個(gè)ip來做Visual IP,貌似是不能用本身的IP來做VIP的。要做好LVS管理員,確實(shí)得跟進(jìn)學(xué)習(xí)很多有關(guān)網(wǎng)絡(luò)通信方面的知識(shí),就不再是一個(gè)HTTP那么簡(jiǎn)單了。
Nginx安裝和配置比較簡(jiǎn)單,測(cè)試起來也很方便,因?yàn)樗灸馨彦e(cuò)誤用日志打印出來。LVS的安裝和配置、測(cè)試就要花比較長(zhǎng)的時(shí)間了;LVS對(duì)網(wǎng)絡(luò)依賴比較大,很多時(shí)候不能配置成功都是因?yàn)榫W(wǎng)絡(luò)問題而不是配置問題,出了問題要解決也相應(yīng)的會(huì)麻煩得多。
Nginx也同樣能承受很高負(fù)載且穩(wěn)定,但負(fù)載度和穩(wěn)定度差LVS還有幾個(gè)等級(jí):Nginx處理所有流量所以受限于機(jī)器IO和配置;本身的bug也還是難以避免的。
Nginx可以檢測(cè)到服務(wù)器內(nèi)部的故障,比如根據(jù)服務(wù)器處理網(wǎng)頁返回的狀態(tài)碼、超時(shí)等等,并且會(huì)把返回錯(cuò)誤的請(qǐng)求重新提交到另一個(gè)節(jié)點(diǎn)。目前LVS中 ldirectd也能支持針對(duì)服務(wù)器內(nèi)部的情況來監(jiān)控,但LVS的原理使其不能重發(fā)請(qǐng)求。比如用戶正在上傳一個(gè)文件,而處理該上傳的節(jié)點(diǎn)剛好在上傳過程中出現(xiàn)故障,Nginx會(huì)把上傳切到另一臺(tái)服務(wù)器重新處理,而LVS就直接斷掉了,如果是上傳一個(gè)很大的文件或者很重要的文件的話,用戶可能會(huì)因此而惱火。
Nginx對(duì)請(qǐng)求的異步處理可以幫助節(jié)點(diǎn)服務(wù)器減輕負(fù)載,假如使用 apache直接對(duì)外服務(wù),那么出現(xiàn)很多的窄帶鏈接時(shí)apache服務(wù)器將會(huì)占用大 量?jī)?nèi)存而不能釋放,使用多一個(gè)Nginx做apache代理的話,這些窄帶鏈接會(huì)被Nginx擋住,apache上就不會(huì)堆積過多的請(qǐng)求,這樣就減少了相當(dāng)多的資源占用。這點(diǎn)使用squid也有相同的作用,即使squid本身配置為不緩存,對(duì)apache還是有很大幫助的。
Nginx能支持http、https和email(email的功能比較少用),LVS所支持的應(yīng)用在這點(diǎn)上會(huì)比Nginx更多。在使用上,一般最前端所采取的策略應(yīng)是LVS,也就是DNS的指向應(yīng)為L(zhǎng)VS均衡器,LVS的優(yōu)點(diǎn)令它非常適合做這個(gè)任務(wù)。重要的ip地址,最好交由LVS托管,比如數(shù)據(jù)庫(kù)的 ip、webservice服務(wù)器的ip等等,這些ip地址隨著時(shí)間推移,使用面會(huì)越來越大,如果更換ip則故障會(huì)接踵而至。所以將這些重要ip交給 LVS托管是最為穩(wěn)妥的,這樣做的唯一缺點(diǎn)是需要的VIP數(shù)量會(huì)比較多。Nginx可作為L(zhǎng)VS節(jié)點(diǎn)機(jī)器使用,一是可以利用Nginx的功能,二是可以利用Nginx的性能。當(dāng)然這一層面也可以直接使用squid,squid的功能方面就比Nginx弱不少了,性能上也有所遜色于Nginx。Nginx也可作為中層代理使用,這一層面Nginx基本上無對(duì)手,唯一可以撼動(dòng)Nginx的就只有l(wèi)ighttpd了,不過lighttpd目前還沒有能做到 Nginx完全的功能,配置也不那么清晰易讀。另外,中層代理的IP也是重要的,所以中層代理也擁有一個(gè)VIP和LVS是最完美的方案了。具體的應(yīng)用還得具體分析,如果是比較小的網(wǎng)站(日PV小于1000萬),用Nginx就完全可以了,如果機(jī)器也不少,可以用DNS輪詢,LVS所耗費(fèi)的機(jī)器還是比較多的;大型網(wǎng)站或者重要的服務(wù),機(jī)器不發(fā)愁的時(shí)候,要多多考慮利用LVS。
更多面試題系列:
2020年P(guān)HP面試題附答案(實(shí)戰(zhàn)經(jīng)驗(yàn))
面試官三年經(jīng)驗(yàn)PHP程序員知識(shí)點(diǎn)匯總
Redis 高級(jí)面試題 學(xué)會(huì)這些還怕進(jìn)不了大廠?
掌握 Redis這些 知識(shí)點(diǎn),面試官一定覺得你很 NB
當(dāng)面試官問你:如何進(jìn)行性能優(yōu)化?
很多人在剛接觸這個(gè)行業(yè)的時(shí)候或者是在遇到瓶頸期的時(shí)候,總會(huì)遇到一些問題,比如學(xué)了一段時(shí)間感覺沒有方向感,不知道該從那里入手去學(xué)習(xí),對(duì)此我整理了一些資料,需要的可以免費(fèi)分享給大家(點(diǎn)擊此處加入php高級(jí)交流群一起學(xué)習(xí)交流,10年架構(gòu)師帶你解讀年薪50萬面試通關(guān)秘籍。)
如果喜歡我的文章,想與一群資深開發(fā)者一起交流學(xué)習(xí)的話,獲取更多相關(guān)大廠面試咨詢和指導(dǎo),歡迎加入我的學(xué)習(xí)交流群
我的官方群點(diǎn)擊此處。鏈接加入群聊【PHP高級(jí)學(xué)習(xí)交流群】,一起學(xué)習(xí),相互討論。
群內(nèi)已經(jīng)有管理將知識(shí)體系整理好(源碼,學(xué)習(xí)視頻等資料),歡迎加群免費(fèi)領(lǐng)取。
這套精品PHP教程絕不是市場(chǎng)上的那些妖艷賤貨可比,作為web開發(fā)的佼佼者PHP并不遜色其他語言,加上Swoole后更加是如虎添翼!進(jìn)軍通信 、物聯(lián)網(wǎng)行業(yè)開發(fā)百度地圖、百度訂單中心、虎牙、戰(zhàn)旗TV等!寒冬裁員期過后正是各大企業(yè)擴(kuò)大招人的時(shí)期,現(xiàn)在市場(chǎng)初級(jí)程序員泛濫,進(jìn)階中高級(jí)程序員絕對(duì)是各大企業(yè)急需的人才,這套學(xué)習(xí)教程適合那些1-7年以內(nèi)的PHP開發(fā)者正處于瓶頸期,想要突破自己進(jìn)階中高級(jí)、架構(gòu)師!名額有限,先到先得!
部分進(jìn)階到架構(gòu)資料截圖:
還有限時(shí)精品福利:
★騰訊高級(jí)PHP工程師筆試題目
★億級(jí)PV高并發(fā)場(chǎng)景訂單的處理
★laravel開發(fā)天貓商城組件服務(wù)
★戰(zhàn)旗TV視頻直播的架構(gòu)項(xiàng)目實(shí)戰(zhàn)
對(duì)PHP后端技術(shù),對(duì)PHP架構(gòu)技術(shù)感興趣的朋友,我的官方群點(diǎn)擊此處,一起學(xué)習(xí),相互討論。
群內(nèi)已經(jīng)有管理將知識(shí)體系整理好(源碼,學(xué)習(xí)視頻等資料),歡迎加群免費(fèi)領(lǐng)取。
本課程深度對(duì)標(biāo)騰訊T3-T4標(biāo)準(zhǔn),貼身打造學(xué)習(xí)計(jì)劃為web開發(fā)人員進(jìn)階中高級(jí)、架構(gòu)師提升技術(shù),為自己增值漲薪!加入BAT特訓(xùn)營(yíng)還可以獲得內(nèi)推大廠名額以及GO語言學(xué)習(xí)權(quán)限!!!