Я работаю над системой IPC для бэкэнд веб-клиента IM, закодированного в PHP. Я пытаюсь реализовать сокеты Unix, но у меня проблемы с повторным использованием созданного файла сокета. Вот код, который прослушивает сокет для событий.Повторное использование файлов Socket PHP 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);
Когда этот сценарий запускается в первый раз, он создает файл сокета 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);
Другой скрипт выведет полученное сообщение и выйдет. Так что все до этого момента работает так, как я ожидаю. Проблема заключается в том, когда я пытаюсь заново запустить скрипт для прослушивания он бросает эту ошибку:
Warning: socket_bind() [function.socket-bind]: unable to bind address [98]: Address already in use
Если я бегу
rm ~/tmp/sockets/test.sock
Затем запустите скрипт слушать это воссоздает файл сокета и работает отлично. Поэтому мой вопрос: есть ли когда-нибудь сценарий прослушивания повторно подключиться к существующему файлу сокета и может ли сценарий отправки писать в сокет, даже если другой скрипт не подключен и не прослушивает этот файл сокета? Я новичок в концепции UNIX-сокетов, поэтому любая помощь будет принята с благодарностью!
Итак, это означает, что файл сокета должен быть удален после того, как скрипт будет выполнен, прослушивая его ... и это означает, что другой скрипт не смог открыть этот файл сокета и написать ему, если ничто не слушает его, что было моей целью. Я изучаю использование специального файла fifo (именованный канал), потому что похоже, что эти сокеты не будут работать. –
Как насчет того, чтобы прослушивать один раз, но поместив обработку accept и client в цикл, чтобы вы могли обрабатывать несколько клиентов? –
@NikolaiNFetissov, я попытался отключиться сразу после 'socket_bind', и файл был удален немедленно. Поэтому клиенты не могли подключиться. Что не так? – seelts