詳解高級PHP工程師面試題
第1題.Git的分支你們是怎么管理的?
git?為什么好,為什么要用?git,這不是我本文想要說明的問題。
這里想要給大家分享一下自己使用過程中產生的疑惑,以及解決的這些疑惑的過程。話又說回來,我現在依然充滿疑惑。真不知道30歲的時候會不會不惑。
在使用?git?過程中,它的分支功能讓我真的欣喜若狂,不過這是把雙刃劍,一不小心你會得到這種git路徑圖:
圖片來源:阮一峰老師博客
我的疑惑:
那么團隊中我們該使用怎樣的分支策略來進行開發協作?
在多人的團隊中,我們應該在?master?分支上直接開發嗎?
如果線上產生了bug該通過什么樣方式的分支去修復?
當有多個分支的時候,測試如何有效的參與進來每一個分支的測試?
用成熟的工作流來解決問題
在解答上面的疑惑前,先介紹幾個工作流,然后通過工作流的模式,來進行解答。因為我們必須在某種設定的情景下,才能討論解決問題的思路。
下面三種工作流方式,都是采用功能驅動開發,也就是先有需求產生,然后誕生對應的分支,然后開發,最后合并回來,完成使命被刪除。
Git flow
Github flow
Gitlab flow
關于這三種工作流的詳細介紹,建議看看這篇文章-阮一峰
我現在采用的是?Git flow?,經過自己的實踐,確實好用,解決不少問題。然后如果發現與自己的實際情況有些出入,可以根據需求做出些變動調整。
我的選擇
我選擇了 Git flow,它的主要特點是,長期存在兩個分支:
主分支master
開發分支develop
然后,存在三種輔助分支,都是短期的,并且一半情況下只應該存在本地,不要提交到遠程庫。
功能分支(feature branch)
補丁分支(hotfix branch)
預發分支(release branch)
在進行上面的分支時,建議的命名規范:feature-xxx、release-xxx、hotfix-xxx
話外:我以前喜歡用下劃線,后來發現打中線不需要按?shift?,哈哈,從此開始中線時代。
什么時候要功能分支?
當你拿到一個需求,或者不是一個立馬需求上線的bug修復,那么就應該從?develop?開一個分支出來,完成這部分工作。完成后合并到?develop?分支。
什么時候要預發分支?
這個分支是為預發準備的,測試的介入,也只應該在該分支產生時才介入。當我們不管是新功能開發,還是一般的bug修改都差不多了。就應該從develop產生一個release分支,交給測試,如果有bug直接在上面修改。全部完成后,合并回develop,并且合并到master。
關于這個分支我得再多說幾句。因為這是非常重要的一步,如果我們使用了 git 鉤子,當合并到?master?的時候,會自動發布到線上,所以這是臨上線的最后一道屏障。
同時這里也解決了我一個疑惑,測試如何參與到git的每個分支中來?答案是:測試不應該參與到每個分支中來,只應該參與到release分支中去。其它的開發分支,都應該由開發人員自己測試,測試沒有問題的時候才準許合并到develop,這就要求每一個開發要提高自己交付的產品質量,如何確保自己交付的產品質量?自動化測試是個不錯的選擇,好了,打住,這不是咋們今天的主要任務,這個話題改天再聊。
什么時候需要補丁分支?
這種情況越少越好。因為它產生的原因是:線上出了bug,并且必須馬上修復,不管你身在何方,當手機響起,拿出電腦改bug吧。
它與release?很像,都需要完成后,同時合并到:master與develop。不同的是,它需要從master?上開一個分支出來。
注意這里沒有測試的介入,一半來說都是代碼上某一個小的緊急bug,雖然很嚴重,但是可以很容易改動。當然如果有一些例外情況,應該讓測試進行測試后再合并、發布。
總結
git?開發很好用,但是要按照一定規則合理使用分支。
另外,除了:master與develop?分支,其它分支都不應該出現在遠程倉庫中。
用git一定要結合它的各種鉤子來使用,提升開發效率。這里后面來介紹下。
參考資料:
[1]Git 工作流程
[2]介紹一個成功的 Git 分支模型
團隊開發Git分支管理策略
第2題. PHP進程間通信是如何實現的?
通常linux中的進程通信方式有:消息隊列、信號量、共享內存、信號、管道、socket。
消息隊列: 消息隊列是存放在內存中的一種隊列數據結構。
信號量:是系統提供的一種原子操作,一個信號量,同時只有你一個進程能操作。一個進程獲得了某個信號量,就必須被該進程釋放掉。
共享內存:是系統在內存中開辟的一塊公共的內存區域,任何一個進程都可以訪問,在同一時刻,可以有多個進程訪問該區域,為了保證數據的一致性,需要對該內存區域加鎖或信號量。
信號: 信號是一種系統調用。通常我們用的kill命令就是發送某個信號給某個進程的。具體有哪些信號可以在liunx/mac中運行kill -l查看。下面這個例子中,父進程等待5秒鐘,向子進程發送sigint信號。子進程捕獲信號,掉信號處理函數處理。
管道: 管道是比較常用的多進程通信手段,管道分為無名管道與有名管道,無名管道只能用于具有親緣關系的進程間通信,而有名管道可以用于同一主機上任意進程。這里只介紹有名管道。下面的例子,子進程寫入數據,父進程讀取數據。
我們發現 PHP 對信號量和共享內存封裝得很好,使用起來非常簡單。除此之外,PHP 的類庫 Sync 將常用 IPC 方法封裝成為類,能實現跨平臺的使用.
參考:PHP進程間通信詳解??PHP進程間通信
3. Swoole的協程和php自帶的yield的場景有哪些?
php自帶的yield的場景:
協程可以用在,異步網絡 IO 的時候,使其成為非阻塞的。
比如你在一個 http 請求里面,你需要請求外面的接口,那么會有下面的場景。
你的前置 server 是 nginx,nginx 是非阻塞異步的,但是 php-fpm 是同步阻塞的。那么當你在請求外面接口的時候,這個任務就會被阻塞。(這里補充一下,php-fpm 的 Worker 進程是同步阻塞的)
假設你使用協程,那么當你在請求接口的時候,你的這個任務就可以暫停,保存上下文。然后呢,當你的接口返回了之后,重新調起這個任務繼續執行。你的進程就不必耗在這一個任務上了,可以去處理其它的 http 請求了。這樣是不是并發量就高了?
同理,當你的請求在查詢數據庫的時候,也是一個 IO 請求,也是同步的。協程就可以讓你這些 IO 編程異步非阻塞的,從而增大你的并發量。這主要是讓你的 CPU 可以在等待 IO 的時候,可以處理別的事情。所有的 IO 請求都可以通過協程做到這一點。
4.搭建MySQL分布式有哪些方式?
5.什么是Hash一致性,這個方法主要運用在什么場景
Git PHP
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。