Note that there are some explanatory texts on larger screens.

plurals
  1. POPHP to Go using Unix domain sockets
    text
    copied!<p>I'm trying to use a Unix socket to have PHP send IPC messages to Go. Everything seems to work, except that PHP seems to keep reading the response from the socket, and won't let go. (The browser load-spinner keeps going, and there's no page render.) I'm using flag PHP_NORMAL_READ in the PHP:socket_read() function, and explicitly sending "\n" from Go.</p> <p>Watching the Go process in the terminal, everything appears to work correctly on that end.</p> <p><strong>Edit:</strong> I think it was a browser caching issue. If I send different data back for PHP to echo, everything works as expected. I also switched to fmt.Fprintln() to make sure I wasn't getting the newline wrong.</p> <p>Go:</p> <pre><code>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) } } </code></pre> <p>PHP:</p> <pre><code>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()) . "&lt;br&gt;"; } if (socket_connect($socket, $socket_file) === false) { echo "socket_connect() failed: reason: " . socket_strerror(socket_last_error($sock)) . "&lt;br&gt;"; } $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 '&lt;div&gt;Socket write error: ' . socket_strerror( socket_last_error($socket) ) . '&lt;/div&gt;'; } while($read = socket_read($socket, 512, PHP_NORMAL_READ)){ echo "&lt;div&gt;Server says: $read&lt;/div&gt;"; } socket_close($socket); </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload