В идеале я бы решил проблему так:
1) При первом обращении пользователь добавляется в список ожидающих
2) Если пользователь обращается и условие выполняется, назначем ему номер комнаты для входа, убираем его из общего списка.
Если бы можно было написать серверную часть на Си, то решил бы проблему с использованием критических секций и общей памятью между потоками, но я имею дело с PHP и ситуация несколько сложнее.
Для реализации списка юзеров можно использовать БД, Файлы или библиотеку APC. Alternative PHP Cache вроде как сохраняет данные в памяти и должен быть самым быстрым решением, но остается проблема с конкурентным обращением к памяти из разных процессов — при удалении юзера из списка параллельно выполняемый скрипт может сохранить старое значение переменной и переписать его старое значение. Также я не уверен, что APC будет на целевом хостинге. С БД я мало знаком, но уверен, что оно лишено описанной проблемы, не охота использовать БД из-за низкой производительности — обращение к скрипту будет очень частым и не хочется каждый раз трогать для этого БД. В итоге я пришел к тому, что надо хранить список в файле, перед удалением юзера я буду вызывать flock, что должно предотвратить конкурентное обращение.
В принципе решение я нашел, но поскольку у меня нет опыта написания серверных приложений и PHP я изучаю второй день, не могу быть уверен, что это лучший вариант. Хочется послушать как данную задачу решили бы вы.
Спустя 19 минут, 4 секунды (10.06.2009 - 20:38) sergeiss написал(а):
Однозначно БД. И учти, что БД - это те же файлы, только защищенные от проблем одновременного обращения, оптимизированные для поиска в них данных, да и много других плюсов есть.
Поэтому, ежели ты не хочешь делать свою СУБД, то используй уже существующую. Ее производительности хватит И MySQL, и PostgreSQL, и многие другие. А если пользователь и подождет в очереди пару микросекунд, то он этого даже и не заметит.
Поэтому, ежели ты не хочешь делать свою СУБД, то используй уже существующую. Ее производительности хватит И MySQL, и PostgreSQL, и многие другие. А если пользователь и подождет в очереди пару микросекунд, то он этого даже и не заметит.
Спустя 4 часа, 8 минут, 35 секунд (11.06.2009 - 00:46) Яски написал(а):
Хорошо, буду делать через БД. Меня просто смутило, что список пользователей будет постоянно полностью обновляться — т.е. постоянное хранение совершенно не требуется. И я переживаю за нагрузку на сервер — боюсь, что постоянная работа с базой (на каждый запрос минимум одно обращение к БД) не потянет на дешевом хостинге, на котором все это будет крутиться.
Спустя 7 часов, 31 минута, 25 секунд (11.06.2009 - 08:18) sergeiss написал(а):
Цитата (Яски @ 11.06.2009 - 01:46) |
боюсь, что постоянная работа с базой (на каждый запрос минимум одно обращение к БД) не потянет на дешевом хостинге |
Во-первых, обращение к файлу - это тоже нагрузка на сервер
А во-вторых, если хостер не потянет, то меняй хостера. Это проще будет, чем делать свою БД.
Спустя 2 часа, 45 минут, 26 секунд (11.06.2009 - 11:03) Яски написал(а):
Большое спасибо, вы мне очень помогли. В соседней теме я еще нашел, что можно сессии PHP сохранять в БД, это я тоже буду использовать и вся система благодаря этому очень хорошо ложится на PHP.