站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

享受PHP與Go的強(qiáng)大合體【RoadRunner】的樂趣!

享受它的樂趣吧!


在過去的十年中,我們一直在為 財(cái)富 500 強(qiáng)公司 以及用戶人數(shù)不超過 500 人的企業(yè)開發(fā)應(yīng)用程序。 一直以來,我們的工程師主要使用 PHP 來開發(fā)后端。 但是兩年前,出現(xiàn)了一些問題不僅嚴(yán)重影響了我們的產(chǎn)品性能,還影響了它們的可擴(kuò)展性——因此我們將 Golang (Go) 引入了我們的技術(shù)棧。

幾乎同時(shí),我們發(fā)現(xiàn) Go 不僅允許我們創(chuàng)建更大的應(yīng)用程序,并且能夠?qū)⑿阅芴岣叨噙_(dá) 40 倍。 有了它,我們能夠擴(kuò)展使用 PHP 編寫的現(xiàn)有產(chǎn)品,并通過結(jié)合兩種語言的優(yōu)勢來改進(jìn)它們。

我們將通過大量的 Go 和 PHP 經(jīng)驗(yàn)告訴你,如何用它解決實(shí)際的開發(fā)問題,以及我們?nèi)绾伟阉兂梢粋€(gè)工具,來消除與 PHP 死亡模型 相關(guān)的一些問題。

推薦學(xué)習(xí):《PHP視頻教程》

常規(guī) PHP 開發(fā)環(huán)境

在講述 Go 如何改善 PHP 死亡模型前,先了解一下常規(guī) PHP 開發(fā)環(huán)境。

通常,應(yīng)用運(yùn)行于 nginx 和 PHP-FPM 上。nginx 處理靜態(tài)請求,而動態(tài)請求則被重定向給 PHP-FPM,并由其執(zhí)行 PHP 代碼。也許你用的是 Apache 和 mod_php,但是他們原理相同,運(yùn)行起來只有細(xì)微的差別。

看看 PHP-FPM 是如何執(zhí)行代碼的。當(dāng)收到請求,PHP-FPM 初始化 PHP 子進(jìn)程,并將請求的詳細(xì)信息轉(zhuǎn)發(fā)給它,作為其狀態(tài)的一部分(_GET, _POST, _SERVER 等)。

在 PHP 腳本執(zhí)行期間,狀態(tài)將無法更改,因此只能通過一種方式獲取一組新的輸入數(shù)據(jù):清除進(jìn)程內(nèi)存并再次初始化它。

這種性能模型有許多優(yōu)點(diǎn)。你不需要太擔(dān)心內(nèi)存消耗,所有進(jìn)程都是完全隔離的,如果其中一個(gè)進(jìn)程「死亡」,它將自動重新創(chuàng)建,并且不會影響其他進(jìn)程。但是,當(dāng)你嘗試擴(kuò)展應(yīng)用程序時(shí),這種方式會有缺點(diǎn)產(chǎn)生。

典型 PHP 環(huán)境的缺點(diǎn)和低效性

如果你從事 PHP 的專業(yè)開發(fā),那么你就知道從哪兒開始創(chuàng)建一個(gè)新項(xiàng)目——選擇框架。它是一個(gè)用于依賴注入、ORM、轉(zhuǎn)化和模板方法的庫。當(dāng)然,所有用戶輸入的數(shù)據(jù)都可以方便地放在一個(gè)對象中(Symfony / HttpFoundation 或者 PSR-7)。這些框架很棒!

但一切都有它的代價(jià)。在任何企業(yè)框架中,為了處理一個(gè)簡單的用戶請求或訪問數(shù)據(jù)庫,您必須加載至少幾十個(gè)文件,創(chuàng)建許多類,并解析多個(gè)配置。但最糟糕的是,在每個(gè)任務(wù)完成后,您需要重置所有內(nèi)容并重新啟動:您剛剛啟動的所有代碼都將變得無用,在它的幫助下,您將無法處理另一個(gè)請求。把這件事告訴任何用其他語言編寫的程序員——你會看到他臉上的困惑。

多年來,PHP工程師一直在尋找解決此問題的方法,他們使用了延遲加載技術(shù)、微幀、優(yōu)化庫、緩存等。但最終,您仍然必須放棄整個(gè)應(yīng)用程序,重新開始*(譯者注:隨著PHP7.4中預(yù)加載的出現(xiàn),這個(gè)問題將得到部分解決)

一個(gè)PHP進(jìn)程能處理多個(gè)請求嗎?

您可以編寫持續(xù)時(shí)間超過幾分鐘的PHP腳本(最多幾小時(shí)或幾天):例如Cron任務(wù)、CSV解析器、隊(duì)列處理程序。所有這些工作遵循一個(gè)模式:他們獲取一條任務(wù),處理完它,然后獲取下一個(gè)任務(wù)。代碼常駐在內(nèi)存中,因此避免了額外的操作來加載框架和應(yīng)用程序,節(jié)約了寶貴時(shí)間。

但是開發(fā)長時(shí)間運(yùn)行的腳本并不是那么容易。任何錯(cuò)誤都會殺死進(jìn)程,內(nèi)存溢出會導(dǎo)致崩潰,而且不能用F5來調(diào)試程序了。

自PHP 7后情況有所改善:可靠的垃圾收集器出現(xiàn)了,它變得更容易處理錯(cuò)誤,內(nèi)核的擴(kuò)展可以避免內(nèi)存泄漏。是的,工程師仍然需要仔細(xì)處理內(nèi)存并記住代碼中的狀態(tài)的問題(有哪一種語言能讓你可以不關(guān)注這些事情呢?)當(dāng)然,在PHP 7中,驚喜并不多。

是否可以采用一種 常駐 PHP 腳本的模型,將其用于處理 HTTP 請求等更瑣碎的任務(wù),從而消除對每個(gè)請求都從頭開始下載所有內(nèi)容的需要?

要解決這個(gè)問題,首先需要實(shí)現(xiàn)一個(gè)服務(wù)器應(yīng)用程序,該應(yīng)用程序可以接收 HTTP 請求并將它們逐個(gè)重定向到 PHP worker,而不是每次都?xì)⑺浪?/p>

我們知道我們可以用純 PHP(PHP-PM)或 C 擴(kuò)展(Swoole)編寫 web 服務(wù)器。盡管每種方法都有其優(yōu)點(diǎn),但這兩種選擇都不適合我們 —— 我想要

贊(0)
分享到: 更多 (0)
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
成人国产精品999视频| 久久免费精品视频| 四虎精品在线视频| 国产成人精品日本亚洲专| 久久精品日日躁精品| 9久久9久久精品| 国产精品成人精品久久久| 亚洲国产日韩在线成人蜜芽| 韩国精品一区视频在线播放| 2020精品极品国产色在线观看| 人人妻人人澡人人爽人人精品 | 精品久久久久久无码专区不卡| 久久久久久国产精品三级 | 国产精品久久久久影院嫩草| 99久久国产综合精品1尤物| 久久精品国产99精品国产2021| 国产麻豆一精品一AV一免费| 兽交精品99高清毛片| 久久乐国产精品亚洲综合| 国产乱码精品一区二区三| 亚洲国产精品狼友中文久久久 | 中文精品字幕电影在线播放视频| 亚洲成网777777国产精品| 国产日韩美国成人| 四虎成人精品在永久在线| 美女bbbb精品视频| 一本久久伊人热热精品中文| 中日韩精品视频在线观看| 亚洲国产成人精品女人久久久 | 亚洲国产欧美日韩精品一区二区三区 | 亚洲麻豆精品国偷自产在线91 | 日产精品久久久一区二区| 日韩精品区一区二区三VR| 亚洲精品无码不卡| 91精品国产手机| 久久精品国产久精国产果冻传媒| 亚洲视频国产精品| 国产精品揄拍一区二区久久| 97人妻无码一区二区精品免费| 久久精品中文字幕大胸| 亚洲av纯肉无码精品动漫|