最近工作中遇到的一個(gè)場(chǎng)景,php項(xiàng)目中需要使用一個(gè)第三方的功能,而恰好有一個(gè)用寫(xiě)好的類(lèi)庫(kù)。那么問(wèn)題就來(lái)了,要如何實(shí)現(xiàn)不同語(yǔ)言之間的通信呢?下面就來(lái)一起看看吧?! ?、將經(jīng)過(guò)較多封裝,做為php擴(kuò)展。即php要傳數(shù)據(jù)給,同時(shí)也必須把執(zhí)行結(jié)果返回給php?! ≡赑HP中管道的使用popen,具體就不展開(kāi)說(shuō)了,因?yàn)榇朔椒ń鉀Q不了文中的問(wèn)題?! ⊥ㄟ^(guò)對(duì)比測(cè)試,計(jì)算出各個(gè)流程占用的時(shí)間。
php和go語(yǔ)言哪個(gè)好
前言我在最近的工作中遇到一個(gè)場(chǎng)景,一個(gè)php項(xiàng)目中需要一個(gè)第三方函數(shù),恰好有一個(gè)類(lèi)庫(kù)是用。那么問(wèn)題來(lái)了,如何實(shí)現(xiàn)不同語(yǔ)言之間的交流?讓我們一起來(lái)看看吧。常規(guī)方案1。寫(xiě)一個(gè)http/TCP服務(wù),php通過(guò)http/TCP互相通信。2.它將被封裝成php的擴(kuò)展。3.PHP通過(guò)系統(tǒng)命令檢索可執(zhí)行文件的問(wèn)題。1.http請(qǐng)求,網(wǎng)絡(luò)I/O會(huì)消耗很多時(shí)間。2.大量的代碼需要打包。3.PHP每次檢索一個(gè)程序,都需要一次初始化,耗費(fèi)大量時(shí)間。1.程序只初始化一次(因?yàn)槌跏蓟芎臅r(shí))。2.所有請(qǐng)求都不需要通過(guò)網(wǎng)絡(luò)。3.盡量不要修改代碼方案。1.簡(jiǎn)單封裝。將第三方類(lèi)庫(kù)編譯成可執(zhí)行文件。2.PHP以及通過(guò)雙向管道通信使用雙向管道通信的優(yōu)勢(shì)。1.原始類(lèi)庫(kù)只需要一點(diǎn)封裝。2.性能最好(IPC通信是進(jìn)程間通信的最佳方式)。3.不需要網(wǎng)絡(luò)請(qǐng)求,節(jié)省了大量時(shí)間。4.程序只需要初始化一次。并將其保存在內(nèi)存中,以實(shí)現(xiàn)最初的調(diào)用demo main(“fmt”)。com//")func main(){ x =。()x.free () s = "小明畢業(yè)于中科院計(jì)算所,后留學(xué)日本京都大學(xué)" words=x.(s,true) fmt。("/")}將文件另存為main.go,就可以運(yùn)行2 funcmain () {x =。("/data/tmp//jieba.dict.utf8帶調(diào)整后的代碼main ("bufio ""fmt " ")。com//"io" "OS " ")。"/data/tmp//user . dict . utf8 ")deferx。Free()=bufio。(os。Stdin ),錯(cuò)誤=。(' n ')ifer!=nil&&err==io。EOF{break}s=。(s)如果!=""{words=x.(s,true)fmt。(.Join(words," ")} else {fmt。(" getempty n")}}只需要幾行簡(jiǎn)單的調(diào)整就可以從標(biāo)準(zhǔn)輸入中接收一個(gè)字符串,然后輸出test # gobuildtest #..輸入“這是一個(gè)測(cè)試”#這是一個(gè)測(cè)試//程序3用cat和communication做一個(gè)簡(jiǎn)單的測(cè)試//準(zhǔn)備一個(gè)title.txt,帶一行文字#cattitle.txt|。/test正常輸出表明cat已經(jīng)能夠與正常的4PHP進(jìn)行交互,并使用單向管道與cat進(jìn)行通信,如上所示。也就是數(shù)據(jù)只能從cat傳入,輸出的數(shù)據(jù)不傳回cat,而是直接輸出到屏幕上。但是本文的要求是php和通信。也就是php必須將數(shù)據(jù)發(fā)送給,同時(shí)必須將執(zhí)行結(jié)果返回給php。因此,有必要引入雙向管道。PHP中popen("/path/test ")的使用就不詳細(xì)討論了,因?yàn)檫@種方法解決不了文中的問(wèn)題。雙向管道$=array(0=>array("pipe "," r "),1=>array("pipe "," w")) $ = ('/go/src/test/test ',$,$pipes)($pipes['0'])同時(shí)返回一個(gè)雙向管道的數(shù)組。php將數(shù)據(jù)寫(xiě)入$pipe['0'],并從$pipe['1']讀取數(shù)據(jù)。你可能已經(jīng)發(fā)現(xiàn)了,我是標(biāo)題文件,這里的重點(diǎn)不僅僅是PHP和如何通信。相反,它引入了一種讓任何語(yǔ)言通過(guò)雙向管道進(jìn)行交流的方法。(所有語(yǔ)言都將實(shí)現(xiàn)管道相關(guān)的內(nèi)容。)測(cè)試通過(guò)對(duì)比測(cè)試,計(jì)算每個(gè)流程所用的時(shí)間。下面提到的title.txt文件包含100萬(wàn)行文本。每行文字取自b2b平臺(tái)。產(chǎn)品標(biāo)題1全程耗時(shí)14.819秒。耗時(shí)包括process cat讀取文本,通過(guò)管道將數(shù)據(jù)傳輸?shù)教幚頂?shù)據(jù),并將結(jié)果返回到屏幕2。計(jì)算分詞函數(shù)需要時(shí)間。去掉方案的分詞函數(shù)調(diào)用,也就是注釋掉代碼timecattitle.txt |,需要1.817秒。源代碼中的/test >/dev/null。消耗的時(shí)間包括process cat讀出文本和通過(guò)管道將數(shù)據(jù)傳入處理數(shù)據(jù)。將結(jié)果返回到屏幕上。分段時(shí)間=(第一步需要時(shí)間)-(上面的命令需要時(shí)間)。分段時(shí)間為14,81,-1,81,=13.002秒。3測(cè)試cat進(jìn)程之間的通信時(shí)間。timecattitle.txt>/dev/null耗時(shí)0.015秒。經(jīng)過(guò)的時(shí)間包括process cat讀取文本和發(fā)送數(shù)據(jù)以通過(guò)管道處理數(shù)據(jù)。將結(jié)果返回到屏幕上。管道溝通需要時(shí)間(第二步需要時(shí)間)-(第三步需要時(shí)間)。管道通信需要1,81,-0,01,=1.802秒。4 PHP和通信的時(shí)間消耗。寫(xiě)一個(gè)簡(jiǎn)單的PHP文件數(shù)組(" pipe "," r "),1=>array("pipe "," w")) $ Feof($fp)){($pipes['0'],trim (fgets ($ FP))。" n") echo fgets ($ pipes [1])