希望此文會給大家帶來幫助,覺得寫的不錯的,對你有幫助的請動動你的手關注我和點贊分享,祝願正在找工作的你,能找一份滿意的工作!
還將大量資料整理成了一個PHP面試手冊,是PDF版的。
關注微信公眾號:PHP大神,然后回復“面試手冊”即可免費獲取~
1.express 如何獲取 get post 參數的?
get req.query post // 引入表單處理模塊 var bodyParser = require('body-parser'); / 設置 url 解析 規則 // app.use(bodyParser.json()); // for parsing application/json 可以加 可以 不加 // 必須加 app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form- urlencoded // 處理 post 參數 req.body
2.socket 如何發送和接收消息?
// 發送消息 socket.emit('jyzj', '您多大了?'); // 點擊按鈕 發送消息 document.getElementById('btn').onclick = function () { socket.emit('s80', '渣男'); // socket.emit('jyzj', '打狗棍法!天下無狗!'); }; // 監聽回答 socket.on('action', function (msg) { alert('xxx: ' + msg); }); // 接收消息的方法 socket.on('event',function(msg){ 接收到消息的業務邏輯操作 }); socket.on('s80', function (msg) { console.log('接收的消息'+msg); socket.emit('action', '我就是渣男,不服來砍我!'); // 關於emi方法的備注 // console.log(io);console.log(socket); // 結果一樣 // 使用socket.emit 和io.emit是一個方法. // 但是常用是socket.emit })
3. b2b2c o2o p2p CRM ERP OA 分別是什么?
B2B2C:
是一種電子商務類型的網絡購物商業模式,B是BUSINESS的簡稱,C是CUSTOMER的簡稱,第一個B指的是商品或服務的供應商,第二個B指的是從事電子商務的企業,C則是表示消費者。
中文名 電子購物平台模式
外文名 B2B2C
模 式 供應商對企業,企業對消費者
平 台 淘寶,京東等
O2O:
即Online To Offline(在線離線/線上到線下),是指將線下的商務機會與互聯網結合,讓互聯網成為線下交易的平台,這個概念最早來源於美國。O2O的概念非常廣泛,既可涉及到線上,又可涉及到線下,可以通稱為O2O。主流商業管理課程均對O2O這種新型的商業模式有所介紹及關注。例如:雲家園、雲家政、e家潔、小區管家
P2P peer-to-peer lending
p2p金融又叫P2P信貸。
其中,P2P是 peer-to-peer 或 person-to-person 的簡寫,意思是:個人對個人。P2P金融指個人與個人間的小額借貸交易,一般需要借助電子商務專業網絡平台幫助借貸雙方確立借貸關系並完成相關交易手續。借款者可自行發布借款信息,包括金額、利息、還款方式和時間,實現自助式借款;借出者根據借款人發布的信息,自行決定借出金額,實現自助式借貸。
舉例說明:MB月光寶盒平台
目前做P2P最多的屬於P2P互聯網金融平台,簡單的意思就是個人對個人通過平台來連接達到解決雙方的需求。
ERP
所謂ERP是英文Enterprise Resource Planning(企業資源計划)的簡寫。
是指建立在信息技術基礎上,以系統化的管理思想,為企業決策層及員工提供決策運行手段的管理平台。ERP系統集中信息技術與先進的管理思想於一身,成為現代企業的運行模式,反映時代對企業合理調配資源,最大化地創造社會財富的要求,成為企業在信息時代生存、發展的基石。
CRM Customer Relationship Management
即客戶關系管理,是指企業用CRM技術來管理與客戶之間的關系。在不同場合下,CRM可能是一個管理學術語,可能是一個軟件系統。通常所指的CRM,指用計算機自動化分析銷售、市場營銷、客戶服務以及應用等流程的軟件系統。它的目標是通過提高客戶的價值、滿意度、贏利性和忠實度來縮減銷售周期和銷售成本、增加收入、尋找擴展業務所需的新的市場和渠道。CRM是選擇和管理有價值客戶及其關系的一種商業策略,CRM要求以客戶為中心的企業文化來支持有效的市場營銷、銷售與服務流程
OA:
說起OA(Office Automation,辦公自動化),總體上講,它是指一切可滿足於企事業單位的、綜合型的、能夠提高單位內部信息交流、共享、流轉處理的和實現辦公自動化和提高工作效率的各種信息化設備和應用軟件。
它不是孤立存在的,而是與企事業單位其它各類管理系統(如行政管理系統、人力資源管理系統、CRM系統、銷售管系統、ERP系統、財務系統、銷售會員管理系統)密切相關、有機整合。一個獨立存在的OA辦公自動化系統生命力及作用是薄弱的。——這也是目前最全面、最被認可的OA的概念。
4. 如何完成微信的接口配置? 以及配置失敗的原因?
填寫的URL需要正確響應微信發送的Token驗證
失敗原因未刪除里面的html文件
5. 如何獲取微信發送的內容?
$postStr = file_get_contents("php://input");
6.php 是單線程還是多線程
單線程
7. 什么是依賴注入,解決了那些問題
1.什么是依賴注入
依賴注入是控制反轉的一種實現,實現代碼解耦,便於單元測試。因為它並不需要了解自身所依賴的類,而只需要知道所依賴的類實現了自身所需要的方法就可以了。
2.解決那些問題
依賴之間的解耦
單元測試,方便Mock
8. 什么是控制反轉
控制反轉 是面向對象編程中的一種設計原則,可以用來減低計算機代碼之間的耦合度。其中最常見的方式叫做依賴注入(Dependency Injection, DI), 還有一種叫"依賴查找"(Dependency Lookup)。通過控制反轉,對象在被創建的時候,由一個調控系統內所有對象的外界實體,將其所依賴的對象的引用傳遞給它。也可以說,依賴被注入到對象中。
9. 服務器之間如何共享 session
1.通過數據庫mysql共享session
a.采用一台專門的mysql服務器來存儲所有的session信息。
用戶訪問隨機的web服務器時,會去這個專門的數據庫服務器check一下session的情況,以達到session同步的目的。
缺點就是:依懶性太強,mysql服務器無法工作,影響整個系統;
b.將存放session的數據表與業務的數據表放在同一個庫。如果mysql做了主從,需要每一個庫都需要存在這個表,並且需要數據實時同步。
缺點:用數據庫來同步session,會加大數據庫的負擔,數據庫本來就是容易產生瓶頸的地方,如果把session還放到數據庫里面,無疑是雪上加霜。上面的二種方法,第一點方法較好,把放session的表獨立開來,減輕了真正數據庫的負擔 。但是session一般的查詢頻率較高,放在數據庫中查詢性能也不是很好,不推薦使用這種方式。
2.通過cookie共享session
把用戶訪問頁面產生的session放到cookie里面,就是以cookie為中轉站。
當訪問服務器A時,登錄成功之后將產生的session信息存放在cookie中;當訪問請求分配到服務器B時,服務器B先判斷服務器有沒有這個session,如果沒有,在去看看客戶端的cookie里面有沒有這個session,如果cookie里面有,就把cookie里面的sessoin同步到web服務器B,這樣就可以實現session的同步了。
缺點:cookie的安全性不高,容易偽造、客戶端禁止使用cookie等都可能造成無法共享session。
3.通過服務器之間的數據同步session
使用一台作為用戶的登錄服務器,當用戶登錄成功之后,會將session寫到當前服務器上,我們通過腳本或者守護進程將session同步到其他服務器上,這時當用戶跳轉到其他服務器,session一致,也就不用再次登錄。
缺陷:速度慢,同步session有延遲性,可能導致跳轉服務器之后,session未同步。而且單向同步時,登錄服務器宕機,整個系統都不能正常運行。
4.通過NFS共享Session
選擇一台公共的NFS服務器(Network File Server)做共享服務器,所有的Web服務器登陸的時候把session數據寫到這台服務器上,那么所有的session數據其實都是保存在這台NFS服務器上的,不論用戶訪問那太Web服務器,都要來這台服務器獲取session數據,那么就能夠實現共享session數據了。
缺點:依賴性太強,如果NFS服務器down掉了,那么大家都無法工作了,當然,可以考慮多台NFS服務器同步的形式。
5.通過memcache同步session
memcache可以做分布式,如果沒有這功能,他也不能用來做session同步。他可以把web服務器中的內存組合起來,成為一個"內存池",不管是哪個服務器產生的sessoin都可以放到這個"內存池"中,其他的都可以使用。
優點:以這種方式來同步session,不會加大數據庫的負擔,並且安全性比用cookie大大的提高,把session放到內存里面,比從文件中讀取要快很多。
缺點:memcache把內存分成很多種規格的存儲塊,有塊就有大小,這種方式也就決定了,memcache不能完全利用內存,會產生內存碎片,如果存儲塊不足,還會產生內存溢出。
6.通過redis共享session
redis與memcache一樣,都是將數據放在內存中。區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。
10、什么叫視圖?游標是什么?
視圖:視圖是一種虛擬的表,具有和物理表相同的功能。可以對視圖進行增,改,查,操作,視圖通常是有一個表或者多個表的行或列的子集。對視圖的修改不影響基本表。它使得我們獲取數據更容易,相比多表查詢。
游標:是對查詢出來的結果集作為一個單元來有效的處理。游標可以定在該單元中的特定行,從結果集的當前行檢索一行或多行。可以對結果集當前行做修改。一般不使用游標,但是需要逐條處理數據的時候,游標顯得十分重要。
11.session 和 cookie 的區別
cookie session
位置 瀏覽器 服務器
特點 方便和js交換 高效安全
獲取用戶信息 不依賴瀏覽器環境
風險 用戶禁用cookie
替代 url參數
12.cookie 禁用后如何使用 session
1、設置php.ini的session.use_trans_sid = 1或者打開enable-trans-sid選項,讓PHP自動跨頁傳遞session id。
2、手動通過URL傳值、隱藏表單傳遞session id。
3、用文件、數據庫等形式保存session_id,在跨頁過程中手動調用。
13.PSR 規范
psr-1是基本代碼規范
psr-2是代碼風格規范
psr-3是日志接口規范
psr-4是為了解決自動加載
psr-6是緩存接口規范
psr-7是HTTP消息接口規范
psr.phphub.org/
14.git 高級命令
git rebase 在新位置重新提交
git revert 撤銷commit
git reset 丟棄提交
git stash 臨時存放工作目錄的改動
git reflog 找回分支
git-scm.com/docs
Pro Git(中文版)
15.PHP 如何實現多繼承
1.接口單繼承
2.接口多繼承
3.trait
4.PHP 默認並不支持多線程,要使用多線程需要安裝 pthread 擴展,而要安裝 pthread 擴展
php.net/manual/zh/language.oop5.tra...
www.cnblogs.com/jkko123/p/6351604....
trait 示例
<?php
trait ezcReflectionReturnInfo {
function getReturnType() { /*1*/ }
function getReturnDescription() { /*2*/ }
}
class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* ... */
}
class ezcReflectionFunction extends ReflectionFunction {
use ezcReflectionReturnInfo;
/* ... */
}
?>
16. 進程,協程,線程
進程是程序執行是的一個實例,進程能夠分配給cpu和內存等資源。進程一般包括指令集和系統資源,其中指令集就是你的代碼,系統資源就是指cpu、內存以及I/O等。
進程是一個程序在一個數據集中的一次動態執行過程,可以簡單理解為“正在執行的程序”,它是CPU資源分配和調度的獨立單位。
進程一般由程序、數據集、進程控制塊三部分組成。我們編寫的程序用來描述進程要完成哪些功能以及如何完成;數據集則是程序在執行過程中所需要使用的資源;進程控制塊用來記錄進程的外部特征,描述進程的執行變化過程,系統可以利用它來控制和管理進程,它是系統感知進程存在的唯一標志。
進程的局限是創建、撤銷和切換的開銷比較大。
線程是進程的一個執行流,線程不能分配系統資源,它是進程的一部分,比進程更小的獨立運行的單位。
解釋一下:進程有兩個特性:一是資源的所有權,一個是調度執行(指令集),線程是調度執行中的一部分,是指進程執行過程的路徑,也叫程序執行流。線程有時候也叫輕量級進程。
線程是在進程之后發展出來的概念。 線程也叫輕量級進程,它是一個基本的CPU執行單元,也是程序執行過程中的最小單元,由線程ID、程序計數器、寄存器集合和堆棧共同組成。一個進程可以包含多個線程。
線程的優點是減小了程序並發執行時的開銷,提高了操作系統的並發性能,缺點是線程沒有自己的系統資源,只擁有在運行時必不可少的資源,但同一進程的各線程可以共享進程所擁有的系統資源,如果把進程比作一個車間,那么線程就好比是車間里面的工人。不過對於某些獨占性資源存在鎖機制,處理不當可能會產生“死鎖”。
協程是一種用戶態的輕量級線程,又稱微線程,英文名Coroutine,協程的調度完全由用戶控制。人們通常將協程和子程序(函數)比較着理解。
子程序調用總是一個入口,一次返回,一旦退出即完成了子程序的執行。
協程的起始處是第一個入口點,在協程里,返回點之后是接下來的入口點。在python中,協程可以通過yield來調用其它協程。通過yield方式轉移執行權的協程之間不是調用者與被調用者的關系,而是彼此對稱、平等的,通過相互協作共同完成任務。其運行的大致流程如下:
第一步,協程A開始執行。
第二步,協程A執行到一半,進入暫停,通過yield命令將執行權轉移到協程B。
第三步,(一段時間后)協程B交還執行權。
第四步,協程A恢復執行。
協程的特點在於是一個線程執行,與多線程相比,其優勢體現在:
* 協程的執行效率非常高。因為子程序切換不是線程切換,而是由程序自身控制,因此,沒有線程切換的開銷,和多線程比,線程數量越多,協程的性能優勢就越明顯。
* 協程不需要多線程的鎖機制。在協程中控制共享資源不加鎖,只需要判斷狀態就好了。
Tips:利用多核CPU最簡單的方法是多進程+協程,既充分利用多核,又充分發揮協程的高效率,可獲得極高的性能。
17.php 反射
http://php.net/manual/zh/book.reflection.php
18. 公眾號全局唯一票據
( access_token )是公眾號的全局唯一票據,有效期為( 2小時 )
19. 自定義菜單
1、自定義菜單最多包括3個一級菜單,每個一級菜單最多包含5個二級菜單。
2、一級菜單最多4個漢字,二級菜單最多7個漢字,多出來的部分將會以“...”代替。
3、創建自定義菜單后,菜單的刷新策略是,在用戶進入公眾號會話頁或公眾號profile頁時,如果發現上一次拉取菜單的請求在5分鍾以前,就會拉取一下菜單,如菜單有更新,就會刷新客戶端的菜單。測試時可以嘗試取消關注公眾賬號后再次關注,則可以看到創建后的效果。
20. 寫出四個自定義菜單按鈕類型
1、click:點擊推事件用戶點擊click類型按鈕后,微信服務器會通過消息接口推送消息類型為event的結構給開發者(參考消息接口指南),並且帶上按鈕中開發者填寫的key值,開發者可以通過自定義的key值與用戶進行交互;
2、view:跳轉URL用戶點擊view類型按鈕后,微信客戶端將會打開開發者在按鈕中填寫的網頁URL,可與網頁授權獲取用戶基本信息接口結合,獲得用戶基本信息。
3、scancode_push:掃碼推事件用戶點擊按鈕后,微信客戶端將調起掃一掃工具,完成掃碼操作后顯示掃描結果(如果是URL,將進入URL),且會將掃碼的結果傳給開發者,開發者可以下發消息。
4、scancode_waitmsg:掃碼推事件且彈出“消息接收中”提示框用戶點擊按鈕后,微信客戶端將調起掃一掃工具,完成掃碼操作后,將掃碼的結果傳給開發者,同時收起掃一掃工具,然后彈出“消息接收中”提示框,隨后可能會收到開發者下發的消息。
5、pic_sysphoto:彈出系統拍照發圖用戶點擊按鈕后,微信客戶端將調起系統相機,完成拍照操作后,會將拍攝的相片發送給開發者,並推送事件給開發者,同時收起系統相機,隨后可能會收到開發者下發的消息。
6、pic_photo_or_album:彈出拍照或者相冊發圖用戶點擊按鈕后,微信客戶端將彈出選擇器供用戶選擇“拍照”或者“從手機相冊選擇”。用戶選擇后即走其他兩種流程。
7、pic_weixin:彈出微信相冊發圖器用戶點擊按鈕后,微信客戶端將調起微信相冊,完成選擇操作后,將選擇的相片發送給開發者的服務器,並推送事件給開發者,同時收起相冊,隨后可能會收到開發者下發的消息。
8、location_select:彈出地理位置選擇器用戶點擊按鈕后,微信客戶端將調起地理位置選擇工具,完成選擇操作后,將選擇的地理位置發送給開發者的服務器,同時收起位置選擇工具,隨后可能會收到開發者下發的消息。
9、media_id:下發消息(除文本消息)用戶點擊media_id類型按鈕后,微信服務器會將開發者填寫的永久素材id對應的素材下發給用戶,永久素材類型可以是圖片、音頻、視頻、圖文消息。請注意:永久素材id必須是在“素材管理/新增永久素材”接口上傳后獲得的合法id。
10、view_limited:跳轉圖文消息URL用戶點擊view_limited類型按鈕后,微信客戶端將打開開發者在按鈕中填寫的永久素材id對應的圖文消息URL,永久素材類型只支持圖文消息。請注意:永久素材id必須是在“素材管理/新增永久素材”接口上傳后獲得的合法id。
請注意!!! 3到8的所有事件,僅支持微信iPhone5.4.1以上版本,和Android5.4以上版本的微信用戶,舊版本微信用戶點擊后將沒有回應,開發者也不能正常接收到事件推送。9和10,是專門給第三方平台旗下未微信認證(具體而言,是資質認證未通過)的訂閱號准備的事件類型,它們是沒有事件推送的,能力相對受限,其他類型的公眾號不必使用。
21. 寫出四個接受消息類型
寫出四個接收消息類型( 文本消息 圖片消息 語音消息 視頻消息 小視頻消息 地理位置消息 鏈接消息 )。
22. 模板內容中部必須為多少個個 “關鍵詞名稱:關鍵詞內容參數” 的組合排列
模板消息填寫時,必須嚴格遵守以下規則,否則也不能審核通過:
1、模板內容長度不能超過200個字符,且必須有至少10個固定文字或標點
2、模版內容中,參數是可以在發送時賦值的,參數必須以“{ {”開頭,以“.DATA} }”結尾)
3、內容示例是將模板內容中的參數分別舉例后的模板內容的副本,必須嚴格填寫,用以幫助審核人員詳細理解模板的用途
4、參數中可以通過增加“\n”,來實現換行,所以,一般建議將參數緊貼上一行,在需要時用“\n”自行換行。通過該技巧,可以讓模板消息的拓展能力變得非常強。
5、模版內容中,第一句話需要為禮貌性、稱謂性的用語,這句話統一用{ {first.DATA} }參數來概括,以免此后稱謂習慣等修改后,需修改模版。
6、模版內容的中部必須為2到5個“關鍵詞名稱:關鍵詞內容參數”(中文冒號)的組合排列,這樣顯示在微信客戶端中體驗最佳。
7、模版內容中,末尾必須有{ {remark.DATA} }參數,該參數的作用是,用戶可以自行添加多行需要的內容。例如,模版中有姓名、時間這2個關鍵詞,但你需要姓名、時間、地點3個,則可以將地點這個關鍵詞的內容放入remark參數中(需要時可通過\n來換行)。這樣就達到了用remark參數來擴充關鍵詞的作用,極大增強了模版的通用性。
8、直接相連在一起的參數,應簡化為一個,避免模板內容過於復雜,因為賦值到兩個參數中的內容可以簡化地賦值到一個參數中。
9、為了保持行業通用性,模板標題和模板內容中,不允許帶有品牌等關鍵詞,以免影響通用性。
23. 在使用接口特別是發送消息時,對多媒體文件、多媒體消息的獲取和調用等操作,是通過 ( media_id ) 來進行的。
素材管理
新增臨時素材
公眾號經常有需要用到一些臨時性的多媒體素材的場景,例如在使用接口特別是發送消息時,對多媒體文件、多媒體消息的獲取和調用等操作,是通過media_id來進行的。素材管理接口對所有認證的訂閱號和服務號開放。通過本接口,公眾號可以新增臨時素材(即上傳臨時多媒體文件)。
注意點:
1、臨時素材media_id是可復用的。
2、媒體文件在微信后台保存時間為3天,即3天后media_id失效。
3、上傳臨時素材的格式、大小限制與公眾平台官網一致。
圖片(image): 2M,支持PNG\JPEG\JPG\GIF格式
語音(voice):2M,播放長度不超過60s,支持AMR\MP3格式
視頻(video):10MB,支持MP4格式
縮略圖(thumb):64KB,支持JPG格式
4、需使用https調用本接口。
24. 模板消息不允許在用戶沒做任何操作或未經用戶同意接收的前提下,主動下發消息給用戶
模板消息運營規范
模板消息用來幫助公眾號進行業務通知,是開發者在模板內容中設定參數(參數必須以“{ {”開頭,且以“.DATA} }”結尾),並在調用時為這些參數賦值並發送的消息。
模板消息的定位是用戶觸發后的通知消息,不允許在用戶沒做任何操作或未經用戶同意接收的前提下,主動下發消息給用戶。
目前在特殊情況下允許主動下發的消息只有故障類和災害警示警告類通知,除此之外都要經過用戶同意或用戶有觸發行為才能下發模板消息。
公眾號只能在模板庫中按照自己的行業來選擇模板。如果模板庫中暫時沒有你想要的模板,則請你仔細閱讀以下內容后,在滿足要求的情況下,可以為你所在的行業貢獻新模板,幫助充實模板庫。
25. 模板消息內容不能做營銷、推廣
模板消息運營規范
處罰規則
違規的判定原則
1.發模板的行為:
①模板消息不能主動下發給沒有接受過服務的接收者(故障報警、災害報警和不涉及營銷推廣的通知除外)
例:某用戶僅僅是關注公眾號,沒有和公眾號及其所屬主體有任何交互行為,卻無故收到該公眾號下發的模板消息,屬於違規行為
②模板消息的發送頻率不能太高騷擾接收者
例:某用戶點擊公眾號的自定義菜單一次或其它觸發操作,連續收到3條或更多重復模板消息,屬於違規行為
2.模板的內容:
①模板消息內容不能做營銷、推廣、誘導分享及誘導下載APP
例:某用戶購買某商品后,公眾號下發模板推銷其它商品,與用戶此次接受的服務無關,屬於違規
②模板內容與模板標題或關鍵詞無關聯
例:標題是刷卡成功通知,模板內容卻是推銷商品或活動通知,屬於違規
③模板內容是營銷性質的群發活動公告通知
例:標題小區物業通知,模板內容卻是群發活動的營銷信息
綜合上述兩項原則后判斷,主動下發、內容涉及惡意營銷、頻率過高惡意騷擾、以及模板參數內容亂填寫將被封接口處罰。對於多次使用同一模板違規的,將回收違規模板,不允許再使用,違規處罰將通過微信公眾平台站內信告知運營者。
26. 對於臨時素材,每個素材會在開發者上傳或粉絲發送到微信服務器 3 天后自動刪除
媒體文件在微信后台保存時間為3天,即3天后media_id失效。
27. 含有明示或暗示用戶分享的文案、圖片、按鈕、彈層、彈窗,不屬於誘導分享
誘導分享類內容
1.1 要求用戶分享,分享后方可進行下一步操作,分享后方可知道答案等;
1.2 含有明示或暗示用戶分享的文案、圖片、按鈕、彈層、彈窗等的,如:分享給好友、邀請好友一起完成任務等;
1.3 通過利益誘惑,誘導用戶分享、傳播外鏈內容或者微信公眾帳號文章的,包括但不限於:現金獎勵、實物獎品、虛擬獎品(紅包、優惠券、代金券、積分、話費、流量、信息等)、集贊、拼團、分享可增加抽獎機會、中獎概率,以積分或金錢利益誘導用戶分享、點擊、點贊微信公眾帳號文章等;
28. 企業號、服務號、訂閱號區別
企業號 服務號 訂閱號
消息次數限制 最高每分鍾可群發 200 次 每月主動發送消息不超過 4 條 每天群發一條
驗證關注者身份 通訊錄成員可關注 不論什么微信用戶掃碼就可以關注 不論什么微信用戶掃碼就可以關注
消息保密 消息可轉發、分享。支持保密消息,防成員轉發 消息可轉發、分享 消息可轉發、分享
高級接口權限 支持 支持 不支持
定制應用 可依據須要定制應用,多個應用聚合成一個企業號 不支持。新增服務號須要又一次關注。 不支持,新增服務號須要又一次關注。
29. 網頁授權用戶消息流程步驟
1、引導用戶進入授權頁面同意授權,獲取code
2、通過code換取網頁授權access_token(與基礎支持中的access_token不同)
3、如果需要,開發者可以刷新網頁授權access_token,避免過期
4、通過網頁授權access_token和openid獲取用戶基本信息(支持UnionID機制)
30. 描述小程序的框架
框架名稱:MINA (MINA IS NOT APP) 是在微信中開發小程序的框架。
框架結構 :MINA 框架由兩部分組成。視圖層 (View) 和邏輯層 (App Service)。
框架特征:響應式的數據綁定 (MINA 用響應式數據綁定的方式,在視圖層和邏輯層之間進行通信。從某種程度上,可以看成是 MVVM 模式。)
結構:MINA 程序包含一個描述整體程序的 app 和多個描述各自頁面的 page。
一個 MINA 程序主體部分由三個文件組成,必須放在根目錄下。
Paste_Image.png
一個 MINA 頁面由四個文件組成。如下圖
31. 檢測是否是微信瀏覽器
判斷瀏覽器是否是微信內置瀏覽器主要通過UserAgent或者WeiXinJSBridge兩種方式進行
32. 瀏覽器內核有哪些?
1、Trident內核:代表作品是IE,因IE捆綁在Windows中,所以占有極高的份額,又稱為IE內核或MSHTML,此內核只能用於Windows平台,且不是開源的。
? ? 代表作品還有騰訊、Maxthon(遨游)、360瀏覽器等。但由於市場份額比較大,曾經出現脫離了W3C標准的時候,同時IE版本比較多,
? ??存在很多的兼容性問題。
2、Gecko內核:代表作品是Firefox,即火狐瀏覽器。因火狐是最多的用戶,故常被稱為firefox內核它是開源的,最大優勢是跨平台,在Microsoft Windows、Linux、MacOs X等主 ??要操作系統中使用。
? ?Mozilla是網景公司在第一次瀏覽器大戰敗給微軟之后創建的。有興趣的同學可以了解一下瀏覽器大戰
3、Webkit內核:代表作品是Safari、曾經的Chrome,是開源的項目。
4、Presto內核:代表作品是Opera,Presto是由Opera Software開發的瀏覽器排版引擎,它是世界公認最快的渲染速度的引擎。在13年之后,Opera宣布加入谷歌陣營,棄用了 ? ?Presto
5、Blink內核:由Google和Opera Software開發的瀏覽器排版引擎,2013年4月發布。現在Chrome內核是Blink。谷歌還開發了自己的JS引擎,V8,使JS運行速度極大地提高了
33.php-fpm 是什么
PHP-FPM(FastCGI Process Manager:FastCGI進程管理器)是一個PHPFastCGI管理器,對於PHP 5.3.3之前的php來說,是一個補丁包 [1] ,旨在將FastCGI進程管理整合進PHP包中。如果你使用的是PHP5.3.3之前的PHP的話,就必須將它patch到你的PHP源代碼中,在編譯安裝PHP后才可以使用。
相對Spawn-FCGI,PHP-FPM在CPU和內存方面的控制都更勝一籌,而且前者很容易崩潰,必須用crontab進行監控,而PHP-FPM則沒有這種煩惱。
php-fpm是 FastCGI 的實現,並提供了進程管理的功能。
進程包含 master 進程和 worker 進程兩種進程。
master 進程只有一個,負責監聽端口,接收來自 Web Server 的請求,而 worker 進程則一般有多個(具體數量根據實際需要配置),每個進程內部都嵌入了一個 PHP 解釋器,是 PHP 代碼真正執行的地方。
使用PHP-FPM來控制PHP-CGI的FastCGI進程
/usr/local/php/sbin/php-fpm{start|stop|quit|restart|reload|logrotate}
--start 啟動php的fastcgi進程
--stop 強制終止php的fastcgi進程
--quit 平滑終止php的fastcgi進程
--restart 重啟php的fastcgi進程
--reload 重新平滑加載php的php.ini
--logrotate 重新啟用log文件
34.ngnix 反向代理
反向代理(Reverse Proxy)方式是指以代理服務器來接受Internet上的連接請求,然后將請求轉發給內部網絡上的服務器;並將從服務器上得到的結果返回給Internet上請求連接的客戶端,此時代理服務器對外就表現為一個服務器
客戶端而言它就像是原始服務器,並且客戶端不需要進行任何特別的設置。客戶端向反向代理 的命名空間(name-space)中的內容發送普通請求,接着反向代理將判斷向何處(原始服務器)轉交請求,並將獲得的內容返回給客戶端,就像這些內容 原本就是它自己的一樣。
作用:
1.保護和隱藏原始資源服務器
2.負載均衡(需要多個)
3.過配置緩存功能加速Web請求:可以緩存真實Web服務器上的某些靜態資源,減輕真實Web服務器的負載壓力
通常的代理服務器,只用於代理內部網絡對 Internet 的連接請求,客戶機必須指定代理服務器,並將本來要直接發送到 Web 服務器上的 http 請求發送到代理服務器中。當一個代理服務器能夠代理外部網絡上的主機,訪問內部網絡時,這種代理服務的方式稱為反向代理服務。
35.Nginx 正向代理
正向代理,也就是傳說中的代理,他的工作原理就像一個跳板, 簡單的說, 我是一個用戶,我訪問不了某網站,但是我能訪問一個代理服務器 這個代理服務器呢,他能訪問那個我不能訪問的網站 於是我先連上代理服務器,告訴他我需要那個無法訪問網站的內容 代理服務器去取回來,然后返回給我
正向代理 是一個位於客戶端和原始服務器(origin server)之間的服務器,為了從原始服務器取得內容,客戶端向代理發送一個請求並指定目標(原始服務器),然后代理向原始服務器轉交請求並將獲得的內容返回給客戶端。客戶端必須要進行一些特別的設置才能使用正向代理。
1.訪問本無法訪問的服務器
2.正向代理提速(現在不流行)
3.緩存作用
4.客戶端訪問授權
5.隱藏訪問者的行蹤
36. 什么是中間件
過濾Http請求
過濾進入應用的HTTP請求對象(Request)和完善離開應用的HTTP響應對象(Reponse)的作用, 而且可以通過應用多個中間件來層層過濾請求、逐步完善相應。這樣就做到了程序的解耦,如果沒有中間件那么我們必須在控制器中來完成這些步驟,這無疑會造成控制器的臃腫。
請求->中間件->中間件->應用->中間件->中間件->響應
中間件的設計使用了裝飾器模式
37.trait 優先級
在trait繼承中,優先順序依次是:來自當前類的成員覆蓋了 trait 的方法,而 trait 則覆蓋了被繼承的方法。
For example:
class A{
public function sayHello(){
echo "A";
}
}
trait B{
public function sayHello(){
parent::sayHello();
echo "B";
}
}
class C extends A{
use B;
}
$c=new C();
$c->sayHello();
上述打印結果是:AB
38. 索引使用經典場景
1.匹配全值
2.匹配范圍
3.最左前綴
4.搜索索引
5.匹配列前綴
39. 存在卻不能使用的場景
1.以%開頭的LIKE文件
2.數據類型出現隱式轉換
3.多列索引查詢條件不包括最左部分,即不滿足左原則
4.使用索引比全表掃面慢
5.使用索引比全表掃描慢
6.用or分開的條件
7.條件索引使用函數
40. 軟件開發流程
需求分析
1.相關系統分析員向用戶初步了解需求,然后用相關的工具軟件列出要開發的系統的大功能模塊,每個大功能模塊有哪些小功能模塊,對於有些需求比較明確相關的界面時,在這一步里面可以初步定義好少量的界面。
2.系統分析員深入了解和分析需求,根據自己的經驗和需求用WORD或相關的工具再做出一份文檔系統的功能需求文檔。這次的文檔會清楚列出系統大致的大功能模塊,大功能模塊有哪些小功能模塊,並且還列出相關的界面和界面功能。
3.系統分析員向用戶再次確認需求。
概要設計
首先,開發者需要對軟件系統進行概要設計,即系統設計。概要設計需要對軟件系統的設計進行考慮,包括系統的基本處理流程、系統的組織結構、模塊划分、功能分配、接口設計、運行設計、數據結構設計和出錯處理設計等,為軟件的詳細設計提供基礎。
詳細設計
在概要設計的基礎上,開發者需要進行軟件系統的詳細設計。在詳細設計中,描述實現具體模塊所涉及到的主要算法、數據結構、類的層次結構及調用關系,需要說明軟件系統各個層次中的每一個程序(每個模塊或子程序)的設計考慮,以便進行編碼和測試。應當保證軟件的需求完全分配給整個軟件。詳細設計應當足夠詳細,能夠根據詳細設計報告進行編碼。
編碼
在軟件編碼階段,開發者根據《軟件系統詳細設計報告》中對數據結構、算法分析和模塊實現等方面的設計要求,開始具體的編寫程序工作,分別實現各模塊的功能,從而實現對目標系統的功能、性能、接口、界面等方面的要求。在規范化的研發流程中,編碼工作在整個項目流程里最多不會超過1/2,通常在1/3的時間,所謂磨刀不誤砍柴功,設計過程完成的好,編碼效率就會極大提高,編碼時不同模塊之間的進度協調和協作是最需要小心的,也許一個小模塊的問題就可能影響了整體進度,讓很多程序員因此被迫停下工作等待,這種問題在很多研發過程中都出現過。編碼時的相互溝通和應急的解決手段都是相當重要的,對於程序員而言,bug永遠存在,你必須永遠面對這個問題,大名鼎鼎的微軟,可曾有連續三個月不發補丁的時候嗎?從來沒有!
測試
測試編寫好的系統。交給用戶使用,用戶使用后一個一個的確認每個功能。軟件測試有很多種:按照測試執行方,可以分為內部測試和外部測試;按照測試范圍,可以分為模塊測試和整體聯調;按照測試條件,可以分為正常操作情況測試和異常情況測試;按照測試的輸入范圍,可以分為全覆蓋測試和抽樣測試。以上都很好理解,不再解釋。總之,測試同樣是項目研發中一個相當重要的步驟,對於一個大型軟件,3個月到1年的外部測試都是正常的,因為永遠都會有不可預料的問題存在。完成測試后,完成驗收並完成最后的一些幫助文檔,整體項目才算告一段落,當然日后少不了升級,修補等等工作,只要不是想通過一錘子買賣騙錢,就要不停的跟蹤軟件的運營狀況並持續修補升級,直到這個軟件被徹底淘汰為止。
軟件交付
在軟件測試證明軟件達到要求后,軟件開發者應向用戶提交開發的目標安裝程序、數據庫的數據字典、《用戶安裝手冊》、《用戶使用指南》、需求報告、設計報告、測試報告等雙方合同約定的產物。
《用戶安裝手冊》應詳細介紹安裝軟件對運行環境的要求、安裝軟件的定義和內容、在客戶端、服務器端及中間件的具體安裝步驟、安裝后的系統配置。
《用戶使用指南》應包括軟件各項功能的使用流程、操作步驟、相應業務介紹、特殊提示和注意事項等方面的內容,在需要時還應舉例說明。
驗收
用戶驗收。
維護
根據用戶需求的變化或環境的變化,對應用程序進行全部或部分的修改。
41. 消息隊列 MQ
“消息隊列”是在消息的傳輸過程中保存消息的容器。
在項目中,將一些無需即時返回且耗時的操作提取出來,進行了異步處理,而這種異步處理的方式大大的節省了服務器的請求響應時間,從而提高了系統的吞吐量。
RabbitMQ支持消息的持久化,也就是數據寫在磁盤上,為了數據安全考慮,我想大多數用戶都會選擇持久化。消息隊列持久化包括3個部分:
(1)exchange持久化,在聲明時指定durable => 1
(2)queue持久化,在聲明時指定durable => 1
(3)消息持久化,在投遞時指定delivery_mode => 2(1是非持久化)
如果exchange和queue都是持久化的,那么它們之間的binding也是持久化的。如果exchange和queue兩者之間有一個持久化,一個非持久化,就不允許建立綁定。
42. 千萬級別的數據庫經緯度,批量替換成地址
1.拆表百萬為一單位
2.批量提交和讀取使用yield協程異步操作
43.Redis 有哪些數據結構?
字符串 String、字典 Hash、列表 List、集合 Set、有序集合 SortedSet。
如果你是 Redis 中高級用戶,還需要加上下面幾種數據結構 HyperLogLog、Geo、Pub/Sub。
如果你說還玩過 Redis Module,像 BloomFilter,RedisSearch,Redis-ML,面試官得眼睛就開始發亮了。
44. 使用過 Redis 分布式鎖么,它是什么回事?
先拿 setnx 來爭搶鎖,搶到之后,再用 expire 給鎖加一個過期時間防止鎖忘記了釋放。
這時候對方會告訴你說你回答得不錯,然后接着問如果在 setnx 之后執行 expire 之前進程意外 crash 或者要重啟維護了,那會怎么樣?
這時候你要給予驚訝的反饋:唉,是喔,這個鎖就永遠得不到釋放了。緊接着你需要抓一抓自己得腦袋,故作思考片刻,好像接下來的結果是你主動思考出來的,然后回答:我記得 set 指令有非常復雜的參數,這個應該是可以同時把 setnx 和 expire 合成一條指令來用的!對方這時會顯露笑容,心里開始默念:摁,這小子還不錯。
45. 假如 Redis 里面有 1 億個 key,其中有 10w 個 key 是以某個固定的已知的前綴開頭的,如果將它們全部找出來?
使用 keys 指令可以掃出指定模式的 key 列表。
對方接着追問:如果這個 redis 正在給線上的業務提供服務,那使用 keys 指令會有什么問題?
這個時候你要回答 redis 關鍵的一個特性:redis 的單線程的。keys 指令會導致線程阻塞一段時間,線上服務會停頓,直到指令執行完畢,服務才能恢復。這個時候可以使用 scan 指令,scan 指令可以無阻塞的提取出指定模式的 key 列表,但是會有一定的重復概率,在客戶端做一次去重就可以了,但是整體所花費的時間會比直接用 keys 指令長。
46. 使用過 Redis 做異步隊列么,你是怎么用的?
一般使用 list 結構作為隊列,rpush 生產消息,lpop 消費消息。當 lpop 沒有消息的時候,要適當 sleep 一會再重試。
如果對方追問可不可以不用 sleep 呢?list 還有個指令叫 blpop,在沒有消息的時候,它會阻塞住直到消息到來。
如果對方追問能不能生產一次消費多次呢?使用 pub/sub 主題訂閱者模式,可以實現 1:N 的消息隊列。
如果對方追問 pub/sub 有什么缺點?在消費者下線的情況下,生產的消息會丟失,得使用專業的消息隊列如 rabbitmq 等。
如果對方追問 redis 如何實現延時隊列?我估計現在你很想把面試官一棒打死如果你手上有一根棒球棍的話,怎么問的這么詳細。但是你很克制,然后神態自若的回答道:使用 sortedset,拿時間戳作為 score,消息內容作為 key 調用 zadd 來生產消息,消費者用 zrangebyscore 指令獲取 N 秒之前的數據輪詢進行處理。
到這里,面試官暗地里已經對你豎起了大拇指。但是他不知道的是此刻你卻豎起了中指,在椅子背后。
47. 如果有大量的 key 需要設置同一時間過期,一般需要注意什么?
如果大量的 key 過期時間設置的過於集中,到過期的那個時間點,redis 可能會出現短暫的卡頓現象。一般需要在時間上加一個隨機值,使得過期時間分散一些。
48.Redis 如何做持久化的?
bgsave 做鏡像全量持久化,aof 做增量持久化。因為 bgsave 會耗費較長時間,不夠實時,在停機的時候會導致大量丟失數據,所以需要 aof 來配合使用。在 redis 實例重啟時,優先使用 aof 來恢復內存的狀態,如果沒有 aof 日志,就會使用 rdb 文件來恢復。
如果再問 aof 文件過大恢復時間過長怎么辦?你告訴面試官,Redis 會定期做 aof 重寫,壓縮 aof 文件日志大小。如果面試官不夠滿意,再拿出殺手鐧答案,Redis4.0 之后有了混合持久化的功能,將 bgsave 的全量和 aof 的增量做了融合處理,這樣既保證了恢復的效率又兼顧了數據的安全性。這個功能甚至很多面試官都不知道,他們肯定會對你刮目相看。
如果對方追問那如果突然機器掉電會怎樣?取決於 aof 日志 sync 屬性的配置,如果不要求性能,在每條寫指令時都 sync 一下磁盤,就不會丟失數據。但是在高性能的要求下每次都 sync 是不現實的,一般都使用定時 sync,比如 1s1 次,這個時候最多就會丟失 1s 的數據。
如果對方追問 bgsave 的原理是什么?你給出兩個詞匯就可以了,fork 和 cow。fork 是指 redis 通過創建子進程來進行 bgsave 操作,cow 指的是 copy on write,子進程創建后,父子進程共享數據段,父進程繼續提供讀寫服務,寫臟的頁面數據會逐漸和子進程分離開來。
49.Pipeline 有什么好處,為什么要用 pipeline?
可以將多次 IO 往返的時間縮減為一次,前提是 pipeline 執行的指令之間沒有因果相關性。使用 redis-benchmark 進行壓測的時候可以發現影響 redis 的 QPS 峰值的一個重要因素是 pipeline 批次指令的數目。
未完待續~~~
關注微信公眾號:PHP大神,然后回復“面試手冊”即可免費獲取更多相關資料~