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

Php сокеты

25.02.2013, 20:09. Показов 4853. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru