重用PHP Unix套接字文件

Joh*_*uay 1 php unix sockets

我正在为一个用PHP编码的Web IM客户端后端的IPC系统工作.我正在尝试实现Unix套接字,但是在重用创建的套接字文件时遇到了麻烦.这是在套接字上侦听事件的代码.

<?php

$socket_file = "../tmp/sockets/test.sock";

$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);

socket_bind($socket, $socket_file);
socket_listen($socket);

socket_select($temp = array($socket), $temp = null, $temp = null, 20);

$client = socket_accept($socket);
socket_set_nonblock($client);
$buffer = socket_read($client, 2048);

echo $buffer;

socket_close($client);
socket_close($socket);
Run Code Online (Sandbox Code Playgroud)

当第一次运行此脚本时,它会创建套接字文件test.sock并等待连接.然后当我运行发送脚本时:

<?php

$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);

socket_connect($socket, "../tmp/sockets/test.sock");

$msg = "\nThis is a test\r\n";

socket_write($socket, $msg, strlen($msg));

socket_close($socket);
Run Code Online (Sandbox Code Playgroud)

另一个脚本将输出收到的消息并退出.所以到目前为止所做的一切都按照我的预期进行.问题是,当我尝试重新执行监听脚本时,它会抛出此错误:

Warning: socket_bind() [function.socket-bind]: unable to bind address [98]: Address already in use
Run Code Online (Sandbox Code Playgroud)

如果我跑

rm ~/tmp/sockets/test.sock
Run Code Online (Sandbox Code Playgroud)

然后重新运行listen脚本,它重新创建套接字文件并正常工作.所以我的问题是:无论如何,监听脚本重新连接到现有的套接字文件,并且发送脚本是否可以写入套接字,即使另一个脚本没有连接并监听该套接字文件?我是unix套接字概念的新手,所以任何帮助都将不胜感激!

Nik*_*sov 5

看一下unix(7)手册页.接近尾声时说:

绑定到带有文件名的套接字会在文件系统中创建一个套接字, 当不再需要它时,它必须被调用者删除(使用`unlink(2)`).通常的UNIX封闭语义适用; 套接字可以随时取消链接,并在最后一次引用它时最终从文件系统中删除.

因此,只需socket_bind()在服务器中删除套接字文件即可.