Форум программистов, компьютерный форум, киберфорум
PHP: сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/23: Рейтинг темы: голосов - 23, средняя оценка - 4.52
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625

Php сокеты

25.02.2013, 20:09. Показов 4883. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Столкнулся с таким вопросом, как php сокеты(php_sockets.dll). Думаю использовать эту финчу, для реализации обмена сообщениями, между пользователями. Вопрос. Можно ли подключить к "прослушивающему" серверу, сразу несколько клиентов так, чтобы не было между ними путаницы? То есть, например, к серверу подключено, скажем 10 человек, но чтобы Петя, получал сообщения только от своего друга Васи, а Вася от Пети. То есть, какая-то индентификаци, между пользователями.

Похожая ситуация, есть в приватном чате. Когда два человека, ведут диалог, а отправляемые ими сообщения, всплывают в чате у обоих одновременно.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.02.2013, 20:09
Ответы с готовыми решениями:

Php сокеты и unix-сокеты
Здравствуйте, есть программа, написанная на С под Linux. При её работе в памяти хранятся несколько массивов, которые необходимо обработать...

PHP и сокеты
Будет страница с лотерейными карточками, для которых нужно постоянно обновлять данные( выигрыш, кол-во участников и т.п.) Есть ли смысл...

Сокеты на php
Добрый день. Возникла необходимость с ПО на делфи отправлять данные через сокеты на PHP. При получении данных сервер отправляет данные...

26
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
26.02.2013, 13:10
Цитата Сообщение от stashappy Посмотреть сообщение
Можно ли подключить к "прослушивающему" серверу, сразу несколько клиентов
Можно.

Цитата Сообщение от stashappy Посмотреть сообщение
но чтобы Петя, получал сообщения только от своего друга Васи
Ну так это уже отношения к сокетам не имеет. Просто нужно написать код, который будет хранить всех юзеров подключенных и для них сокеты. Придумать формат пакета, например первые 1-2 байта длинна пакета, далее 4 байта число, потом текст, если 0 - всем если не 0, значит юзеру с этим ид.
Ну и слать соответственно по этому числу.
1
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
26.02.2013, 15:55  [ТС]
То есть я так понимаю, к серверу, любой из клиентов, подключается по одному и тому же ip и порту, который в свою очередь, постоянно прослушивается сервером. Каждый из этих клиентов, пересылает на сервер, свой уникальный id и id пользотеля, которому он адресует свое сообщение. А сервер уже перехватывает эти id и производит соответствующие панипуляции. Правильно все понял?:-)
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
26.02.2013, 16:24
Цитата Сообщение от stashappy Посмотреть сообщение
Каждый из этих клиентов, пересылает на сервер, свой уникальный id
Тут смотря как устроен чат. Раз вы юзаете сокеты, то чат нужно делать не просто как обычный, должен быть постоянный коннект по сокету, после подключения происходит авторизация, и сервер хранит ид юзера сам, и потом определяет его по соединении сокетному.

Если это будет js чат то можно юзать вэб сокеты и их аналоги для других браухеров.
Лучше почитайте на тему comet серверов.
Можно найти много готовых реший для демонстрации. Например socket.io (js), tornado (python), node.js
Как вариант можно для клиента использовать socket.io а для сервера node.js.
https://github.com/learnboost/socket.io
1
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
26.02.2013, 17:29  [ТС]
Можно найти много готовых реший для демонстрации. Например socket.io (js), tornado (python), node.js
Как вариант можно для клиента использовать socket.io а для сервера node.js.
https://github.com/learnboost/socket.io
На другом форуме, мне тоже посоветовали эти библиотеки. Я с ними малость ознакомился. Но для меня это показалось слишком сложным. Решил воспользоваться альтернативой, как php сокеты + ajax. Это уже я осилить смогу.:-)

коннект по сокету, после подключения происходит авторизация, и сервер хранит ид юзера сам
Мне собственно необходимо связать двух пользователей, общим чатом. Это например как в фэйсбуке. Заходишь во вкладку сообщения, и видишь диалог со своим другом. Этот диалог, как и в обычных чатах, обновляется на обоих машинах одновременно, по мере поступления сообщений.

Вот у и меня и возникли два вопроса:
1. Подключение всех пользователей, к одному и тому же прослушивающему серверу.
2. Идентификация пользователей, чтобы не было путаницы.
Миниатюры
Php сокеты  
0
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
26.02.2013, 17:31  [ТС]
В общем то картина начинает проясняться. Еще один вопрос. Что если этих пользователей, будет миллион, как с этим будет справляться сервер? Пакеты с данными, ведь отправляются последовательно...
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
26.02.2013, 17:39
Цитата Сообщение от stashappy Посмотреть сообщение
как php сокеты + ajax
А смысл сокетов? ajax шлёт http запрос. А значит вам нужно обрабатывать http заголовки. А это писать на пхп нет смысла, либо нгинкс либо апач либо то что предложено выше.
Просто TCP сокет юзать есть смысл только со своим протоколом. А так вы получите HTML протокол на входе в сокете.

Добавлено через 7 минут
Цитата Сообщение от stashappy Посмотреть сообщение
будет миллион
Не будет, не какая ОС не даст устанолвить столько коннектов на один сокет. ID сокета 2 байта, это максимум может быть 65535 конектов.
Даже если бы заюзать много сокетов и подключить столько коннектов, а это чат в котором все пишут, это будет такой трафик, что канала просто может не хватить, а если ещё и строки парситься будут то и процессора
+ каждый коннект может быть структурой, например хранить даже просто
сокет 2 байта + ид юзера 4 байта + имя юзера пусть байт 30. При этом минимуме вы уже получите 1 000 000 * 36 = 36 000 000 байт = 34 Гб озу только под структуры, а реальная цифра будет гораздо больше.

Нужно делать кластер для такого количества.
1
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
26.02.2013, 17:59  [ТС]
А смысл сокетов? ajax шлёт http запрос. А значит вам нужно обрабатывать http заголовки. А это писать на пхп нет смысла, либо нгинкс либо апач либо то что предложено выше.
Просто TCP сокет юзать есть смысл только со своим протоколом. А так вы получите HTML протокол на входе в сокете.
Ну я как думал. То есть, через Аякс, Пост запросом передаем необходимые данные, в php обработчик. Этот обработчик, принимает данные и связывается по сокету с сервером. Далее, сервер принимает id отправителя, id получателя и текст сообщения. И если на момент отправки сообщения, другой пользователь(получатель) подсоединен к сокету, то в его чате, автоматически всплывает новое сообщение. Вот как-то так.

Я раньше думал, просто повесить Аякс запрос на выполнение через каждые 5-10 секунд. Который проверяет, скажем, если появилось новое сообщение в базе, то добавляем его в чат. Но как-то мне это показалось не совсем правильным.

Незнаю, возможно эти вещи можно сделать более легкими способами. Просто я далеко не все знаю в программировании.

Добавлено через 1 минуту
ID сокета 2 байта, это максимум может быть 65535 конектов.
Ух, а я об этом то и не подумал... И что вы посоветуете? Как мне решить эту задачу?...

Добавлено через 6 минут
Нужно то по идее, связать двух пользователей, обшим(между ними) чатом.:-)

Добавлено через 5 минут
например хранить даже просто сокет 2 байта + ид юзера 4 байта + имя юзера пусть байт 30.
А если не хранить эти данные?.. А просто - получил id пользователя, обработал, отправил и слушаем дальше.:-)
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
26.02.2013, 18:16
Цитата Сообщение от stashappy Посмотреть сообщение
Пост запросом передаем необходимые данные, в php обработчик.
Так а кто пост данные разбирать то будет? Вы должны понять что сокет это просто "розетка".
Вы передадите на неё данные по HTTP протоколу. Протокол это как ра описание офрмата данных который идёт по верх протокола TCP.
Вы получите на входе в сокете просто текст, который нужно парсить в соответствии с протоколом HTTP. А этим как правило занимаются вэб сервера типа nginx или apache.

То есть вам придёт в сокет такой текст
HTML5
1
2
GET /chat/HTTP HTTP/1.0
Host: site.ru
В ответ вам нужно слать тоже по протоколу HTTP.
И аякс конектится будет к тому же сокету на котором сайт, к другим портам не разрешит политика безопасности, например в опере.
А на том же порте вы сокет не откроете, так как он занят вэб сервером.
Значит Вам нужен прокси, а нгинкс не проксирует вэб сокет. А если это просто ajax вы получите как я писал выше HTTP протокол.

Вообщем для аякса не нужны сокеты в пхп, нужен просто скрпит, страничка сайта, которая будет отдавать json обратно в ajax.

О сокетах читайте теорию, что такое TCP что такое протоклы по верх TCP, и как можно установить постоянное соединение из браузера.
Цитата Сообщение от stashappy Посмотреть сообщение
Аякс запрос на выполнение через каждые 5-10 секунд
Лучше уж про long poll почитайте.


Цитата Сообщение от stashappy Посмотреть сообщение
Как мне решить эту задачу?
Задачи нужно решать по мере появления, что бы получить 60000 одновременных конетков - вы ещё постарайтесь. у вас етсь хот ябы 100? Я сомневаюсь, так как даже сайта пока нет. Все кто делают сайты пишут про такие огромные цифры, а в результате имеют 30 просмотров в день.
Сделайте хоть как то, и изучайте как оно работает, постепенно переходите на новое, что изучили.
Нельзя вот так не понимая что такое сокет и что такое протокол, взять и в теме на форуме узнать как сделать сайт на 1кк коннектов


Цитата Сообщение от stashappy Посмотреть сообщение
А если не хранить эти данные?
Ну вот и не нужны вам сокеты
1
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
26.02.2013, 18:43  [ТС]
Задачи нужно решать по мере появления, что бы получить 60000 одновременных конетков - вы ещё постарайтесь. у вас етсь хот ябы 100? Я сомневаюсь, так как даже сайта пока нет. Все кто делают сайты пишут про такие огромные цифры, а в результате имеют 30 просмотров в день. Сделайте хоть как то, и изучайте как оно работает, постепенно переходите на новое, что изучили.
Лучше сделать один раз хорошо, чем 10 раз переделывать.

Лучше уж про long poll почитайте.
Ок, обмозгую этот вопрос. Если будут непонятные ньюансы, спрошу в этой теме.:-)

Добавлено через 8 минут
Окей, хорошо. Давайте на время забудем про сокеты.

Есть задача, соединить двух юзеров, в "чате". Можно это назвать или чатом, или просто диалогом. Чтобы каждое новое сообщение, от любого из них, появлялось сразу же, на обоих машинах, по мере поступления. Без перезагрузки страницы. Какое оптимальное решение, вы можете предложить для реализации данной задачи? Soket.io я уже рассматривал. Мне показалось немного сложновато для меня. В каком направлени посоветуете идти?:-)

И конечно же, чтобы это все было рассчитано не на 30 пользователей, а на целый миллион. С запасом так сказать. Играть так по крупному. Мы не рассчитываем на низкий результат, а целимся на перспективный рост создаваемого ресурса.:-)

Добавлено через 9 минут

Не по теме:

Нельзя вот так не понимая что такое сокет и что такое протокол
Ну что сказать. Да, согласен. У меня только поверхностные знания. Чтобы во всех этих технологиях хорошо разбираться, нужно много времени. А у меня работа и семья. Сами понимаете, после работы, занимаешься этим через нехочу. Времени на все мало.:)

0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
26.02.2013, 18:56
Цитата Сообщение от stashappy Посмотреть сообщение
Soket.io я уже рассматривал. Мне показалось немного сложновато для меня
Цитата Сообщение от stashappy Посмотреть сообщение
чтобы это все было рассчитано не на 30 пользователей, а на целый миллион.
имхо - это противоречит друг другу и дело не в самом socket.io, а в том что раз оно сложно, то вам ещё рано замахиваться на кластерные сайты.
node.js сложно, socket.io сложно, а дальше будет ещё сложнее...
Вам ещё нужно настроить балансировщик нагрузки, проксирующий web socket.
А так же балансировку между серверами можно сделать на уровне днс. Ну и купить несколько серверов или взять в аренду, если простые то по 4-5к рублей/месяц, если с защитой от ддос, то 30к за сервер. Вы готовы их арендовать?)

Сделайте простой long poll. Вот как только не будет хватить вам конектов на выделенном core i7 например сервере, тогда продолжим тему
1
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
26.02.2013, 21:43  [ТС]
4-5к рублей/месяц, если с защитой от ддос, то 30к за сервер.
В общем-то деньги на это все есть. Денежный вопрос это не проблема. А с защитой от ДДос атак, за 30 тысяч, это не перебор? По моему, я где-то читал, что люди ставили какие программы на сервер, ограничивая, максимальное количество одновременных запросов.


Сделайте простой long poll.
Отлично. Буду идти в этом направлении. Благодарю за помощь, друг мой.:-)

Добавлено через 2 часа 43 минуты
У меня возник вопрос, относительно Comet.

В сервеной части, стоит постоянный цикл, проверяющий произошедшие изменения, скажем, каждые 5 секунд. Если произошли какие-то изменения, то посылаются данные к клиенту. А собственно использование этого цикла, не загружает сервер или процессор сервера? Просто я подумал, если будут у меня там 50 пользователей сидеть и на каждого будет по одному циклу запущено...
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
26.02.2013, 23:50
Цитата Сообщение от stashappy Посмотреть сообщение
скажем, каждые 5 секунд
это не правильный подход к написанию сервера. Нужны события, и по событию прихода данных нужно запускать рассылку.

Цитата Сообщение от stashappy Посмотреть сообщение
Просто я подумал, если будут у меня там 50 пользователей сидеть и на каждого будет по одному циклу запущено...
Если уж и цикл, то проверять нужно всех сразу в одном цикле.
Но как я написал выше, имхо это не верный подход. Суть комет сервера что вы получается практически мгновенные сообщения от сервера, сразу по приходу, а вы хотите просто 5 секундную задержку перенести с клиента на сервер.
Ну а пока висит на sleep'е - нагрузка на процессор 0.
И так как у пхп нет многопоточночти, то при слипе хотя бы 1го цикла у вас весь сервер будет висеть и даже данные не получит.
1
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
27.02.2013, 00:06  [ТС]
а вы хотите просто 5 секундную задержку перенести с клиента на сервер.
PHP
1
2
3
4
5
6
7
while(true) {
  if()
     // здесь проверяются данные
    break; // если имеются новые данные
  }
  sleep(5);
}
И так как у пхп нет многопоточночти, то при слипе хотя бы 1го цикла у вас весь сервер будет висеть и даже данные не получит.
Не совсем понял сказанное.

А comet разве не на цикле основан? Вот в этой статье у автора стоит цикл, проверяющий наличие новых данных:
http://spectrox.ru/blog/comet-theory-beginning/
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
27.02.2013, 00:23
А это что хорошая статья? Вы всё что написано в интернете принимаете за истину?

Ну сами подумайте, вконтакте или в любом другом чате на комет или лонг полл у крупных сайтов есть задерка 5 сек? Я не замечал) Сообщение сразу рассылается.


Цитата Сообщение от stashappy Посмотреть сообщение
Не совсем понял сказанное.
Всё просто, sleep усыпляет поток, в пхп скрипте у вас будет один поток. Он уснёт, значит даже чтение данных с сокета не будет пока поток спит.

Вам нужно в цикле спать не по слипу а по select.
Это будет ждать активности в сокете и пока её нет поток будет спать, как только она появилась вы читаете пришедшие данные и вызываете событие рассылки нужным юзерам, после рассылки вы опять попадаете на select и опять ждёте. У вас не будет ни одного использования функции sleep в коде.

Только сейчас понял, что вы делаете не comet. Вы не путайте comet и long poll
comet сервер запущен всегда, он один на всех юзеров и нет переподключений (судя по заголовку статьи, автор сам не очень понимает что он написал...). А вы показали статью реализации long poll.

В вашем случае проще всего как раз делать слипы. Пока висит на sleep - нет нагрузки на проц, но в памяти место занимает
1
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
27.02.2013, 00:27  [ТС]
Если уж и цикл, то проверять нужно всех сразу в одном цикле.
То есть всех 50 пользователей имеется ввиду?

Не по теме:

Вы не обращайте особо на мои возможно тупые вопросы. Просто я с этой ху#ней, уже неделю вожусь. Нервный сцука стал на этой почве.:)

0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
27.02.2013, 00:35
Цитата Сообщение от stashappy Посмотреть сообщение
То есть всех 50 пользователей имеется ввиду?
Это можете не читать, так как у вас не comet.
Я же написал что у статьи название кривое. У вас в 1 скрипте только 1 клиент
Так что вы не как в одном цикле не сможете читать всех.
1
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
27.02.2013, 00:48  [ТС]
Только сейчас понял, что вы делаете не comet. Вы не путайте comet и long poll
Да я уже и сам не понимаю чего хочу. Мозги скоро взорвутся. Я тупо хочу организовать чат, между двумя пользователями. Чтобы было без перезагрузки, чтобы новое сообщение, появлялось сразу на двух машинах. Но каким способом, реализовать все это я и пытался выяснить.:-)

Сейчас я так понимаю, вы мне советуете делать все таки на основе long poll с циклом который. Окей. Я попробую еще повозиться сегодня. Почитаю мануал про select. Поэксперементирую...

А насчет названия моего топика. Дело в том, что на другом форуме читал статью про php сокеты и их использование. Вот и решил начать реализовавывать свою задачу с их помощью. Но в итоге выяснилось, что это полная хрень. Незнаю, может тогда целесообразней как нибудь переименовать топик.
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
27.02.2013, 00:52
Цитата Сообщение от stashappy Посмотреть сообщение
Почитаю мануал про select.
Не надо! это для comet

Цитата Сообщение от stashappy Посмотреть сообщение
А насчет названия моего топика.
Я не про Ваш топик, а про статью, Вы выше дали ссылку на статью, там название "Реализация Comet в среде php+javascript" - вот оно не верное. Там реализация long poll, comet - совсем другое

Добавлено через 1 минуту
Цитата Сообщение от stashappy Посмотреть сообщение
что это полная хрень.
Ну и это не хрень, нормальный comet сервер, не зная основ работы с сокетами, не сделать
1
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
27.02.2013, 00:56  [ТС]
Не надо! это для comet
Ёплешке, ну я и профан.

В общем, мне сейчас держаться того же курса. Делаем на основе цикла со sleеp()'ом. Правильно шагаю?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.02.2013, 00:56
Помогаю со студенческими работами здесь

PHP, MySQL и сокеты
Всем доброго времени суток. Есть скрипт на PHP, который работает на стороне сервера, создаёт сокет для подключения к клиенту и сравнивает...

Сокеты
Хотел спросит как с помощью сокетов можно выводить контент с одного сайта на другой, то есть например на одном сайте написана...

Сокеты
Я стал изучать сокеты и произошла одна ошибка. Вот код клиента: <?php $s=fsockopen('127.0.0.1',80,$i,$s,10); // Соединяемся с...

Сокеты
Решил написать небольшую онлайн игру на java. Как мне сделать передачу данных между клиентом (написан на java) и сервером (php)? Читал в...

Сокеты и сессии
Подскажите пожалуйста как идентифицировать подключения по сокетам? Как использовать сессии и куки в сокетах? Желательно с примерами.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru