PHP IPC 与 geth 以太坊

PHP IPC with geth Ethereum

我已经设置了 geth Ether 测试网。我想通过 IPC PHP 与客户端通信。我在 Ubuntu。 这是我当前的代码:

$myValType = NULL;
$msg = "";
($key = ftok("/home/john/.ethereum/testnet/geth.ipc","="));
$queue = msg_get_queue($key);
msg_send($queue, 1, '{"jsonrpc":"2.0","method":"miner_start","params":[],"id":1}');
msg_receive($queue,0,$myValType,2048,$msg);
dd($msg); # (Die and Dump, Laravel)

这是IPC文件(FIFO?):

srwxrwxrwx 1 john john    0 Jun 17 01:30 geth.ipc=

这工作正常

echo '{"jsonrpc":"2.0","method":"rpc_modules","params":[],"id":1}' | nc -U geth.ipc

我不确定如何与客户实际沟通。发送时没有响应。在 msg_receive 上,它只是 returns 初始发送的消息。

谁有经验,好心人,给我一个合适的解决方案?

更新: 我发现了它是如何工作的。我用了 PHP Sockets

$sock = socket_create(AF_UNIX, SOCK_STREAM, 0);
socket_connect($sock, "/home/john/.ethereum/testnet/geth.ipc",1);
$myBuf = null;
$msg = "{\"jsonrpc\":\"2.0\",\"method\":\"rpc_modules\",\"params\":[],\"id\":1}";
socket_send($sock, $msg, strlen($msg), MSG_EOF);
socket_recv ( $sock , $myBuf ,  100 ,MSG_WAITALL     );

我可以使用 IPC 文件的简单 PHP 套接字而不是使用 MSG 队列!

如果 ipc 的结果具有动态大小,最好使用 socket_read 直到最后一个字符为“\n”。然后像这样处理结果

public function ipcCall($data){
   $sock = socket_create(AF_UNIX, SOCK_STREAM, 0);
  socket_connect($sock, "/home/someuser/.ethereum/testnet/geth.ipc", 1);
  $msg = json_encode($data);
  socket_send($sock, $msg, strlen($msg), MSG_EOF);
  $result = '';
  while (($currentByte = socket_read($sock, 1)) != "\n") {
     $result .= $currentByte;
  }
 var_dump($result);
}