최근 직장에서 접한 시나리오는 PHP 프로젝트에서 타사 함수를 사용해야 하는데 우연히 Golang으로 작성된 클래스 라이브러리가 있다는 것이었습니다. 그렇다면 문제는 서로 다른 언어 간의 의사소통을 어떻게 달성할 수 있는가 하는 것입니다. 아래를 살펴보겠습니다.
기존 솔루션(권장 학습: PHP 비디오 튜토리얼)
1. Golang을 사용하여 http/TCP 서비스를 작성하고, php는 http/TCP
2를 통해 Golang과 통신합니다. PHP 확장으로 더 많은 패키징을 통해.
3. PHP는 시스템 명령을 통해 Golang 실행 파일을 호출합니다
기존 문제
1. HTTP 요청 및 네트워크 I/O에 많은 시간이 소요됩니다
2. 패키지화 코드
3 PHP가 Golang 프로그램을 호출할 때마다 한 번 초기화해야 하므로 많은 시간이 소요됩니다.
최적화 목표
1. 초기화에 시간이 많이 걸립니다)
2, 모든 요청이 네트워크를 통과할 필요가 없습니다
3. 코드를 많이 수정하지 마세요
해결책
1. 타사 클래스 라이브러리를 실행 파일로 변환
2, PHP와 Golang은 양방향 파이프를 통해 통신합니다
양방향 파이프 통신 사용의 장점
1: 원본 Golang 클래스를 최소한으로 캡슐화합니다. 라이브러리가 필요합니다
2: 최고의 성능(IPC 통신은 프로세스 간 통신하는 가장 좋은 방법)
3: 네트워크 요청을 거치지 않아도 되므로 시간이 많이 절약됩니다
4: 프로그램은 라이브러리만 필요합니다. 한 번 초기화되고 메모리에 남아 있습니다
특정 구현 단계
1: 클래스 라이브러리에 있는 원래 호출 데모
package main import ( "fmt" "github.com/yanyiwu/gojieba" "strings" ) func main() { x := gojieba.NewJieba() defer x.Free() s := "小明硕士毕业于中国科学院计算所,后在日本京都大学深造" words := x.CutForSearch(s, true) fmt.Println(strings.Join(words, "/")) }
파일을 main.go로 저장하면 실행할 수 있습니다
2: 조정된 코드 is:
package main import ( "bufio" "fmt" "github.com/yanyiwu/gojieba" "io" "os" "strings" ) func main() { x := gojieba.NewJieba( "/data/tmp/jiebaDict/jieba.dict.utf8", "/data/tmp/jiebaDict/hmm_model.utf8", "/data/tmp/jiebaDict/user.dict.utf8" ) defer x.Free() inputReader := bufio.NewReader(os.Stdin) for { s, err := inputReader.ReadString('\n') if err != nil && err == io.EOF { break } s = strings.TrimSpace(s) if s != "" { words := x.CutForSearch(s, true) fmt.Println(strings.Join(words, " ")) } else { fmt.Println("get empty \n") } } }
몇 가지 간단한 조정만으로 다음을 달성할 수 있습니다. 표준 입력 문자열에서 수신하고 단어 분할 후 출력
테스트:
# go build test # ./test # //等待用户输入,输入”这是一个测试“ # 这是 一个 测试 //程序
위 내용은 PHP와 Golang을 협력하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!