2013-08-23 47 views
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); 
+0

我並不熟悉go,但有可能ok:= [] byte(「OK \ n」)不會產生PHP預期的'\ n'的正確字節? – spartacus

+0

它似乎可能是編碼\ n在另一種編碼格式,PHP不期望像unicode。 – spartacus

+0

如果找不到更簡單的答案,您可以使用wireshark查看發送的內容。 – spartacus

回答

0

這不是一個PHP的問題;你沒有關閉服務器連接,所以PHP繼續等待更多的數據。添加defer c.Close()

func echoServer(c net.Conn){ 
    defer c.Close() 

    buf := make([]byte, 512) 
    size, err := c.Read(buf) 
    if err != nil { 

PHP_NORMAL_READ是迫使socket_read閱讀的文本行,而不是二進制流。

從PHP文檔上socket_read(重點煤礦)

socket_read()返回的數據作爲上成功的字符串,或FALSE的錯誤(包括如果遠程主機已經關閉了連接