|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Dec 2008
Адрес: Одесса
Сообщений: 129
|
Производительность и выносливость php, сокеты
добрый вечер!
Меня седня оч сильно огорчили и хочу знать правда ли это. Делаю чат с наворотами для проекта. Создал сокет в пхп и слушаю определенный порт. и потом Писал не от себя, руководствовался примерами и исходниками из сети. На работе пхпшник заявил что как только чат будет запущен, т.е. внедрен в проект и юзеры начнут пользоваться, то он время от времени будет отваливаться, в зависимости от нагрузки, потому что... уже забыл что он там рассказывал, потому что я чуть ли не в депрессию впал, месяц работы и на тебе. Очень хотелось бы услышать ваши мысли из опыта, какие пределы и особенности у пхп. Что на нем можно писать а что нет, какой язык популярен для сервера. Кстати собирался писать по такому же принципу и сервер для MMO. Я три месяца с пхп и это мой первый опыт работы с сокетами. Буду весьма благодарен за помощь и направление. |
|
|||||
Регистрация: Aug 2008
Сообщений: 258
|
у меня отлично работал..
висел на VPS ... запускался из командной строки и был засунут в автозагрузку.. т.к. сервер раз в сутки перезагружался. Обращение к БД было только когда конектился новый пользователь. (проверка логина пароля, и вытаскивание персонального конфига) Все данные хранились в массивах по такой схеме $array_chat['user'][$client]['name'] id юзера, id_ресурс сокета и инфа сообщения я вообще не хранил, получал и сразу рассылал Вообще простейщая схема такая: set_time_limit(0); ob_implicit_flush(); require_once "mysql.php"; echo "- Сервер <br /><br />"; $array_chat['name_room']['1'] = "общая комната"; $address = gethostbyname('localhost'); $port = 4679; echo "Создание сокета ... "; $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if($socket < 0) { echo "Ошибка: ".socket_strerror(socket_last_error())."<br />"; } else { echo "OK <br />"; } echo 'Устанавливаем опцию сокета SO_REUSEADDR ... '; if (!socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1)) { print('ERROR: socket_create() failed: '.socket_strerror(socket_last_error())."<br>"); } else { echo "OK<br>"; } socket_set_nonblock($socket); echo "Привязывание сокета... "; $bind = socket_bind($socket, $address, $port); if($bind < 0) { echo "Ошибка: ".socket_strerror(socket_last_error())."<br />"; } else { echo "OK <br />"; } echo "Прослушивание сокета... "; $listen = socket_listen($socket, 5); if($listen < 0) { echo "Ошибка: ".socket_strerror(socket_last_error())."<br />"; } else { echo "OK <br />"; } $array_sockets = array($socket); while(true) { $read = $array_sockets; // смотрим изменение на сокетах (чтение) if (socket_select($read, $write = NULL, $except = NULL, 1, 0) > 0) { foreach($read as $client) { if(!array_search($client, $array_sockets)) { echo "Подключился новый человек... <br />"; $client = socket_accept($socket); if($client < 0) continue; $array_sockets[] = $client; } $msg = socket_read($client, 1024); if(!$msg) { // значит человек вышел, удаляем данные из массивов, закрываем его сокет. } else { // тут ловим сообщения от клиентов и выполняем соответствуюшие действия } } } } if (isset($socket)) { echo "Закрываем соединение... "; socket_close($socket); echo "OK <br />"; } |
|
|||||
Регистрация: Dec 2008
Адрес: Одесса
Сообщений: 129
|
У меня почти что аналогичная схема работы, т.е. логика работы такая же.
Цитата:
|
|
|||||
Регистрация: Aug 2008
Сообщений: 258
|
просто unset на элемент массива.. или переменную, PHP должен выгружать из памяти
|
|
|||||
Регистрация: Dec 2008
Адрес: Одесса
Сообщений: 129
|
membrilius спасибо.
А кто-то писал что-то более серьезное на пхп, чем чат? может какие то ММО игры? |
|
|||||
Регистрация: Jan 2010
Сообщений: 211
|
Сразу оговорюсь - огромный, мягко говоря, НЕсторонник ПэХаПэ ...
Нюансы работы с подобного рода серверных языков заключаются в работе сокетов, точнее, в том, что это обычные блокирующие сокеты: открывается сокет, он висит в памяти сервера (!) и закрывается при обрыве или соответствующей команде. При этом по разным источникам "вес" открытого сокета в памяти сервера составляет от 400Кб до 2Мб. Отсюда ограничение - максимальное количество открытых одновременно сокетов составляет сотни (о тысячах нигде не слышал). Альтернативой блокирующим сокетам выступают НЕблокирующие советы (NIO sockets), работа которых основана на событийной модели работы платформы. С точки зрения бизнес-логики это сложнее среде, но зато позволяет работать с количеством коннектов, как минимум, на порядок выше, чем при блокирующих сокетах (когда занимался близко этой темой, сталкивался с упоминаниями о тесте в 20 тыс. одновременных коннектов к отдельному серверу, что в принципе невозможно при блокирующих сокетах). Фактически это единственное ограничение, которое накладывает работа в ПэХаПэ - невозможность создавать неблокирующие сокеты. В остальном существенной разницы не замечено (из публикаций). |
|
|||||
Регистрация: Aug 2008
Сообщений: 258
|
Dimitry_II
тогда что делают следующие функции: socket_set_block - переводит сокет в режим блокировки, в это режиме операции ввода-вывода ожидают завершения запросов. socket_set_noblock - переводит сокет в незаблокированый режим работы, в этом режиме операции ввода-вывода осуществляются немедленно, даже если данные не могут быть переданы. |
|
|||||
Написал я сокет сервер для мультипользовательской игры на пыхе, теперь мучаюсь.
Может, конечно, я что не так понаписал, тем не менее, примерно при 25 одновременных коннектах порт отваливается и усе, перестает что либо принимать, такое чувство, что скрипт вылетает. Смотришь процессы - висит.... пока скрипт сервака не перезагрузишь, проблема не решиться. Сейчас быстро изучаю smartfoxserver.... вот такие проблемки бывают с php
__________________
"...Кто они, чтобы учить тебя, Кто они, чтобы лечить тебя, Кто они?! Как они Могут знать кто ты?!..." |
|
|||||
Регистрация: Aug 2008
Сообщений: 258
|
господа, запомните, ПХП это интерпретатор ... написанный на Си .. и теоретически он может тоже самое, только + к нагрузке идёт распознание кода и перевод его в аналог на СИ...
ДА падает производительность, да не для ИРГ .. но чат написать запросто. а данный момент он работе быстрее PERL и Python ... а скоро выйдет PHP6 ... в котором убран весь мусор, и идёт расчет только на производительность. |
|
|||||
Регистрация: Dec 2008
Адрес: Одесса
Сообщений: 129
|
У меня тоже отваливается, причем бывает что даже когда никого нет в чате, при это не выдавая никаких ошибок.
А смартфокс не дешево стоит, а те 20 онлайн юзеров которые бесплатно предлагает смартфокс, можно и на пхп обеспечить |
Часовой пояс GMT +4, время: 12:16. |
|
« Предыдущая тема | Следующая тема » |
|
|