Задать вопрос
@w3w3w3w3

Как реализовать multi socket server?

у меня есть сервер который принимает подключения, дальше заносит host:port сокета в массив

server.php
<?php

include_once 'clients.php';

$address = "127.0.0.1";
$port = 5001;

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    echo "Ошибка создания сокета: " . socket_strerror(socket_last_error()) . PHP_EOL;
    exit(1);
}

if (!socket_bind($socket, $address, $port)) {
    echo "Ошибка привязки сокета к адресу и порту: " . socket_strerror(socket_last_error()) . PHP_EOL;
    exit(1);
}

if (!socket_listen($socket, 5)) {
    echo "Ошибка начала прослушивания сокета: " . socket_strerror(socket_last_error()) . PHP_EOL;
    exit(1);
}

echo "Сервер запущен и слушает на $address:$port" . PHP_EOL;

while (true) {
    $clientSocket = socket_accept($socket);
    if ($clientSocket === false) {
        echo "Ошибка приема подключения: " . socket_strerror(socket_last_error()) . PHP_EOL;
        continue;
    }

    addClient($clientSocket);

    print_r(getClients());
    echo "Новое подключение от " . socket_getpeername($clientSocket, $address, $port) . PHP_EOL;

}

socket_close($socket);
?>


в файле clients.php создаю массив в котором буду хранить данные об сокетах

<?php

session_start();

if (!isset($_SESSION['clients'])) {
    $_SESSION['clients'] = array();
}

function getClients() {
    return $_SESSION['clients'];
}

function addClient($clientSocket) {
    $clientAddress = socket_getpeername($clientSocket, $address, $port);
    $clientIdentifier = "$address:$port";
    
    $_SESSION['clients'][] = $clientIdentifier;
}
?>


проблема в том, что из логов сервера видно что данные в массив были занесены

65c7ee029feb8601356448.png

но как только я решаю это проверить на сайте, то в select box просто не отображается сокет, а если добавить вывод в clients.php

echo "Clients list: " . PHP_EOL;
print_r(getClients());


то вывод будет следующий
Clients list: Array ( )

я не понимаю почему данные не заносятся в массив или что с ними происходит после занесения что они магическим для меня образом исчезают. Знатоки, надеюсь на вашу помощь
  • Вопрос задан
  • 102 просмотра
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
Daemon23RUS
@Daemon23RUS
Видимость переменных,
но как только я решаю это проверить на сайте

Вангую, что экземпляр getClients на "сайте" не принадлежит экземпляру socket_create на сервере
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы