[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Организация очереди в php
Santehnick
товарищи, вот возникла необходимость создания очереди, подобной тому, как в windows, т.е. операции обрабатываются постепенно, сначала обрабатываем одну, затем следующую и т.д. Мне нужно это для того, потому что я собираюсь в качестве идентификатора пользователя использовать метку времени (в секундах прошедших с начала эпохи unix), проще говоря сгенерированную функцией time(). Это нужно для того, чтобы организовать в будущем свободное перемещение пользователей по серверам, т.е. на каждом сервере будет своя база данных со своими пользователями и т.д., получается что обычным auto_increment тут не отделаться. В голову пришло два решения, первое это простое, добавить к этой метке времени еще какое-нибудь рандомное число из 4 цифр например, но мне не нравится, так как увеличит id еще аж на 4 символа и в базе придется использовать тип поля bigint, вместо int, в общем не нравится такое решение и всё. Другое более элегантное это так называемая очередь, но сколько не пытался гуглить на эту тему, ничего толкового не нашел. может кто знает и поделится на секретные источники информации как написать очередь на php или просто тут в доступной форме объяснит все ньюансы и как должно быть такое устроено. Теперь для чего в принципе мне нужна эта очередь, казалось бы записывай в качестве id метку времени и всё, но дело в том что например при регистрации может случиться такое, что в одну секунду несколько человек нажмут регистрация и случится так, что у всех этих нескольких человек будут одинаковые id, что не допустимо.

Теперь как я вижу, данную реализацию, возможно что неправильно себе представляю, прошу открыть глаза в случае чего. Значит так, регистрация пользователей происходит на одном сервере, на этом сервере в базе данных мы создаем таблицу очереди, полностью идентичную обычной таблице юзеров (ну там логин/пасс/мыло и т.д.). При нажатии кнопки регистрации, мы в этой таблице очереди создаем новую строку с данными (логин/пасс/мыло), дальше наш скрипт циклом перебирает каждую запись из таблицы очереди и в цикле непосредственно уже запускается функция регистрации которая регистрирует пользователя в таблицу юзеров, сразу после этой операции, удаляем эту строку из таблицы очереди и пишем sleep(1) и скрипт переходит к следующей записи из таблицы очереди. Будет ли такое работать или нет ? Просто вот если в одну секунду обратятся к скрипту 10 запросов, то скрипт и выполнится 10 раз, причем в один и тот же момент, соответственно ничего не изменится и все зарегистрируются с одним и тем же идентификатором sad.gif как поступить ? спасите и помогите.

P.S. Постарался описать все подробно, в чем суть проблемы, чтобы не было вопросов "а зачем тебе это" и т.д. Мне бы хоть какой-то материал на русском, где можно посмотреть как пишут такие очереди на php. всё перекопал, не нашел ничего sad.gif

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, вместо int, в общем не нравится такое решение и всё.

Вообще то если руководствоватся критериями нравится/не нравится вместо правильно и неправильно то задавать вопросы кагбэ не имеет смысла.

В чем проблемма с 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 метку времени в секундах и при этом чтобы исключить совпадения таких id.

В секундах никак. Нужна сквозная нумерация. Можно например в одной из баз сделать общую таблицу с отдним полем на все сервера и юзать обычный автоинкремент. То есть вставлять строку получать значение и потом вставлять данные с полученным ключем куа надо

уже рассматривал пример с общей базой, но тогда получится опять же зависимость, чего я с самого начала и пытаюсь избежать. то есть если ляжет эта общая база, то ляжет все приложение и будет не доступно, а смысл как раз в том, чтобы если упал один сервер, то другие продолжали нормально работать. Еще пришел в голову вариант, это проверять непосредственно перед регистрацией по всем базам серверов, существует ли юзер с таким же id или нет, в любом случае также нужно будет еще проверять на уникальность логина и мыла, что думаешь ? я думаю что немного ресурсозатратно получится, но других вариантов пока нет.

Спустя 6 минут, 57 секунд (23.10.2011 - 21:58) caballero написал(а):
берешь обычный автоинкремент присоединяешь к нему спереди (как строку) номер сервера и получаешь уникальное значение

Спустя 4 часа, 35 минут, 44 секунды (24.10.2011 - 02:34) Santehnick написал(а):
Цитата (caballero @ 23.10.2011 - 18:58)
берешь обычный автоинкремент присоединяешь к нему спереди (как строку) номер сервера и получаешь уникальное значение

спасибо тоже вариант, но воспользуюсь все таки секундами, удобнее как-то. все равно сначала не подумал, что в любом случае придется переберать все базы, чтобы выяснить нет ли у нас уже персонажа с таким ником и мылом, за одно буду и айдишник проверять. только придется видимо автоматически закрывать регистрацию, если какой-то из серверов будет недоступным, иначе никак.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.