php 微信公眾平臺開發(fā)教程如何結(jié)合和PHP這兩種語言解決實(shí)際開發(fā)中的問題方倍工作室微信公眾平臺開發(fā)最佳實(shí)踐^^^微信公眾平臺開發(fā)最佳
2022-11-09
在過去的十年中,我的團(tuán)隊為財富 500 強(qiáng)公司或只有 500 名用戶的公司開發(fā)了軟件。在此期間,我的工程團(tuán)隊主要使用 PHP 進(jìn)行后端開發(fā)。2 年前,我們在我們的開發(fā)項(xiàng)目中引入了一些東西,它不僅徹底改變了我們產(chǎn)品的性能,還改變了它們的可擴(kuò)展性——我們將把它引入我們的開發(fā)框架。
很快,我們找到的參考資料使我們能夠?yàn)榭蛻粼O(shè)計更大、速度提高 40 倍的應(yīng)用程序。我們可以利用 Go 的強(qiáng)大功能來增強(qiáng)我們用 PHP 編寫的產(chǎn)品php 微信公眾平臺開發(fā)教程,并利用這兩種語言的優(yōu)缺點(diǎn)。
我將解釋如何將這兩種語言與 PHP 結(jié)合來解決現(xiàn)實(shí)世界的開發(fā)問題,這將為您提供一條全新的 PHP 開發(fā)路徑,以解決與垂死的 PHP 模型相關(guān)的一些問題。
先介紹常用的PHP設(shè)置
在回答我們?nèi)绾问褂盟?PHP 起死回生之前,讓我們回顧一下標(biāo)準(zhǔn)的 PHP 設(shè)置。
在大多數(shù)情況下,PHP 開發(fā)人員將結(jié)合使用 web- 和 php-fpm 服務(wù)器來運(yùn)行應(yīng)用程序。當(dāng) php-fpm 執(zhí)行 PHP 代碼時,它提供靜態(tài)文件并將特定請求轉(zhuǎn)發(fā)給 php-fpm。也可以與 . 盡管這與上面的工作方式略有不同,但原理是相似的。
開發(fā)人員最感興趣的是了解 php-fpm 如何執(zhí)行應(yīng)用程序的代碼。發(fā)送請求時,php-fpm 啟動 PHP 子進(jìn)程并將請求內(nèi)容作為進(jìn)程狀態(tài)的一部分(_GET 等)。在 PHP 腳本的執(zhí)行過程中,狀態(tài)是無法改變的,所以獲取一組新的輸入數(shù)據(jù)的唯一方法就是銷毀進(jìn)程并重新開始。
像這樣的執(zhí)行模型有很多好處。您不必?fù)?dān)心內(nèi)存使用情況,所有進(jìn)程都是完全隔離的,如果其中任何一個死了,那么它們將自動創(chuàng)建而不會影響其他進(jìn)程。但與此同時,當(dāng)您嘗試擴(kuò)展應(yīng)用程序時,此功能可能會成為程序開發(fā)的絆腳石。
一般的PHP設(shè)置很麻煩,使用效率很低
如果你今天在做專業(yè)的 PHP 開發(fā),你應(yīng)該已經(jīng)知道開始一個新項(xiàng)目的第一步——選擇一個框架。該框架提供依賴注入、ORM、翻譯和大量豐富的庫。當(dāng)然,所有用戶輸入數(shù)據(jù)都可以方便地放置在一個對象(/或 PSR-7)中。該框架使用起來非常方便!
但一切都有兩個方面。所有企業(yè)級框架都要求您加載至少十幾個文件、構(gòu)造多個類并解析一些配置,以便處理簡單的用戶請求或查詢數(shù)據(jù)庫。最糟糕的是,您必須在完成每個任務(wù)后丟棄代碼。你剛開始的所有代碼現(xiàn)在都沒有用了,永遠(yuǎn)不能用來處理另一個請求。告訴任何不使用 PHP 的開發(fā)人員網(wǎng)站優(yōu)化,他們會感到困惑和無法理解。
多年來,聰明的 PHP 工程師一直試圖通過使用延遲加載、微框架、優(yōu)化庫、二級緩存等技術(shù)來緩解這些問題。但是在你的項(xiàng)目結(jié)束時,你仍然必須扔掉你的整個過程,一遍又一遍地重新開始。
PHP 可以在 的幫助下支持多個請求嗎?
可以編寫生命周期超過幾分鐘的 PHP 腳本,只要它們不是幾小時或幾天:諸如 cron 作業(yè)、CSV 解析器和隊列消費(fèi)者之類的東西。所有這些腳本都遵循相同的過程:檢索值、執(zhí)行作業(yè)并等待下一個值到達(dá)。代碼一直保存在內(nèi)存中,由于加載框架和引導(dǎo)程序所需的交互量,最終只節(jié)省了幾毫秒。
開發(fā)長時間運(yùn)行的腳本并不容易。任何錯誤都會徹底終止進(jìn)程,診斷內(nèi)存泄漏很麻煩,我們不能再使用 f5- 了。
然而,隨著 PHP7 的引入,情況有所改善,它提供了一個可靠的垃圾收集器,使錯誤更容易處理并防止核心內(nèi)存泄漏。雖然工程師仍然必須小心他們代碼中的內(nèi)存和狀態(tài)問題,但您不必?fù)?dān)心無法找出問題所在并有效地修復(fù)它們。
是否有可能采用一個需要長時間運(yùn)行 PHP 腳本的模型,并使其適應(yīng)更復(fù)雜的任務(wù),例如處理 HTTP 請求和消除每個請求的引導(dǎo)加載?
首先,我們需要實(shí)現(xiàn)一個服務(wù)器程序,接受 HTTP 請求,并將它們一個一個地轉(zhuǎn)發(fā)給 PHP 工作人員,而不是每次都?xì)⑺拦ぷ魅藛T。
我們知道我們可以用純 PHP(PHP-PM)實(shí)現(xiàn)一個 Web 服務(wù)器,或者用 C-() 編寫它。雖然這兩種方法各有優(yōu)勢,但都不能滿足我們,我們需要更好的方法。
我們需要的不僅僅是一個 Web 服務(wù)器,我們還希望能夠消除 PHP 開發(fā)的繁重工作和其他負(fù)面影響,同時仍然保持每個應(yīng)用程序的可伸縮性和多樣性。我們需要一個可以多樣化的應(yīng)用服務(wù)器。
您能幫我們創(chuàng)建這樣一個應(yīng)用服務(wù)器嗎?我的回答是,可以。由于該語言是跨平臺的,它可以將應(yīng)用程序編譯成單個二進(jìn)制文件,我們還可以利用其非常優(yōu)雅的并發(fā)模型和 HTTP 標(biāo)準(zhǔn)庫,最重要的是,我們可以使用我們擁有的數(shù)千個開源庫庫和集成環(huán)境。
如何讓兩種編程語言進(jìn)行集成開發(fā)
首先,我們需要了解兩個或多個應(yīng)用程序如何相互通信(進(jìn)程間通信)。
一種方法是使用 Alex 在英國發(fā)布的令人生畏的庫,它可以在 PHP 和進(jìn)程之間共享內(nèi)存(類似于)。但是,這種庫在我們的實(shí)際開發(fā)中給我們帶來了很大的限制。
我們決定使用另一種更經(jīng)典的方法,即在 / 上使用二進(jìn)制流來完成進(jìn)程間通信。我們之所以選擇這種方式,是因?yàn)檫@種通信方式已經(jīng)使用了幾十年,是一種可靠的通信方式,并且在操作系統(tǒng)層面進(jìn)行了很好的優(yōu)化。
首先,我們創(chuàng)建了一個輕量級的二進(jìn)制協(xié)議,用于在進(jìn)程之間交換數(shù)據(jù)和處理錯誤。在最簡單的實(shí)現(xiàn)中,這種類型的協(xié)議是類似的實(shí)現(xiàn),具有固定大小的標(biāo)頭(單擊此處查看我們的示例),其中包含有關(guān)每個數(shù)據(jù)包的類型、大小和二進(jìn)制掩碼的信息,以驗(yàn)證數(shù)據(jù)完整性。
在 PHP 方面,我們使用包 PHP 函數(shù)。因?yàn)?,我們使用?/ 庫。
我們甚至在創(chuàng)建協(xié)議方面更進(jìn)了一步。添加了直接從 PHP 調(diào)用 net/rpc 服務(wù)的能力。此功能在開發(fā)中非常有用,因?yàn)槲覀兛梢暂p松地將庫集成到我們的 PHP 應(yīng)用程序中。您可以在我們發(fā)布的另一個名為 .
實(shí)現(xiàn)PHP高并發(fā)處理任務(wù)
一旦建立了通信,下一個目標(biāo)就是最有效地將作業(yè)交付給 PHP 進(jìn)程。對于任何傳入的作業(yè),應(yīng)用程序服務(wù)器必須選擇一個空閑的工作人員來執(zhí)行所需的任務(wù)。如果 / 失敗或死亡,我們將其丟棄并為其創(chuàng)建替換過程。另一方面網(wǎng)站優(yōu)化,如果 / 成功,我們將其返回到池中并使其可用于下一個作業(yè)。
在這個需求的實(shí)現(xiàn)中,我們使用一個緩沖通道來存儲一個活躍的工人池。
最終結(jié)果是一個能夠處理任意二進(jìn)制作業(yè)的有效 PHP 服務(wù)器。
為了讓我們的應(yīng)用程序作為 Web 服務(wù)器工作,我們必須選擇一個可靠的 PHP 標(biāo)準(zhǔn)來表示任何傳入的 HTTP 請求。為了滿足這個需求,我們簡單地將 net/HTTP 請求轉(zhuǎn)換為 PSR-7() 格式,使其與市場上的大多數(shù) PHP 框架兼容。
由于 PSR-7 格式是不可變的(一些工程師可能會指出它在技術(shù)上是不可變的),它迫使開發(fā)人員編寫不再將請求視為全局實(shí)體的應(yīng)用程序。這完全符合長期運(yùn)行 PHP 進(jìn)程的想法。最終實(shí)現(xiàn)如下所示:
簡介 - 一個高性能的 PHP 應(yīng)用服務(wù)器
我們最初的測試用例是一個用于后端的 API,其不可預(yù)測的請求突發(fā)量比平時高出許多倍。雖然它在大多數(shù)情況下會有所幫助,但經(jīng)常會出現(xiàn) 502 錯誤,因?yàn)槲覀儫o法預(yù)測負(fù)載何時會增加,也無法在負(fù)載增加之前快速平衡系統(tǒng)。
2018 年初,我們在市場上部署了我們的第一臺 PHP/應(yīng)用程序服務(wù)器以替換此設(shè)置。效果立竿見影,令人難以置信。我們不僅完全消除了 502 錯誤,而且最終將服務(wù)器總數(shù)減少了近三分之二,從而為工程師和產(chǎn)品所有者節(jié)省了大量工作和服務(wù)器成本。
到 2018 年年中,我們優(yōu)化了該方法,在 MIT 許可下發(fā)布,并調(diào)用它,實(shí)現(xiàn)了令人難以置信的速度和效率。
如何幫助發(fā)展
引入我們的技術(shù)堆棧將允許我們使用中間件進(jìn)行 HTTP 通信php 微信公眾平臺開發(fā)教程,在請求到達(dá) PHP 之前啟用 JWT 驗(yàn)證,處理并將統(tǒng)計信息匯總到其中。通過使用嵌入式 RPC,我們可以將 API 從任何庫傳遞到 PHP 以供使用,而無需自定義驅(qū)動程序。最重要的是,我們可以使用該庫來設(shè)置一個不同于 HTTP 的新服務(wù)器。示例包括在 PHP 中運(yùn)行 AWS 處理程序,創(chuàng)建可靠的隊列使用,甚至將 GRPC 添加到我們的應(yīng)用程序。
到目前為止,在 PHP 和開發(fā)社區(qū)的幫助下,我們改進(jìn)了調(diào)試工具,將它們與框架集成,并添加了對 HTTP/2 和 PSR-17 的處理。我們提高了程序的穩(wěn)定性,在一些測試中,程序的性能提升了多達(dá) 40 倍。
綜上所述
有些人仍然堅持認(rèn)為 PHP 是一種緩慢而笨拙的語言,只能用于編寫插件。他們甚至可能會說 PHP 有一個限制:一旦你的應(yīng)用程序變得更大,你必須切換到更“成熟”的語言并替換以前的 PHP 代碼。
對他們來說,我們想說“請三思而后行”。我們認(rèn)為 PHP 的唯一限制是您給自己的限制。您可以花一生的時間從一種語言跳到另一種語言,試圖找到適合您的編程需求的“完美匹配”,或者您可以開始將語言本身重新想象成一種工具。像 PHP 這樣的編程語言明顯的缺點(diǎn)實(shí)際上可能是其成功的關(guān)鍵。通過將其與 Go 等其他語言配對,您最終可以創(chuàng)建比自己使用任何一種語言更強(qiáng)大的產(chǎn)品。
在用 Go 和 PHP 進(jìn)行了一段時間的混合編程之后,我們可以自信地說我們都喜歡這種開發(fā)方式。我們不會放棄,我們將繼續(xù)尋找充分利用這種雙棧編程的方法。
騰云網(wǎng)絡(luò)是一家領(lǐng)先的軟件開發(fā)商,為舊金山和美國各地的客戶提供從小型網(wǎng)站到大型分布式系統(tǒng)的定制產(chǎn)品的全棧開發(fā)。如果您有 PHP 或相關(guān)項(xiàng)目,或者遇到無法在 PHP 中擴(kuò)展或受過時代碼壓縮限制的應(yīng)用程序,請與我們的團(tuán)隊聯(lián)系。
: , 首席技術(shù)官,
通過:
作者:John W. 譯者:校對:
本文由GCTT原創(chuàng)編譯,Go語言中文網(wǎng)首發(fā)。