在go中,我们可以通过 net.Listen 创建一个socket服务,然后其他程序通过socket即可实现快速通信,具体示例如下(此处因golang的err错误处理,所以导致程序有些冗余;实际使用时可以忽略一些错误):
package main
import (
"encoding/json"
"fmt"
"net"
"os"
"syscall"
)
// 程序入口文件
func main() {
socket_file := "/tmp/go_main_self.sock"
// 文件存在的话就删除
if _, err := os.Stat(socket_file); err == nil {
// 文件存在,删除该socket文件
syscall.Unlink(socket_file)
}
// 创建一个socket文件
socket, err := net.Listen("unix", socket_file)
if err != nil {
panic(err.Error())
}
// 关闭时删除socker文件
defer syscall.Unlink(socket_file)
fmt.Println("开始监听服务:", socket_file)
// 无限循环受理请求
for {
// 连接socker文件
client, err := socket.Accept()
if err != nil {
panic("socker连接错误")
}
// 读取内容
buf := make([]byte, 2048)
data_len, err := client.Read(buf)
if err != nil {
fmt.Println("读取失败:", err)
continue
}
data := buf[0:data_len]
fmt.Println("请求内容:", string(data))
if len(data) > 0 {
json_str, _ := json.Marshal(map[string]string{
"content": string(data),
})
response := []byte(string(json_str))
_, err = client.Write(response)
if err != nil {
fmt.Println("写入失败:", err)
}
}
}
}
在PHP中,我们可以使用以下方法进行封装、调用
<?php
function sendSocket($msg = ""){
// 创建 连接 发送消息 接收响应 关闭连接
$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);
socket_connect($socket, '/tmp/go_main_self.sock');
socket_send($socket, $msg, strlen($msg), 0);
$response = socket_read($socket, 1024);
socket_close($socket);
return $response;
}
echo sendSocket("123123");
echo "\n";
运行示例:GO监听
$ go run main.go
开始监听服务: /tmp/go_main_self.sock
# 运行后结果:
$ go run main.go
开始监听服务: /tmp/go_main_self.sock
请求内容: 123123
运行示例:PHP脚本
$ php main.php
{"content":"123123"}
接下来,我们就可以根据请求、接受的方法进入不同的单元,进行不同的操作啦,比如将请求的数据整合成统一的json形式,如下:
{
"func":"add",
"data":{
"param1":1,
"param2":2
}
}
在go中,我们也就可以直接根据func对象,去调用程序中的对应方法执行操作