최근에 접한 장면: php타사 기능(더듬거리는 단어 분할)을 사용해야 함 프로젝트에 git허브에 Golang으로 작성된 클래스 라이브러리 가 있습니다. 그런 다음 질문이 생깁니다. 서로 다른 언어 간의 통신을 구현하는 방법입니다. .
기존 솔루션:
Golang에서 http/TCP 서비스를 작성하고, php는 http/TCP를 통해 Golang과 통신합니다
-
Golang은 PHP 확장으로 캡슐화됩니다.
PHP는 시스템 명령을 통해 Golang 실행 파일을 호출합니다.
기존 문제:
http 요청, 네트워크 I/O는 많은 시간을 소모합니다
많은 코드를 캡슐화해야 합니다
PHP가 Golang 프로그램을 호출할 때마다 초기화해야 하며 시간이 많이 걸립니다
최적화 목표:
-
Golang 프로그램은 한 번만 초기화됩니다(초기화에 시간이 많이 걸리기 때문입니다)
모든 요청이 네트워크를 거치지 않아도 됩니다
-
코드를 많이 수정하지 마세요
해결책:
간단한 Golang 패키지, 타사 클래스 라이브러리를 실행 파일로 컴파일 file
-
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: 조정된 코드는
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 # //等待用户输入,输入”这是一个测试“ # 这是 一个 测试 //程序
-
3: 고양이를 사용하여 통신 간단한 테스트를 위한 Golang 사용
//准备一个title.txt,每行是一句文本 # cat title.txt | ./test
고양이가 Golang과 정상적으로 상호 작용할 수 있음을 나타내는 정상적인 출력
-
4: PHP는 Golang과 통신합니다
고양이 위에 표시된 것은 파이프라인에 대한 단일을 사용하여 Golang과 통신합니다. 즉, 데이터는 cat에서 Golang으로만 전달될 수 있습니다. Golang에서 출력된 데이터는 cat으로 다시 전달되지 않고 화면에 직접 출력됩니다. 그러나 기사의 요구 사항은 다음과 같습니다. PHP는 Golang과 통신합니다. 즉, php는 Golang에 데이터를 전달해야 하고, Golang도 실행 결과를 php에 반환해야 합니다. 따라서 양방향 파이프라인을 도입해야 합니다.
PHP에서 파이프 사용:popen("/path/test")
, 이 방법은 기사의 문제를 해결할 수 없기 때문에 자세히 설명하지 않겠습니다.
양방향 파이프:$descriptorspec = array( 0 => array("pipe", "r"), 1 => array("pipe", "w") ); $handle = proc_open( '/webroot/go/src/test/test', $descriptorspec, $pipes ); fwrite($pipes['0'], "这是一个测试文本\n"); echo fgets($pipes[1]);
설명: proc_open을 사용하여 프로세스를 열고 Golang 프로그램을 호출합니다. 동시에 양방향 파이프라인배열이 반환됩니다. PHP는 $pipe['0']에 데이터를 쓰고 $pipe['1']에서 데이터를 읽습니다. 양방향 파이프를 통해 모든 언어가 통신할 수 있는 방법을 소개합니다.
(모든 언어는 파이프라인 관련 내용을 구현합니다)
비교 테스트
를 통해 각 프로세스에 소요되는 시간을 계산합니다. 아래에 언급된 title.txt 파일에는 1백만 줄의 텍스트가 포함되어 있으며, 각 텍스트 줄은 b2b 플랫폼에서 가져온 제품 제목입니다 1: 전체 프로세스에 시간이 많이 걸립니다<a href="http%20://www.php.cn/wiki/1268.html" target="_blank">시간<strong> 고양이 제목.txt | ./test > /dev/<a href="http:/%20/www.php%20.cn/wiki/62.html" target="_blank">null</a></strong></a>
소모 시간: 14.819초, 포함: <a href="http://www.php.cn/wiki/1268.html" target="_blank">time</a> cat title.txt | ./test > /dev/<a href="http://www.php.cn/wiki/62.html" target="_blank">null</a>
Comment고양이가 텍스트를 읽는 프로세스
를 계산하는 데 시간이 걸립니다. 해결책: 단어 분할 기능 호출, 즉
파이프를 통해 Golang에 데이터를 전달
Golang이 데이터를 처리하고 결과를 화면에 반환
- 2: 단어 분할
함수
를 제거하고 Golang 소스 코드 소요 시간: 1.817초, 소요 시간은 다음을 포함합니다: time cat title.txt | ./test > /dev/null
고양이가 텍스트를 읽는 프로세스
- 파이프라인을 통해 Golang으로 데이터 전송
Golang이 데이터를 처리
하고 그 결과를 화면에 반환합니다
分词耗时 = (第一步耗时) - (以上命令所耗时)
分词耗时 : 14.819 - 1.817 = 13.002秒
3:测试cat进程与Golang进程之间通信所占时间time cat title.txt > /dev/null
耗时:0.015秒,消耗时间包含:
进程cat读出文本
通过管道将数据传入Golang
go处理数据,将结果返回到屏幕
管道通信耗时:(第二步耗时) - (第三步耗时)
管道通信耗时: 1.817 - 0.015 = 1.802秒
4:PHP与Golang通信的时间消耗
编写简单的php文件:
<?php $descriptorspec = array( 0 => array("pipe", "r"), 1 => array("pipe", "w") ); $handle = proc_open( '/webroot/go/src/test/test', $descriptorspec, $pipes ); $fp = fopen("title.txt", "rb"); while (!feof($fp)) { fwrite($pipes['0'], trim(fgets($fp))."\n"); echo fgets($pipes[1]); } fclose($pipes['0']); fclose($pipes['1']); proc_close($handle);
流程与上面基本一致,读出title.txt内容,通过双向管道传入Golang进程分词后,再返回给php (比上面的测试多一步:数据再通过管道返回)time php popen.php > /dev/null
耗时:24.037秒,消耗时间包含:
进程PHP读出文本
通过管道将数据传入Golang
Golang处理数据
Golang将返回结果再写入管道,PHP通过管道接收数据
将结果返回到屏幕
结论:
1 :整个分词过程中的耗时分布
使用cat控制逻辑耗时: 14.819 秒 使用PHP控制逻辑耗时: 24.037 秒(比cat多一次管道通信) 单向管道通信耗时: 1.8 秒 Golang中的分词函数耗时: 13.002 秒
2:分词函数的性能: 单进程,100万商品标题分词,耗时13秒
以上时间只包括分词时间,不包括词典载入时间。但在本方案中,词典只载入一次,所以载入词典时间可以忽略(1秒左右)
3:PHP比cat慢 (这结论有点多余了,呵呵)
语言层面慢: (24.037 - 1.8 - 14.819) / 14.819 = 50%
单进程对比测试的话,应该不会有哪个语言比cat更快。
相关问题:
-
1:以上Golang源码中写的是一个循环,也就是会一直从管道中读数据。那么存在一个问题:是不是php进程结束后,Golang的进程还会一直存在?
管道机制自身可解决此问题。管道提供两个接口:读、写。当写进程结束或者意外挂掉时,读进程也会报错,以上Golang源代码中的err逻辑就会执行,Golang进程结束。
但如果PHP进程没有结束,只是暂时没有数据传入,此时Golang进程会一直等待。直到php结束后,Golang进程才会自动结束。 -
2:能否多个php进程并行读写同一个管道,Golang进程同时为其服务?
不可以。管道是单向的,如果多个进程同时向管道中写,那Golang的返回值就会错乱。
可以多开几个Golang进程实现,每个php进程对应一个Golang进程。
위 내용은 PHP는 Golang과 통신합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

phpsession 실패 이유에는 구성 오류, 쿠키 문제 및 세션 만료가 포함됩니다. 1. 구성 오류 : 올바른 세션을 확인하고 설정합니다. 2. 쿠키 문제 : 쿠키가 올바르게 설정되어 있는지 확인하십시오. 3. 세션 만료 : 세션 시간을 연장하기 위해 세션을 조정합니다 .GC_MAXLIFETIME 값을 조정하십시오.

PHP에서 세션 문제를 디버그하는 방법 : 1. 세션이 올바르게 시작되었는지 확인하십시오. 2. 세션 ID의 전달을 확인하십시오. 3. 세션 데이터의 저장 및 읽기를 확인하십시오. 4. 서버 구성을 확인하십시오. 세션 ID 및 데이터를 출력, 세션 파일 컨텐츠보기 등을 통해 세션 관련 문제를 효과적으로 진단하고 해결할 수 있습니다.

Session_Start ()로 여러 통화를하면 경고 메시지와 가능한 데이터 덮어 쓰기가 발생합니다. 1) PHP는 세션이 시작되었다는 경고를 발행합니다. 2) 세션 데이터의 예상치 못한 덮어 쓰기를 유발할 수 있습니다. 3) Session_status ()를 사용하여 반복 통화를 피하기 위해 세션 상태를 확인하십시오.

SESSION.GC_MAXLIFETIME 및 SESSION.COOKIE_LIFETIME을 설정하여 PHP에서 세션 수명을 구성 할 수 있습니다. 1) SESSION.GC_MAXLIFETIME 서버 측 세션 데이터의 생존 시간을 제어합니다. 2) 세션 .Cookie_Lifetime 클라이언트 쿠키의 수명주기를 제어합니다. 0으로 설정하면 브라우저가 닫히면 쿠키가 만료됩니다.

데이터베이스 스토리지 세션 사용의 주요 장점에는 지속성, 확장 성 및 보안이 포함됩니다. 1. 지속성 : 서버가 다시 시작 되더라도 세션 데이터는 변경되지 않아도됩니다. 2. 확장 성 : 분산 시스템에 적용하여 세션 데이터가 여러 서버간에 동기화되도록합니다. 3. 보안 : 데이터베이스는 민감한 정보를 보호하기 위해 암호화 된 스토리지를 제공합니다.

SessionHandlerInterface 인터페이스를 구현하여 PHP에서 사용자 정의 세션 처리 구현을 수행 할 수 있습니다. 특정 단계에는 다음이 포함됩니다. 1) CustomsessionHandler와 같은 SessionHandlerInterface를 구현하는 클래스 만들기; 2) 인터페이스의 방법 (예 : Open, Close, Read, Write, Despare, GC)의 수명주기 및 세션 데이터의 저장 방법을 정의하기 위해 방법을 다시 작성합니다. 3) PHP 스크립트에 사용자 정의 세션 프로세서를 등록하고 세션을 시작하십시오. 이를 통해 MySQL 및 Redis와 같은 미디어에 데이터를 저장하여 성능, 보안 및 확장 성을 향상시킬 수 있습니다.

SessionId는 웹 애플리케이션에 사용되는 메커니즘으로 사용자 세션 상태를 추적합니다. 1. 사용자와 서버 간의 여러 상호 작용 중에 사용자의 신원 정보를 유지하는 데 사용되는 무작위로 생성 된 문자열입니다. 2. 서버는 쿠키 또는 URL 매개 변수를 통해 클라이언트로 생성하여 보낸다. 3. 생성은 일반적으로 임의의 알고리즘을 사용하여 독창성과 예측 불가능 성을 보장합니다. 4. 실제 개발에서 Redis와 같은 메모리 내 데이터베이스를 사용하여 세션 데이터를 저장하여 성능 및 보안을 향상시킬 수 있습니다.

JWT 또는 쿠키를 사용하여 API와 같은 무국적 환경에서 세션을 관리 할 수 있습니다. 1. JWT는 무국적자 및 확장 성에 적합하지만 빅 데이터와 관련하여 크기가 크다. 2. 쿠키는보다 전통적이고 구현하기 쉽지만 보안을 보장하기 위해주의해서 구성해야합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

SecList
SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.
