Closed borodatych closed 7 years ago
Здравствуйте. Как запрограммируете так и будет. К сожалению у меня нет готового примера для чаткомнат.
Не так выразился с чат-комнатами, хотя возможно близко. Я как то могу на стороне сервера отправить сообщение конкретному пользователю, а не всем сразу?
И что скажете по примерам, конкретнее второй вопрос про чат3?
Да, в примере Чат3 показано как отправить одному человеку.
Да - это ответ на то что чат3 улучшенная версия чат2?
#!/usr/bin/env php
<?php
$userId = @$argv[1];
$message = @$argv[2];
if( $userId && $message )
{
$localsocket = 'tcp://127.0.0.1:8010';
$instance = stream_socket_client ($localsocket, $errno, $errstr);//соединямся с вебсокет-сервером
fwrite($instance, json_encode(['message' => $message, 'userId' => $userId]) . "\n");//отправляем сообщение
///fwrite($instance, json_encode(['message' => $message, 'clientId' => $userId]) . "\n");//отправляем сообщение
}
else die("No_Data\n");
Не отправляет, к сожалению. Пробовал уже и к веб-адресу цепляться, не помогло. Так же пробовал и по userId и по clientId отправлять. Подскажите пожалуйста, что упускаю?
нет, чат3 - это не улучшенная версия чат2. ничего не могу подсказать, мало исходных данных, опишите подробно всё что делаете
Предполагаю нет связи между localsocket и websocket ??
вот код примера чат3:
public $userIds = [];
protected function onOpen($connectionId, $info) {//it is called when the connection is open
$message = 'пользователь #' . $connectionId . ' : ' . var_export($info, true) . ' ' . stream_socket_get_name($this->clients[$connectionId], true);
foreach ($this->clients as $clientId => $client) {
$this->sendToClient($clientId, $message);
}
$info['GET'];//or use $info['Cookie'] for use PHPSESSID or $info['X-Real-IP'] if you use proxy-server like nginx
parse_str(substr($info['GET'], 1), $_GET);//parse get-query
//var_export($_GET['id']);
$this->userIds[$connectionId] = $_GET['userId'];
}
и в нём видно, что userId - это не номер соединения, а параметр из GET-запроса.
если налдо оправлять по номеру соединения, то строчку
$this->userIds[$connectionId] = $_GET['userId'];
надо заменить на
$this->userIds[$connectionId] = $connectionId;
Сори, моя не внимательность. Подкиньте ссылок, что бы почитать чем отличается чат3 от чат2. Вы как то писали про 1024 потока на одном сокете. Не увидел реализации ни в чат2 ни в чат3, это домашнее задание или проглядел?
https://github.com/morozovsk/websocket-examples/tree/master/chat2/server https://github.com/morozovsk/websocket-examples/tree/master/chat3/server
https://github.com/morozovsk/websocket/wiki : pecl/event (needed for more then 1000 connections without php recompilation)
needed packages: php-pear libevent-2.0-5 libevent-dev libssl-dev pkg-config command: pecl install event add "extension=event.so" to php.ini
То есть, если установить:
needed packages: php-pear libevent-2.0-5 libevent-dev libssl-dev pkg-config
command: pecl install event
add "extension=event.so" to php.ini
То вопрос об ограничение решен? И чат3 в этом случае оптимальнее, так как запускать один процесс, за коим следить проще, когда как в чат2 все равно стартовать два скрипта?
Если не хотим что либо устанавливать, то для ограничения юзаем чат2, где запускаем один мастер и воркеров по кол-ву ядер или меньше, но не больше, если таковые устроят?
да
Сори, что перееоткрыл
Здравствуйте.
Хочу интегрировать ваше решение к себе на сайт. Подскажите можно ли как то отправлять сообщение конкретно одному пользователю? В примерах Чат3 - улучшенная вариация Чат2 ?
Спасибо.