婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 詳解PHP調用Go服務的正確方式

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

熱門標簽:百度商鋪地圖標注 福州人工外呼系統哪家強 安裝電銷外呼系統 衡水外呼系統平臺 地圖標注平臺怎么給錢注冊 注冊400電話申請 常州地圖標注服務商 釘釘打卡地圖標注 新河科技智能外呼系統怎么樣

問題

服務耦合

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

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

文本匹配服務,它是消息處理流程中的一環,被多個消息處理進程依賴,每次初始化進程要 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服務的正確方式的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • goto語法在PHP中的使用教程
  • 基于Go和PHP語言實現爬樓梯算法的思路詳解
  • ThinkPHP5 框架引入 Go AOP,PHP AOP編程項目詳解
  • golang、python、php、c++、c、java、Nodejs性能對比
  • Linux安裝PHP MongoDB驅動
  • PHP中安裝使用mongodb數據庫
  • 詳解Go語言微服務開發框架之Go chassis
  • 詳解Go與PHP的語法對比

標簽:鶴崗 白城 遼陽 柳州 唐山 克拉瑪依 六安 鷹潭

巨人網絡通訊聲明:本文標題《詳解PHP調用Go服務的正確方式》,本文關鍵詞  詳解,PHP,調用,服務,的,正確,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳解PHP調用Go服務的正確方式》相關的同類信息!
  • 本頁收集關于詳解PHP調用Go服務的正確方式的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美激情一区二区三区蜜桃视频| 成人app在线| 久久99精品久久只有精品| 99精品热视频| 国产日韩精品一区二区浪潮av | 欧美中文字幕一区| 国产精品美女久久久久久久网站| 天天影视色香欲综合网老头| 色婷婷综合五月| 亚洲色图在线看| 91福利区一区二区三区| 日韩码欧中文字| 日本丰满少妇一区二区三区| 亚洲视频中文字幕| 91在线丨porny丨国产| 亚洲综合小说图片| 欧美日韩精品一区二区天天拍小说| 国产精品每日更新在线播放网址| 懂色av一区二区在线播放| 久久久久99精品国产片| 99国产精品久| 精品一二线国产| 亚洲你懂的在线视频| 最好看的中文字幕久久| 欧美艳星brazzers| 亚洲高清免费一级二级三级| 91精品国产综合久久精品app| 日本伊人色综合网| 国产精品入口麻豆原神| 欧美一区二区三区在线看| 国产成人精品影视| 琪琪久久久久日韩精品| 亚洲精品午夜久久久| 国产午夜亚洲精品午夜鲁丝片| 色八戒一区二区三区| 国产精品亚洲午夜一区二区三区| 一区二区三区蜜桃网| 国产精品久久久久aaaa| 欧美一区二区三区在线观看视频| 99久久夜色精品国产网站| 韩国av一区二区三区四区| 日本欧美在线观看| 婷婷综合久久一区二区三区| 日韩美女啊v在线免费观看| 日本一区二区三级电影在线观看| 日韩免费一区二区三区在线播放| 欧美三级电影在线观看| 在线视频欧美区| 欧美精品高清视频| 日韩欧美电影一二三| 欧美一二三区在线| 日韩免费观看2025年上映的电影| 欧美午夜精品久久久| 日韩精品在线一区二区| 久久精品网站免费观看| 国产精品亲子伦对白| 亚洲精品视频在线观看免费| 亚洲成人动漫av| 韩国av一区二区| 91精彩视频在线| 2017欧美狠狠色| 亚洲女同ⅹxx女同tv| 韩国欧美国产一区| 91国偷自产一区二区三区观看 | 91精品欧美综合在线观看最新| 日韩午夜精品视频| 久久久精品日韩欧美| 亚洲综合在线视频| 国产成人无遮挡在线视频| 欧洲一区二区三区免费视频| 欧美tk—视频vk| 亚洲图片另类小说| 国产高清不卡一区二区| 欧美日韩1234| 一区二区三区国产| 97精品超碰一区二区三区| 欧美电影免费提供在线观看| 亚洲综合视频在线观看| 国模无码大尺度一区二区三区| 色婷婷综合视频在线观看| 国产精品日日摸夜夜摸av| 东方欧美亚洲色图在线| 国产免费观看久久| 成人av免费在线| 免费人成网站在线观看欧美高清| 亚洲二区在线观看| 蜜臀久久99精品久久久画质超高清| 国产乱码一区二区三区| 在线综合视频播放| 卡一卡二国产精品| 日韩精品一区二区三区三区免费 | 91成人看片片| 日本欧美在线看| 久久精品视频网| 成人精品国产福利| 亚洲大片精品永久免费| 精品国产乱码久久久久久久| 国产mv日韩mv欧美| 午夜影视日本亚洲欧洲精品| 日韩欧美的一区| 色久优优欧美色久优优| 久久国产精品一区二区| 日韩理论片在线| 日韩视频免费直播| 在线免费观看日韩欧美| 久久国产剧场电影| 五月天精品一区二区三区| 国产精品素人一区二区| 欧美成人乱码一区二区三区| 99久久精品国产导航| 国产在线精品视频| 久久99久久精品| 麻豆精品在线看| 日本视频一区二区三区| 亚洲国产中文字幕在线视频综合| 中文字幕不卡三区| 中国av一区二区三区| 国产午夜亚洲精品理论片色戒 | 久久综合九色综合97婷婷| 欧美精品在线观看播放| 欧美色综合久久| 欧美日韩高清不卡| 日韩一区二区三区在线| 精品国产乱码久久久久久蜜臀| 欧美日韩视频不卡| 欧美mv日韩mv| 国产亚洲制服色| 久久久久亚洲综合| 国产精品电影院| 三级欧美在线一区| 日本vs亚洲vs韩国一区三区| 琪琪久久久久日韩精品| 精品一区二区免费看| 成人av综合在线| 欧美一区二区性放荡片| 国产精品无码永久免费888| 亚洲另类色综合网站| 美日韩一区二区三区| 91免费看`日韩一区二区| 欧美日韩免费一区二区三区视频| 日韩欧美中文字幕精品| 亚洲男人的天堂网| 国产一区二区三区最好精华液| 99精品视频一区| 欧美激情在线免费观看| 日韩影院在线观看| 8v天堂国产在线一区二区| 亚洲男人的天堂av| av男人天堂一区| 国产欧美日韩麻豆91| 秋霞影院一区二区| 91精品婷婷国产综合久久| 99精品欧美一区二区三区小说 | 91丨九色丨蝌蚪富婆spa| 日韩亚洲国产中文字幕欧美| 夜色激情一区二区| 在线一区二区三区| 亚洲黄色免费电影| 日本乱人伦一区| 亚洲在线视频免费观看| 日本高清不卡一区| 亚洲精品国产品国语在线app| www.成人网.com| 亚洲日本va在线观看| 欧美日韩中文另类| 五月天中文字幕一区二区| 欧美一区二区三区在线观看视频| 天堂蜜桃91精品| 国产精品免费aⅴ片在线观看| 成人国产精品免费观看动漫| 亚洲最新视频在线播放| 精品国产在天天线2019| 成人国产电影网| 午夜视黄欧洲亚洲| 国产日产欧产精品推荐色| 91伊人久久大香线蕉| 亚洲一区国产视频| 欧美激情自拍偷拍| 欧美一区二区不卡视频| 成人动漫一区二区三区| 亚洲成在线观看| 日韩理论片一区二区| 精品国产一区久久| 欧美挠脚心视频网站| 懂色av一区二区三区免费看| 日韩不卡一区二区| 亚洲国产精品一区二区久久| 欧美激情在线一区二区| 精品国产一二三| 91精品国产乱| 欧美精品三级日韩久久| 99re视频这里只有精品| 国产精品一区2区| 国产成人aaaa| 国产成人免费视频网站 | 精品国产青草久久久久福利| 欧美乱妇一区二区三区不卡视频| 波多野结衣中文字幕一区二区三区| 精品在线免费视频| 国产一区二区三区精品视频|