|
|
|
Счетчик посещений сайта на postgres
|
|||
|---|---|---|---|
|
#18+
Пишу самый простой счетчик посещений сайта используя куки, сохраняю все данные просто обновляя значения посещений в БД, если правильно понимаю нужна блокировка, чтобы не было параллельных обновлений и не терялись записи о посетителях. Саму блокировку сделал, но непонятно что делать с первой записью за день, когда делаю Insert первых значений для счетчка, этот инсерт тоже нужно как то защитить от проблем с параллельными запросами но немогу понять как, подскажите решение. Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. структура БД Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 20:06:38 |
|
||
|
Счетчик посещений сайта на postgres
|
|||
|---|---|---|---|
|
#18+
trom, ну кто так пишет? Вот так надо: Код: php 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 21:30:10 |
|
||
|
Счетчик посещений сайта на postgres
|
|||
|---|---|---|---|
|
#18+
trom Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. КГ/АМ. Короче делается это так: INSERT INTO enumerator .... Если не сработало, то: UPDATE enumerator SET views = views + 1, hosts = hosts + 1 WHERE id = ... Это в тупую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 22:13:52 |
|
||
|
Счетчик посещений сайта на postgres
|
|||
|---|---|---|---|
|
#18+
Ёш , автор$res = pg_query_params( $pgsql_conn, 'select enumerator.add($1, $2, $3)', [$site_id, $id, $create_date] ); Выдает ошибку Warning: pg_query_params(): Query failed: ОШИБКА: схема "enumerator" не существует pg_query_params лучше чем pg_query но грамотно составить синтаксис запроса я не смог. Warstone, Конечно вы правы надо время вызывать так Код: php 1. исправил авторА все это говно в одном запросе сделать, видимо нельзя. Использовать SELECT FOR UPDATE вместо блокировки pg_try_advisory_lock или о чем речь ? я читал что pg_try_advisory_lock лучше Но по главному вопросу все так и осталось не понятно! Код: sql 1. 2. Как понять что не сработало ?? инсерт всегда будет вставлять запись в таблицу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 09:36:15 |
|
||
|
Счетчик посещений сайта на postgres
|
|||
|---|---|---|---|
|
#18+
trom Ёш , автор$res = pg_query_params( $pgsql_conn, 'select enumerator.add($1, $2, $3)', [$site_id, $id, $create_date] ); Выдает ошибку Warning: pg_query_params(): Query failed: ОШИБКА: схема "enumerator" не существует pg_query_params лучше чем pg_query но грамотно составить синтаксис запроса я не смог. <...> "м,тд?" (сс) расшифрую, в таком разе, за йоша: надо написать хранимку enumerator.add. И передать туда параметры, способом, предотвращающим скл-инжекцию. если не писать хранимку (что можно, но менее симпатично), то что-то в стиле Код: php 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 10:25:27 |
|
||
|
Счетчик посещений сайта на postgres
|
|||
|---|---|---|---|
|
#18+
qwwq, Спасибо работает, теперь я знаю как использовать pg_query_params давно не мог разобраться Но это не ответ на главный вопрос как не допустить возможного дублирования insert в начале работы счетчика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 11:15:29 |
|
||
|
Счетчик посещений сайта на postgres
|
|||
|---|---|---|---|
|
#18+
tromqwwq, Спасибо работает, теперь я знаю как использовать pg_query_params давно не мог разобраться Но это не ответ на главный вопрос как не допустить возможного дублирования insert в начале работы счетчика. 1. нопейсать хранимку. 1.0. засунуть адвайзери локинг туда, где он должен быть -- в память на будущее, для организации очередей джобов типа мейлеров [или автономностей]. 1.1. а тут навесить нужное уникью и обрабатывать exception insert-a [OR NOT FOUND update-a]. все впоросы в RTFM 1.1.1. ссылки на RTFM отсюда (тут поиск например по "UPSERT" ). самое простое (но, тащемто, неверное) Код: sql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 11:27:10 |
|
||
|
Счетчик посещений сайта на postgres
|
|||
|---|---|---|---|
|
#18+
trom, Warstone же Вам написал как, ловите ошибку при дублировании и делайте после неё вместо insert - update. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 11:27:16 |
|
||
|
Счетчик посещений сайта на postgres
|
|||
|---|---|---|---|
|
#18+
qwwqtromqwwq, Спасибо работает, теперь я знаю как использовать pg_query_params давно не мог разобраться Но это не ответ на главный вопрос как не допустить возможного дублирования insert в начале работы счетчика. 1. нопейсать хранимку. 1.0. засунуть адвайзери локинг туда, где он должен быть -- в память на будущее, для организации очередей джобов типа мейлеров [или автономностей]. 1.1. а тут навесить нужное уникью и обрабатывать exception insert-a [OR NOT FOUND update-a]. все впоросы в RTFM 1.1.1. ссылки на RTFM отсюда (тут поиск например по "UPSERT" ). самое простое (но, тащемто, неверное) Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 11:28:37 |
|
||
|
Счетчик посещений сайта на postgres
|
|||
|---|---|---|---|
|
#18+
qwwq, авторWITH up AS (UPDATE blahblahblah RETUTNING key) INSERT INTO blahblahblah SELECT blah,blah,blah WHERE (SELECT count(1) FROM up) =0; А можно пример без blahblahblah а с моими данными, чтобы стало понятно так же как с pg_query_params Гость_0 авторtrom, Warstone же Вам написал как, ловите ошибку при дублировании и делайте после неё вместо insert - update. update чего делать ? делать инсерт потом селект если обнаружилось две записи одну удалять, вот это более менее понятная схема, но тоже по моему не очень. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 11:52:17 |
|
||
|
Счетчик посещений сайта на postgres
|
|||
|---|---|---|---|
|
#18+
tromqwwq, авторWITH up AS (UPDATE blahblahblah RETUTNING key) INSERT INTO blahblahblah SELECT blah,blah,blah WHERE (SELECT count(1) FROM up) =0; А можно пример без blahblahblah а с моими данными, чтобы стало понятно так же как с pg_query_params можно, но не нужно. сделайте хотя бы шажок сами.tromГость_0 авторtrom, Warstone же Вам написал как, ловите ошибку при дублировании и делайте после неё вместо insert - update. update чего делать ? делать инсерт потом селект если обнаружилось две записи одну удалять, вот это более менее понятная схема, но тоже по моему не очень. http://www.sql.ru/forum/actualsearch.aspx?search=exception unique_violation INSERT UPDATE FUNCTION&sin=0&bid=7&a=&ma=0&dt=-1&s=1&so=1 и там - хотя бы вот это http://www.sql.ru/forum/628082/proverka-na-nalichie-row-chtoby-update-ili-insert-into?mid=6645914&hl=exception unique_violation insert update function#6645914 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 12:01:34 |
|
||
|
Счетчик посещений сайта на postgres
|
|||
|---|---|---|---|
|
#18+
qwwq, НУ а просто схему можете описать ? Нужно создать хранимую процедуру которая будет вызываться каждый раз когда нужно обновить данные счетчика и она сама будет решать сделать ли инсерт(когда записей за день нет) или update когда записи есть так или нет ? И тогда pg_try_advisory_lock вообще не нужна ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 13:48:15 |
|
||
|
Счетчик посещений сайта на postgres
|
|||
|---|---|---|---|
|
#18+
tromupdate чего делать ? делать инсерт потом селект если обнаружилось две записи одну удалять, вот это более менее понятная схема, но тоже по моему не очень. Код: sql 1. 2. Код: sql 1. 2. 3. 4. 5. 6. PS: при большой нагрузке что бы не блокироваться на одном счётчике делают по другому, но можете сделать пока так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 14:38:28 |
|
||
|
Счетчик посещений сайта на postgres
|
|||
|---|---|---|---|
|
#18+
Ёш, Спасибо простая и рабочая схема! Я только уже свой вариант сделал Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. то есть селект делается с order by id и в случае дублирующих записей все обновления идут на первую запись, ну а если дублирующие записи случаются, то они все удаляются в цикле. Если сравнивать с Код: sql 1. 2. какой вариант более быстрый ? Просто нагрузка на счетчик может быть большой, но от самого счетчика кроме самых простых данных ничего не требуется, задача что бы было быстро и просто. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 16:57:17 |
|
||
|
Счетчик посещений сайта на postgres
|
|||
|---|---|---|---|
|
#18+
tromкакой вариант более быстрый ?Скорее все Ваш вариант с delete более быстрый, поскольку не будет бросать исключение и блокироваться на unique индексе для проверки. Нужно только починить ещё суммирование просмотров из удаляемых строк. Ещё для целостной картины не видно где UPDATE идёт. PS: Вы кстати, почти придумали второй стандартный вариант счётчиков, осталось избавиться от UPDATE :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 18:15:54 |
|
||
|
Счетчик посещений сайта на postgres
|
|||
|---|---|---|---|
|
#18+
Ёш <> PS: Вы кстати, почти придумали второй стандартный вариант счётчиков, осталось избавиться от UPDATE :)подбираете в кучки джобом ? или у вас счетчики маленькие, без подбора обходитесь ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 18:23:30 |
|
||
|
Счетчик посещений сайта на postgres
|
|||
|---|---|---|---|
|
#18+
Ёш, авторНужно только починить ещё суммирование просмотров из удаляемых строк. так я же делаю order by id все суммироваться будет в первой по id записи если конечно я правильно понимаю и не будет опять каких то проблем с параллельными запросами. авторЕщё для целостной картины не видно где UPDATE идёт. вот приведу код всего счетчика, для критики Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. авторPS: Вы кстати, почти придумали второй стандартный вариант счётчиков, осталось избавиться от UPDATE :) Это намек на хранимую процедуру ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 18:28:53 |
|
||
|
Счетчик посещений сайта на postgres
|
|||
|---|---|---|---|
|
#18+
tromавторPS: Вы кстати, почти придумали второй стандартный вариант счётчиков, осталось избавиться от UPDATE :) Это намек на хранимую процедуру ?Не, как написал qwwq, «подбирание в кучки джобом». То есть делаем только INSERT, а потом например раз в час суммируем и удаляем просуммированное. Это позволяет обойтись вообще без блокировок при инкременте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 19:10:19 |
|
||
|
Счетчик посещений сайта на postgres
|
|||
|---|---|---|---|
|
#18+
может так? Код: php 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 19:40:53 |
|
||
|
Счетчик посещений сайта на postgres
|
|||
|---|---|---|---|
|
#18+
Ёш, авторНе, как написал qwwq, «подбирание в кучки джобом». То есть делаем только INSERT, а потом например раз в час суммируем и удаляем просуммированное. Без нормального примера это сложно понять SmeL_md, Ну вроде выяснили что unique_violation медленнее чем то что я придумал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 20:51:50 |
|
||
|
Счетчик посещений сайта на postgres
|
|||
|---|---|---|---|
|
#18+
tromЁш, авторНе, как написал qwwq, «подбирание в кучки джобом». То есть делаем только INSERT, а потом например раз в час суммируем и удаляем просуммированное. Без нормального примера это сложно понять SmeL_md, Ну вроде выяснили что unique_violation медленнее чем то что я придумал нет, выяснили, что 1. вы хернёй маетесь это раз 2. что ёш хороший психолог и педагог это два 3. при этом все в проигрыше - и он не достиг целей, и вы в похабе погрязли, дальше некуда а что будет, если пара ползателей такой сеанс, с открытыми на клиенте наборами, захотят поиметь - и подумать страшно парадокс, блин ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 21:01:19 |
|
||
|
Счетчик посещений сайта на postgres
|
|||
|---|---|---|---|
|
#18+
йццй, ну и в чем проблема как надо сделать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 21:18:04 |
|
||
|
Счетчик посещений сайта на postgres
|
|||
|---|---|---|---|
|
#18+
tromйццй, ну и в чем проблема как надо сделать ? проблема в вас, очевидно вам 10 раз сказали, как надо сделать 10 раз сказали, как не надо делать а вы продолжаете на клиентский (по сути) код надрачивать. ну даже и так - - реализуйте таки ёшевский "2-й путь" , а не свою кривую альтернативу. можете "сборку кучек" из под себя запускать, раз джоб не умеете. но она должна "потоконезависимо" быть написана, т.е. не реализовываться через длинную кривую сессию/транзакцию на похабе, а , в идеале, быть одним самосогласованным стейтментом, типа. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2014, 10:51:41 |
|
||
|
Счетчик посещений сайта на postgres
|
|||
|---|---|---|---|
|
#18+
tromSmeL_md, Ну вроде выяснили что unique_violation медленнее чем то что я придумал То что вы придумали намного медленнее моего варианта :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2014, 12:22:53 |
|
||
|
|

start [/forum/topic.php?fid=53&fpage=132&tid=1998841]: |
0ms |
get settings: |
12ms |
get forum list: |
9ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
45ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
| others: | 223ms |
| total: | 359ms |

| 0 / 0 |
