3
我試圖使用Unix套接字讓PHP向IPC發送IPC消息。一切似乎工作,除了PHP似乎一直在閱讀來自套接字的響應,並且不會放過。 (瀏覽器load-spinner繼續前進,並且沒有頁面呈現。)我在PHP:socket_read()函數中使用標誌PHP_NORMAL_READ,並明確從Go發送「\ n」。使用Unix域套接字進行PHP轉換
看着終端中的Go進程,一切似乎在這一端正常工作。
編輯:我認爲這是一個瀏覽器緩存問題。如果我發回不同的數據以迴應PHP,一切都按預期工作。我也切換到fmt.Fprintln()以確保我沒有弄錯換行符。
轉到:
package main
import (
"net"
"fmt"
"log"
"os"
)
const socket_addr = "/tmp/odc_ws.sock"
func echoServer(c net.Conn){
buf := make([]byte, 512)
size, err := c.Read(buf)
if err != nil {
log.Fatal("Read error: ", err)
}
data := buf[0:size]
fmt.Println("Server received: ", string(data))
// NEW CODE
t := time.Now()
retMsg := fmt.Sprintf("OK+ at %s", t)
size, err = fmt.Fprintln(c, retMsg)
//size, err = c.Write(ok)
if err == nil{
fmt.Println("Wrote this many bytes: ", size)
} else {
log.Fatal("Write error: ", err)
}
}
func main(){
l, err := net.Listen("unix", socket_addr)
if err != nil{
fmt.Println("On noes: %s", err)
return
}
defer l.Close()
for{
fd, err := l.Accept()
if err != nil{
log.Fatal("Accept error", err)
}
go echoServer(fd)
}
}
PHP:
ob_implicit_flush();
$socket_file = "/tmp/odc_ws.sock";
if (($socket = socket_create(AF_UNIX, SOCK_STREAM, 0)) === false) {
echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "<br>";
}
if (socket_connect($socket, $socket_file) === false) {
echo "socket_connect() failed: reason: " . socket_strerror(socket_last_error($sock)) . "<br>";
}
$msg = 'PHP sent Go a message at ' . date('H:i:s');
$write_res = socket_write($socket, $msg, $msg_len = strlen($msg));
if($write_res != $msg_len){
echo '<div>Socket write error: ' . socket_strerror(socket_last_error($socket)) . '</div>';
}
while($read = socket_read($socket, 512, PHP_NORMAL_READ)){
echo "<div>Server says: $read</div>";
}
socket_close($socket);
我並不熟悉go,但有可能ok:= [] byte(「OK \ n」)不會產生PHP預期的'\ n'的正確字節? – spartacus
它似乎可能是編碼\ n在另一種編碼格式,PHP不期望像unicode。 – spartacus
如果找不到更簡單的答案,您可以使用wireshark查看發送的內容。 – spartacus