Как лучше лучше сделать раздельное управление программами?

Ссылка скопирована
PHP
1 ответ

Нужно понять: вопрос в следующем, есть сайт в котором отображается подключенные клиенты к системе, как обработать сокеты таким образом что бы не затрагивая код сокета из одного файла в другом этот код использовать для коммуникации транспортом данных?

По вводным: то есть есть активные соединения, нужно получить список этих активных соединений и задействовать транспортный протокол данных.

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Мария Код Ответ

Если у вас есть PHP-процесс, который держит активные socket-соединения, то “из другого файла” просто взять и управлять этими соединениями нельзя, если этот другой файл запускается как отдельный HTTP-запрос. В PHP каждый веб-запрос обычно живет отдельно: переменные, объекты и ресурсы сокетов не шарятся между процессами. Поэтому нужно не “подключить файл”, а сделать слой управления между процессами.

Рабочая архитектура такая:

  • Отдельный long-running процесс держит сокеты клиентов.
  • Он хранит список соединений в памяти.
  • Внешний код общается с ним через очередь, Redis Pub/Sub, ZeroMQ, HTTP API, Unix socket или WebSocket control channel.
  • Процесс-сервер получает команду и отправляет данные нужному клиенту.

Например, если используется Ratchet/ReactPHP, можно хранить соединения в SplObjectStorage и подписаться на Redis-канал команд.

class SocketServer implements MessageComponentInterface
{
    private SplObjectStorage $clients;
 
    public function __construct()
    {
        $this->clients = new SplObjectStorage();
    }
 
    public function onOpen(ConnectionInterface $conn): void
    {
        $this->clients->attach($conn);
    }
 
    public function onMessage(ConnectionInterface $from, $msg): void
    {
        // обработка сообщений клиента
    }
 
    public function sendToAll(string $payload): void
    {
        foreach ($this->clients as $client) {
            $client->send($payload);
        }
    }
}

class SocketServer implements MessageComponentInterface { private SplObjectStorage $clients; public function __construct() { $this->clients = new SplObjectStorage(); } public function onOpen(ConnectionInterface $conn): void { $this->clients->attach($conn); } public function onMessage(ConnectionInterface $from, $msg): void { // обработка сообщений клиента } public function sendToAll(string $payload): void { foreach ($this->clients as $client) { $client->send($payload); } } }

А внешний файл не трогает сокеты напрямую, а кладет команду в Redis:

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->publish('socket_commands', json_encode([
    'action' => 'send',
    'user_id' => 123,
    'payload' => ['type' => 'notice', 'text' => 'Обновление']
]));

$redis = new Redis(); $redis->connect('127.0.0.1', 6379); $redis->publish('socket_commands', json_encode([ 'action' => 'send', 'user_id' => 123, 'payload' => ['type' => 'notice', 'text' => 'Обновление'] ]));

Если задача небольшая, можно сделать проще: socket-сервер поднимает внутренний HTTP endpoint на localhost, а второй файл отправляет туда POST-команду. Но Redis/очередь надежнее, потому что команды можно логировать, повторять и не зависеть от конкретного веб-запроса.

Вывод: раздельное управление делается через IPC/очередь/локальный API. Нельзя рассчитывать, что include другого PHP-файла даст доступ к активным соединениям, если они живут в другом процессе.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно