Теперь как я вижу, данную реализацию, возможно что неправильно себе представляю, прошу открыть глаза в случае чего. Значит так, регистрация пользователей происходит на одном сервере, на этом сервере в базе данных мы создаем таблицу очереди, полностью идентичную обычной таблице юзеров (ну там логин/пасс/мыло и т.д.). При нажатии кнопки регистрации, мы в этой таблице очереди создаем новую строку с данными (логин/пасс/мыло), дальше наш скрипт циклом перебирает каждую запись из таблицы очереди и в цикле непосредственно уже запускается функция регистрации которая регистрирует пользователя в таблицу юзеров, сразу после этой операции, удаляем эту строку из таблицы очереди и пишем sleep(1) и скрипт переходит к следующей записи из таблицы очереди. Будет ли такое работать или нет ? Просто вот если в одну секунду обратятся к скрипту 10 запросов, то скрипт и выполнится 10 раз, причем в один и тот же момент, соответственно ничего не изменится и все зарегистрируются с одним и тем же идентификатором как поступить ? спасите и помогите.
P.S. Постарался описать все подробно, в чем суть проблемы, чтобы не было вопросов "а зачем тебе это" и т.д. Мне бы хоть какой-то материал на русском, где можно посмотреть как пишут такие очереди на php. всё перекопал, не нашел ничего
PPS Забыл еще написать про то, как протестировать работу такой очереди, например при помощи phpunit, а тобишь как при помощи него создать такой тест, где условием будет то, что к скрипту обращаются у нас 10 человек и посмотреть потом в отчете правильно отработала функция или нет.
Спустя 1 час, 35 минут, 42 секунды (23.10.2011 - 00:49) caballero написал(а):
Цитата |
придется использовать тип поля bigint, вместо int, в общем не нравится такое решение и всё. |
Вообще то если руководствоватся критериями нравится/не нравится вместо правильно и неправильно то задавать вопросы кагбэ не имеет смысла.
В чем проблемма с bigint?
можно клеить autoincrement и номер сервера.
Вообще самое униварсальное это генерить GUID.
Очереди в PHP никак - это не ява. Либо некая таблица в БД и скрипт который периодически дергаеся кроном, либо специализированная прога которую нигде на хостинге ставить не дадут.
Спустя 2 часа, 14 минут, 6 секунд (23.10.2011 - 03:03) Santehnick написал(а):
Цитата (caballero @ 22.10.2011 - 21:49) | ||
Вообще то если руководствоватся критериями нравится/не нравится вместо правильно и неправильно то задавать вопросы кагбэ не имеет смысла. В чем проблемма с bigint? можно клеить autoincrement и номер сервера. Вообще самое униварсальное это генерить GUID. Очереди в PHP никак - это не ява. Либо некая таблица в БД и скрипт который периодически дергаеся кроном, либо специализированная прога которую нигде на хостинге ставить не дадут. |
ладно переформулирую, как сделать в качестве id метку времени в секундах и при этом чтобы исключить совпадения таких id.
Спустя 1 час, 10 минут (23.10.2011 - 04:13) caballero написал(а):
Цитата |
ладно переформулирую, как сделать в качестве id метку времени в секундах и при этом чтобы исключить совпадения таких id. |
В секундах никак. Нужна сквозная нумерация. Можно например в одной из баз сделать общую таблицу с отдним полем на все сервера и юзать обычный автоинкремент. То есть вставлять строку получать значение и потом вставлять данные с полученным ключем куа надо
Спустя 17 часов, 37 минут, 53 секунды (23.10.2011 - 21:51) Santehnick написал(а):
Цитата (caballero @ 23.10.2011 - 01:13) | ||
В секундах никак. Нужна сквозная нумерация. Можно например в одной из баз сделать общую таблицу с отдним полем на все сервера и юзать обычный автоинкремент. То есть вставлять строку получать значение и потом вставлять данные с полученным ключем куа надо |
уже рассматривал пример с общей базой, но тогда получится опять же зависимость, чего я с самого начала и пытаюсь избежать. то есть если ляжет эта общая база, то ляжет все приложение и будет не доступно, а смысл как раз в том, чтобы если упал один сервер, то другие продолжали нормально работать. Еще пришел в голову вариант, это проверять непосредственно перед регистрацией по всем базам серверов, существует ли юзер с таким же id или нет, в любом случае также нужно будет еще проверять на уникальность логина и мыла, что думаешь ? я думаю что немного ресурсозатратно получится, но других вариантов пока нет.
Спустя 6 минут, 57 секунд (23.10.2011 - 21:58) caballero написал(а):
берешь обычный автоинкремент присоединяешь к нему спереди (как строку) номер сервера и получаешь уникальное значение
Спустя 4 часа, 35 минут, 44 секунды (24.10.2011 - 02:34) Santehnick написал(а):
Цитата (caballero @ 23.10.2011 - 18:58) |
берешь обычный автоинкремент присоединяешь к нему спереди (как строку) номер сервера и получаешь уникальное значение |
спасибо тоже вариант, но воспользуюсь все таки секундами, удобнее как-то. все равно сначала не подумал, что в любом случае придется переберать все базы, чтобы выяснить нет ли у нас уже персонажа с таким ником и мылом, за одно буду и айдишник проверять. только придется видимо автоматически закрывать регистрацию, если какой-то из серверов будет недоступным, иначе никак.