电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

詳解PHP調用Go服務的正確方式

瀏覽:64日期:2022-09-07 11:07:09
目錄問題服務耦合服務抽取Unix Domain Sockets進程間通信簡單介紹適用場景代碼實現Go 實現的 Trie 樹Go ServerPHP Client小結效率雜談問題服務耦合

我們在開發過程中可能會遇到這樣的情況:

進程依賴于某服務,所以把服務耦合在進程代碼中; 服務初始化耗時長,拖慢了進程啟動時間; 服務運行要占用大量內存,多進程時內存損耗嚴重。

文本匹配服務,它是消息處理流程中的一環,被多個消息處理進程依賴,每次初始化進程要 6秒 左右時間構造 Trie 樹,而且服務讀取關鍵詞大文件、使用樹組構造 Trie 樹,會占用大量(目前設置為 256M )內存。

我已經把進程寫成了守護進程的形式,讓它們長時間執行,雖然不用更多地考慮初始化時間了,但占用內存量巨大的問題沒有辦法。如果關鍵詞量再大一些,一臺機器上面跑十來個消息處理進程后就干不了其他了。

而且,如果有需求讓我把文本匹配服務封裝為接口給外部調用呢?我們知道,web 服務時,每一個請求處理進程的生存周期是從受理請求到響應結束,如果每次請求都用大量內存和時間來初始化服務,那接口響應時間和服務器壓力可想而知。

服務抽取

這樣,服務形式必須要改變,我們希望這個文本匹配這個服務能做到:

隨調隨走,不依賴,不再與“消息處理服務”耦合在一起; 一次初始化,進程運行期間持續提供服務; 同步響應,高效而準確,最好能不用各種鎖來保持資源占有;

解決辦法也很簡單,就是把這個文本匹配的服務抽取出來,單獨作為一個守護進程來運行,像一個特殊的服務器,多個“消息處理服務”在有需要時能調用此服務進程。

現在,我們需要考慮文本匹配服務進程如何與外界通信,接受匹配請求,響應匹配結果。繞來繞去,問題還是回到了 進程間通信。

Unix Domain Sockets進程間通信

進程間通信(IPC,Inter-Process Communication),指至少兩個進程或線程間傳送數據或信號的一些技術或方法。進程是計算機系統分配資源的最小單位(嚴格說來是線程)。每個進程都有自己的一部分獨立的系統資源,彼此是隔離的。為了能使不同的進程互相訪問資源并進行協調工作,才有了進程間通信。

進程間通信的方式有很多,網上對此介紹的也很多,下面根據文章的需求來分析一下這些方式:

管道:管道是Unix最初的IPC形式,但它只能用于具有共同祖先進程的各個進程,無法用于在沒有親緣關系的進程。如果使用它,需要在“消息處理服務”中啟動“文本匹配服務”,跟原來差別不大。 命名管道:也被稱為有名管道,它在Unix稱為FIFO,它通過一個文件來進行進程間數據交互,但服務于多個進程時,需要添加鎖來保證原子性,從而避免寫入和讀取不對應。 信號和信號量:用于進程/線程事件級的通信,但它們能交流的信息太少。 消息隊列和共享內存:都是通過一個公共內存介質來進行通信 socket:通過Unix封裝好的網絡API來進行通信,像數據庫、服務器都是通過這種方式實現,它們也能提供本地服務。不過網絡socket固然能使用,但是要面臨著數據包裝和網絡調用開銷,也不是完美的選擇。簡單介紹

當然還是有完美的方式的,這就是今天的主角 - Unix Domain Sockets ,它可以理解為一種特殊的 Socket,但它不需要經過網絡協議棧,不需要打包拆包、計算校驗和、維護序號和應答等,只是將應用層數據從一個進程拷貝到另一個進程,所以在系統內通信效率更高。而且免去了網絡問題,它也更能保證消息的完整性,既不會丟失也不會順序錯亂。

作為特殊的 Socket,它的創建、調用方式和網絡 Socket 一樣,一次完整的交互,服務端都要經過create、bind、listen、accept、read、write,客戶端要通過create、connect、write、read。與普通 Socket 不同的是它綁定一個系統內的文件,而不是 IP 和端口。

適用場景

Unix Domain Sockets 真的是進程間通信的一個重型武器,用它可以快速實現進程間的數據、信息交互,而且不需要鎖等繁雜操作,也不用考慮效率,可謂是簡單高效。

當然,“重型武器” 的在各種場景下也有適合不適合。Unix Domain Sockets適用于以下場景:

服務長時間存在。 Unix Domain Sockets 的服務端是個服務器一樣的存在,在守護進程中,它阻塞并等待客戶端連接的特性可以被充分利用。 一服務器多客戶端。它能通過 Socket 的文件描述符來區分不同的客戶端,避免資源之間的鎖操作。 同一系統內。它只能在同一系統內進行進程數據復制,跨系統請使用傳統 Sockets。代碼實現

接下來要 show code 了,不過學 PHP 的都知道,PHP 不太適合處理 CPU 密集形的任務,我剛好學了點 Go,一時手癢,就用 Go 實現了下 Trie 樹,所以才牽扯到 PHP 和 Go 之間的通信,有了今天的文章。當然介紹的方法,并不只適合 PHP 與 Go 通信,其他語言也可以,至少 C系語言中是通用的。

Go 實現的 Trie 樹

Trie樹不再是今天的主題,這里介紹一下數據結構和需要注意的點。

// trie樹結點定義type Node struct { depth int children map[int32]Node // 用map實現key-value型的 字符-節點 對應}

需要注意:

使用 slice 的 append() 函數保存遞增的匹配結果時,有可能由于 slice 容量不夠而重新分配地址,所以要傳入 slice 的地址來保存遞增后的匹配結果結果,*result = append(*result, word),最后再將遞增之后的 slice 地址傳回。 由于 Go 中的編碼統一使用的 utf-8,不用像 PHP 一樣判斷字符的邊界,所以在進行關鍵詞拆散和消息拆散時,直接使用 int32() 方法將關鍵詞和消息都轉換為成員為 int32 類型的 slice,匹配過程中就使用 int32 類型的數字來代表這個中文字符,匹配完成后再使用fmt.Printf('%c', int32)將其轉換為中文。Go Server

Go 中創建一個 socket 并使用的步驟非常簡單,只是 Go 沒有異常,判斷 error 會比較惡心一點,不知道有沒有大神有更好的寫法。下面為了精簡,把 error 全置空了。

// 創建一個Unix domain soceket socket, _ := net.Listen('unix', '/tmp/keyword_match.sock') // 關閉時刪除綁定的文件 defer syscall.Unlink('/tmp/keyword_match.sock') // 無限循環監聽和受理客戶端請求 for {client, _ := socket.Accept()buf := make([]byte, 1024)data_len, _ := client.Read(buf)data := buf[0:data_len]msg := string(data)matched := trie.Match(tree, msg)response := []byte('[]') // 給響應一個默認值if len(matched) > 0 { json_str, _ := json.Marshal(matched) response = []byte(string(json_str))}_, _ = client.Write(response) }PHP Client

下面是 PHP 實現的客戶端:

$msg = 'msg';// 創建 連接 發送消息 接收響應 關閉連接$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);socket_connect($socket, ’/tmp/keyword_match.sock’);socket_send($socket, $msg, strlen($msg), 0);$response = socket_read($socket, 1024);socket_close($socket);// 有值則為匹配成功if (strlen($response) > 3) { var_dump($response);}小結效率

這里總結一下這套設計的效率表現:

純粹用 Go 進行文本關鍵詞匹配,一千條數據運行一秒多,差不多是 PHP 效率的兩倍。不過說好的 8倍效率呢?果然測評都是騙人的。當然,也可能是我寫法有問題或者 Trie 樹不在 Go 的發揮范圍之內。然后是 PHP 使用 Unix Domain Socket 調用 Go 服務的耗時,可能是進程間復制數據耗時或 PHP 拖了后腿,3秒多一點,跟純 PHP 腳本差不多。

雜談

用 PHP 的都知道,PHP 因為解釋型語言的特性和其高度的封裝,導致其雖然在開發上速度很快,可是執行與其他語言相比略差。對此,業界的 FB 有 HHVM,PHP7 有 opcache 新特性,據說還要在 PHP8 添加 JIT,用以彌補其先天硬傷。

不過,對于開發者,特別是跟我一樣對于效率有執著追求的人來說,在了解使用 PHP 的新特性之外,自己再掌握一門較高執行效率、開發效率略低的語言,用來寫一些高計算量,邏輯單一的代碼,與 PHP 互補或許會更好一點。

于是,在考慮良久,也見識了各種 Go 的支持者和反對者之間的撕逼后,我覺得還是要相信一下谷歌爸爸,畢竟也沒什么其他我覺得可選的語言了。

另外C呢,雖然暫時開發中用不到,可是畢竟是當代N多語言的起源,偶爾寫寫數據結構、算法什么的以免生銹。而且學了些C,從 PHP 到 Go,切換起來還略有些得心應手的感覺~

以上就是詳解PHP調用Go服務的正確方式的詳細內容,更多關于PHP調用Go服務的正確方式的資料請關注好吧啦網其它相關文章!

標簽: PHP
相關文章:
主站蜘蛛池模板: 盘装氧量分析仪-防爆壁挂氧化锆分析仪-安徽吉帆仪表有限公司 | 防火阀、排烟防火阀、电动防火阀产品生产销售商-德州凯亿空调设备有限公司 | 压砖机_电动螺旋压力机_粉末成型压力机_郑州华隆机械tel_0371-60121717 | 石英陶瓷,石英坩埚,二氧化硅陶瓷-淄博百特高新材料有限公司 | 重庆磨床过滤机,重庆纸带过滤机,机床伸缩钣金,重庆机床钣金护罩-重庆达鸿兴精密机械制造有限公司 | 武汉不干胶印刷_标签设计印刷_不干胶标签印刷厂 - 武汉不干胶标签印刷厂家 | 天空彩票天下彩,天空彩天空彩票免费资料,天空彩票与你同行开奖,天下彩正版资料大全 | 二手Sciex液质联用仪-岛津气质联用仪-二手安捷伦气质联用仪-上海隐智科学仪器有限公司 | 压缩空气冷冻式干燥机_吸附式干燥机_吸干机_沪盛冷干机 | 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 | 【中联邦】增稠剂_增稠粉_水性增稠剂_涂料增稠剂_工业增稠剂生产厂家 | 两头忙,井下装载机,伸缩臂装载机,30装载机/铲车,50装载机/铲车厂家_价格-莱州巨浪机械有限公司 | 上海单片机培训|重庆曙海培训分支机构—CortexM3+uC/OS培训班,北京linux培训,Windows驱动开发培训|上海IC版图设计,西安linux培训,北京汽车电子EMC培训,ARM培训,MTK培训,Android培训 | 齿辊分级破碎机,高低压压球机,立式双动力磨粉机-郑州长城冶金设备有限公司 | 废水处理-废气处理-工业废水处理-工业废气处理工程-深圳丰绿环保废气处理公司 | 天然鹅卵石滤料厂家-锰砂滤料-石英砂滤料-巩义东枫净水 | 湖州织里童装_女童男童中大童装_款式多尺码全_织里儿童网【官网】-嘉兴嘉乐网络科技有限公司 | 定量包装秤,吨袋包装称,伸缩溜管,全自动包装秤,码垛机器人,无锡市邦尧机械工程有限公司 | 400电话_400电话申请_866元/年_【400电话官方业务办理】-俏号网 3dmax渲染-效果图渲染-影视动画渲染-北京快渲科技有限公司 | 欧洲MV日韩MV国产_人妻无码一区二区三区免费_少妇被 到高潮喷出白浆av_精品少妇自慰到喷水AV网站 | 塑料检查井_双扣聚氯乙烯增强管_双壁波纹管-河南中盈塑料制品有限公司 | 爱佩恒温恒湿测试箱|高低温实验箱|高低温冲击试验箱|冷热冲击试验箱-您身边的模拟环境试验设备技术专家-合作热线:400-6727-800-广东爱佩试验设备有限公司 | 伸缩器_伸缩接头_传力接头-巩义市润达管道设备制造有限公司 | 进口便携式天平,外校_十万分之一分析天平,奥豪斯工业台秤,V2000防水秤-重庆珂偌德科技有限公司(www.crdkj.com) | 天长市晶耀仪表有限公司| 广州中央空调回收,二手中央空调回收,旧空调回收,制冷设备回收,冷气机组回收公司-广州益夫制冷设备回收公司 | 螺纹三通快插接头-弯通快插接头-宁波舜驰气动科技有限公司 | 软瓷_柔性面砖_软瓷砖_柔性石材_MCM软瓷厂家_湖北博悦佳软瓷 | 智慧消防-消防物联网系统云平台| 安徽净化板_合肥岩棉板厂家_玻镁板厂家_安徽科艺美洁净科技有限公司 | 钢格板|热镀锌钢格板|钢格栅板|钢格栅|格栅板-安平县昊泽丝网制品有限公司 | 宁夏活性炭_防护活性炭_催化剂载体炭-宁夏恒辉活性炭有限公司 | 航拍_专业的无人机航拍摄影门户社区网站_航拍网 | 福尔卡(北京)新型材料技术股份有限公司 | 陕西安闸机-伸缩门-车牌识别-广告道闸——捷申达门业科技 | 防堵吹扫装置-防堵风压测量装置-电动操作显示器-兴洲仪器 | 气力输送设备_料封泵_仓泵_散装机_气化板_压力释放阀-河南锐驰机械设备有限公司 | 钢格板|镀锌钢格板|热镀锌钢格板|格栅板|钢格板|钢格栅板|热浸锌钢格板|平台钢格板|镀锌钢格栅板|热镀锌钢格栅板|平台钢格栅板|不锈钢钢格栅板 - 专业钢格板厂家 | 布袋式除尘器|木工除尘器|螺旋输送机|斗式提升机|刮板输送机|除尘器配件-泊头市德佳环保设备 | 整车VOC采样环境舱-甲醛VOC预处理舱-多舱法VOC检测环境仓-上海科绿特科技仪器有限公司 | 机制砂选粉机_砂石选粉机厂家-盐城市助成粉磨科技有限公司 |