溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

高級(jí)PHP工程師面試題有哪些

發(fā)布時(shí)間:2021-11-25 16:51:12 來(lái)源:億速云 閱讀:98 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要講解了“高級(jí)PHP工程師面試題有哪些”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“高級(jí)PHP工程師面試題有哪些”吧!

第1題.Git的分支你們是怎么管理的?

在使用 git 過(guò)程中,它的分支功能讓我真的欣喜若狂,不過(guò)這是把雙刃劍,一不小心你會(huì)得到這種git路徑圖:

高級(jí)PHP工程師面試題有哪些

我的疑惑:

那么團(tuán)隊(duì)中我們?cè)撌褂迷鯓拥姆种Р呗詠?lái)進(jìn)行開(kāi)發(fā)協(xié)作?

在多人的團(tuán)隊(duì)中,我們應(yīng)該在 master 分支上直接開(kāi)發(fā)嗎?

如果線上產(chǎn)生了bug該通過(guò)什么樣方式的分支去修復(fù)?

當(dāng)有多個(gè)分支的時(shí)候,測(cè)試如何有效的參與進(jìn)來(lái)每一個(gè)分支的測(cè)試?

用成熟的工作流來(lái)解決問(wèn)題

在解答上面的疑惑前,先介紹幾個(gè)工作流,然后通過(guò)工作流的模式,來(lái)進(jìn)行解答。因?yàn)槲覀儽仨氃谀撤N設(shè)定的情景下,才能討論解決問(wèn)題的思路。

下面三種工作流方式,都是采用功能驅(qū)動(dòng)開(kāi)發(fā),也就是先有需求產(chǎn)生,然后誕生對(duì)應(yīng)的分支,然后開(kāi)發(fā),最后合并回來(lái),完成使命被刪除。

Git flowGithub flowGitlab flow

關(guān)于這三種工作流的詳細(xì)介紹,建議看看這篇文章-阮一峰

我現(xiàn)在采用的是 Git flow ,經(jīng)過(guò)自己的實(shí)踐,確實(shí)好用,解決不少問(wèn)題。然后如果發(fā)現(xiàn)與自己的實(shí)際情況有些出入,可以根據(jù)需求做出些變動(dòng)調(diào)整。

我的選擇

我選擇了 Git flow,它的主要特點(diǎn)是,長(zhǎng)期存在兩個(gè)分支:

主分支master開(kāi)發(fā)分支develop

然后,存在三種輔助分支,都是短期的,并且一半情況下只應(yīng)該存在本地,不要提交到遠(yuǎn)程庫(kù)。

功能分支(feature branch)補(bǔ)丁分支(hotfix branch)預(yù)發(fā)分支(release branch)

在進(jìn)行上面的分支時(shí),建議的命名規(guī)范:feature-xxx、release-xxx、hotfix-xxx

話外:我以前喜歡用下劃線,后來(lái)發(fā)現(xiàn)打中線不需要按 shift ,哈哈,從此開(kāi)始中線時(shí)代。

什么時(shí)候要功能分支?

當(dāng)你拿到一個(gè)需求,或者不是一個(gè)立馬需求上線的bug修復(fù),那么就應(yīng)該從 develop 開(kāi)一個(gè)分支出來(lái),完成這部分工作。完成后合并到 develop 分支。

高級(jí)PHP工程師面試題有哪些

什么時(shí)候要預(yù)發(fā)分支?

        這個(gè)分支是為預(yù)發(fā)準(zhǔn)備的,測(cè)試的介入,也只應(yīng)該在該分支產(chǎn)生時(shí)才介入。當(dāng)我們不管是新功能開(kāi)發(fā),還是一般的bug修改都差不多了。就應(yīng)該從develop產(chǎn)生一個(gè)release分支,交給測(cè)試,如果有bug直接在上面修改。全部完成后,合并回develop,并且合并到master。

        關(guān)于這個(gè)分支我得再多說(shuō)幾句。因?yàn)檫@是非常重要的一步,如果我們使用了 git 鉤子,當(dāng)合并到 master 的時(shí)候,會(huì)自動(dòng)發(fā)布到線上,所以這是臨上線的最后一道屏障。

        同時(shí)這里也解決了我一個(gè)疑惑,測(cè)試如何參與到git的每個(gè)分支中來(lái)?答案是:測(cè)試不應(yīng)該參與到每個(gè)分支中來(lái),只應(yīng)該參與到release分支中去。其它的開(kāi)發(fā)分支,都應(yīng)該由開(kāi)發(fā)人員自己測(cè)試,測(cè)試沒(méi)有問(wèn)題的時(shí)候才準(zhǔn)許合并到develop,這就要求每一個(gè)開(kāi)發(fā)要提高自己交付的產(chǎn)品質(zhì)量,如何確保自己交付的產(chǎn)品質(zhì)量?自動(dòng)化測(cè)試是個(gè)不錯(cuò)的選擇,好了,打住,這不是咋們今天的主要任務(wù),這個(gè)話題改天再聊。

什么時(shí)候需要補(bǔ)丁分支?

這種情況越少越好。因?yàn)樗a(chǎn)生的原因是:線上出了bug,并且必須馬上修復(fù),不管你身在何方,當(dāng)手機(jī)響起,拿出電腦改bug吧。

        它與release 很像,都需要完成后,同時(shí)合并到:master與develop。不同的是,它需要從master 上開(kāi)一個(gè)分支出來(lái)。

        注意這里沒(méi)有測(cè)試的介入,一半來(lái)說(shuō)都是代碼上某一個(gè)小的緊急bug,雖然很嚴(yán)重,但是可以很容易改動(dòng)。當(dāng)然如果有一些例外情況,應(yīng)該讓測(cè)試進(jìn)行測(cè)試后再合并、發(fā)布。

git 開(kāi)發(fā)很好用,但是要按照一定規(guī)則合理使用分支。

另外,除了:master與develop 分支,其它分支都不應(yīng)該出現(xiàn)在遠(yuǎn)程倉(cāng)庫(kù)中。

用git一定要結(jié)合它的各種鉤子來(lái)使用,提升開(kāi)發(fā)效率。這里后面來(lái)介紹下。

第2題. PHP進(jìn)程間通信是如何實(shí)現(xiàn)的?

通常linux中的進(jìn)程通信方式有:消息隊(duì)列、信號(hào)量、共享內(nèi)存、信號(hào)、管道、socket。

消息隊(duì)列: 消息隊(duì)列是存放在內(nèi)存中的一種隊(duì)列數(shù)據(jù)結(jié)構(gòu)。

信號(hào)量:是系統(tǒng)提供的一種原子操作,一個(gè)信號(hào)量,同時(shí)只有你一個(gè)進(jìn)程能操作。一個(gè)進(jìn)程獲得了某個(gè)信號(hào)量,就必須被該進(jìn)程釋放掉。

共享內(nèi)存:是系統(tǒng)在內(nèi)存中開(kāi)辟的一塊公共的內(nèi)存區(qū)域,任何一個(gè)進(jìn)程都可以訪問(wèn),在同一時(shí)刻,可以有多個(gè)進(jìn)程訪問(wèn)該區(qū)域,為了保證數(shù)據(jù)的一致性,需要對(duì)該內(nèi)存區(qū)域加鎖或信號(hào)量。

信號(hào): 信號(hào)是一種系統(tǒng)調(diào)用。通常我們用的kill命令就是發(fā)送某個(gè)信號(hào)給某個(gè)進(jìn)程的。具體有哪些信號(hào)可以在liunx/mac中運(yùn)行kill -l查看。下面這個(gè)例子中,父進(jìn)程等待5秒鐘,向子進(jìn)程發(fā)送sigint信號(hào)。子進(jìn)程捕獲信號(hào),掉信號(hào)處理函數(shù)處理。

管道: 管道是比較常用的多進(jìn)程通信手段,管道分為無(wú)名管道與有名管道,無(wú)名管道只能用于具有親緣關(guān)系的進(jìn)程間通信,而有名管道可以用于同一主機(jī)上任意進(jìn)程。這里只介紹有名管道。下面的例子,子進(jìn)程寫入數(shù)據(jù),父進(jìn)程讀取數(shù)據(jù)。

我們發(fā)現(xiàn) PHP 對(duì)信號(hào)量和共享內(nèi)存封裝得很好,使用起來(lái)非常簡(jiǎn)單。除此之外,PHP 的類庫(kù) Sync 將常用 IPC 方法封裝成為類,能實(shí)現(xiàn)跨平臺(tái)的使用.

3. Swoole的協(xié)程和php自帶的yield的場(chǎng)景有哪些?

php自帶的yield的場(chǎng)景:

協(xié)程可以用在,異步網(wǎng)絡(luò) IO 的時(shí)候,使其成為非阻塞的。

比如你在一個(gè) http 請(qǐng)求里面,你需要請(qǐng)求外面的接口,那么會(huì)有下面的場(chǎng)景。

你的前置 server 是 nginx,nginx 是非阻塞異步的,但是 php-fpm 是同步阻塞的。那么當(dāng)你在請(qǐng)求外面接口的時(shí)候,這個(gè)任務(wù)就會(huì)被阻塞。(這里補(bǔ)充一下,php-fpm 的 Worker 進(jìn)程是同步阻塞的)

假設(shè)你使用協(xié)程,那么當(dāng)你在請(qǐng)求接口的時(shí)候,你的這個(gè)任務(wù)就可以暫停,保存上下文。然后呢,當(dāng)你的接口返回了之后,重新調(diào)起這個(gè)任務(wù)繼續(xù)執(zhí)行。你的進(jìn)程就不必耗在這一個(gè)任務(wù)上了,可以去處理其它的 http 請(qǐng)求了。這樣是不是并發(fā)量就高了?

同理,當(dāng)你的請(qǐng)求在查詢數(shù)據(jù)庫(kù)的時(shí)候,也是一個(gè) IO 請(qǐng)求,也是同步的。協(xié)程就可以讓你這些 IO 編程異步非阻塞的,從而增大你的并發(fā)量。這主要是讓你的 CPU 可以在等待 IO 的時(shí)候,可以處理別的事情。所有的 IO 請(qǐng)求都可以通過(guò)協(xié)程做到這一點(diǎn)。

感謝各位的閱讀,以上就是“高級(jí)PHP工程師面試題有哪些”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)高級(jí)PHP工程師面試題有哪些這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI