Привет всем) инфы в инете куча, но я решил все таки написать)) сейчас тут помогаю с одним проектом, мобильное приложение в котором будет чат.. что то типа телеграмма.. и надо все это добро что пишут в мобильном приложении сохранять на сервер.. понятное дело для этого надо же делать подключения на сокетах.. я решил слушать сокеты на пхп, но коллега говорит что пхп не умеет создавать несколько потоков, и если поток слушает сокет то он блокируется.. и что лучше сделать на ноде или на чем то другом... я то согласен что лучше на надо, но если с пхп я смогу сделать это быстро то с нодой мне надо будет разбираться, потому что мой JS на уровне "повесить на кнопку обработчик"... нашел пример, там вот такое вот есть. . PHP: $socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr); if (!$socket) { die("$errstr ($errno)\n"); } $connects = array(); while (true) { //формируем массив прослушиваемых сокетов: $read = $connects; $read []= $socket; $write = $except = null; if (!stream_select($read, $write, $except, null)) {//ожидаем сокеты доступные для чтения (без таймаута) break; } if (in_array($socket, $read)) {//есть новое соединение //принимаем новое соединение и производим рукопожатие: if (($connect = stream_socket_accept($socket, -1)) && $info = handshake($connect)) { $connects[] = $connect;//добавляем его в список необходимых для обработки onOpen($connect, $info);//вызываем пользовательский сценарий } unset($read[ array_search($socket, $read) ]); } foreach($read as $connect) {//обрабатываем все соединения $data = fread($connect, 100000); if (!$data) { //соединение было закрыто fclose($connect); unset($connects[ array_search($connect, $connects) ]); onClose($connect);//вызываем пользовательский сценарий continue; } onMessage($connect, $data,$info);//вызываем пользовательский сценарий } } fclose($server); насколько я вижу тут можно сколько угодно обрабатывать сокетов.. масив формируется из новых сокетов.. если соединение закрывается то убирает из массива и больше не слушаем этот сокет.. я правильно понял как тут все работает? или туплю где то? Спасибо)
Вы можете развернуть сколько угодно php-FPM процессов которые будут слушать один порт/сокет. Например 300. В условиях работы на php-fpm аргумент твоего товарища имеет актуальность 5-летней давности и мне не понятен.
PHP может держать множество соединений на сокеты одновременно. Однако читать или писать в один момент времени только в один сокет. Можно пробовать параллелить этот процесс с помощью pcntl_fork(). Если будет работать, то это будет очень шустро по сравнению с одним потоком, однако более прожорливо в плане ОЗУ, чем решения на других языках.
Неверно. fpm-pool подними который будет смотреть на другой сокет и читай-пиши на здоровье. https://gist.github.com/fyrebase/62262b1ff33a6aaf5a54
Я вот сейчас только начал играться с centrifugo, и там очень просто. Установил, конфиги скопипастил, крошечный код на JS, крошечный код на php (с использованием готовой библиотеки), и всё - радуюсь Чат с приватными кабинетами (ну почти, без регистрации, id чата в параметре урла, но это в качестве игрушки) собрал за пару часов. https://github.com/centrifugal/centrifugo Теперь сижу и думаю - что боялся её, и зачем пытался веб. сокет на php пилить самостоятельно...
Неверно именно то, что в цитате? --- Добавлено --- это же про локальные unix-сокеты, а ТС требует чтобы скрипт обслуживал клиентов извне
Какая хрен разница. Услышь меня: у тебя запускаются разные демоны (!) с какого счастья они не смогут слушать разные локальные порты/сокеты, удаленные?
где то примеры нашел?? а то я пока застрял на моменте "установил, сгенерил секретный код, а что дальше не понятно..."
Потом берешь пхплибу и передаешь демону сообщения Код (Text): $client = new \phpcent\Client($cent_server); $client->setSecret($cent_secret); $client()->publish("public:$channel", $message); потом пишешь js-функцию для обработки сообщений, берешь клиентскую либу, подключаешься к центрифуге и подписываешься на канал с назначением своей функции на обработку сообщений. Код (Text): function handleMessage(message) { alert('I have a new message!'); } var centrifuge = new Centrifuge({ // please, read Centrifuge documentation to understand // what does each option mean here url: 'ws://.../connection/websocket', user: user, timestamp: timestamp, token: token, debug: true }); centrifuge.subscribe(chanell, handleMessage); Всё!
Там документация же хорошая, надо просто прочитать всё. ссылки на две php-либы там есть, js-либа описана прямо в доках, конфиг обратного прокси nginx описан в доках. А потом всё, как @[vs] пишет --- Добавлено --- Ну если хочешь, могу мой мини чат выложить в гитхаб. Он на Slim 3 сделан
выложи пожалуйста)) я уже научился отправлять сообщения из вебадминки в браузер)) но этого мало)) Спасибо
https://github.com/mike-kramer/chat-example - на, смотри. Вот этот файл, в принципе, можно было не выкладывать, забыл в игнор добавить - это стандартный, скачивается с сайта центрифуги: https://github.com/mike-kramer/chat-example/blob/master/public/js/centrifuge.js
https://fzambia.gitbooks.io/centrifugal/content/clients/javascript.html прикольно)) центрифуга как бы предназначена больше для того что бы сервер что то отсылал клиенту, а не что бы клиент отсылал что то на сервер.. а если через сокеты хочется какие то объемы данных слать на сервер с клиента.. например файл изображения отправить надо.. это что получается лучше использовать что то другое??
@Алекс8, механизмы отправки чего-то с клиента на сервер у нас и так есть. Для передачи сверхбольших файлов существуют и свои механизмы тоже - закачка файла по частям через HTML5 FileAPI, у примеру. Для этого не нужны веб-сокеты. Проблема именно в том, чтоб передать что-то с сервера на клиент по инициативе сервера, вот её центрифуга решает прекрасно
А если это андроид мессенжер который должен на сервер отправлять файлы, сообщения.. пусть через post запросы делает?