Премини към съдържанието
MrAlienBG

Въпрос за дневен лимит на коментарите

    Препоръчан отговор

    MrAlienBG    7

    Здравейте бих искал да попитам как е възможно да създам система на какъв принцип за презареждане на коментарите на цялата база данни т.е. нека обясня

    Имаме акаунт 'test' който дневно има 5 коментара как мога да направя така, че след като е останал с 0 коментара (използвам MYSQL таблица) и примерно настъпи новия ден 00:01 часа на въпросния играч коментарите да станат пак 5 ?

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове

    capnemo    43981
    преди 6 часа, MrAlienBG написа:

    Здравейте бих искал да попитам как е възможно да създам система на какъв принцип за презареждане на коментарите на цялата база данни т.е. нека обясня

    Имаме акаунт 'test' който дневно има 5 коментара как мога да направя така, че след като е останал с 0 коментара (използвам MYSQL таблица) и примерно настъпи новия ден 00:01 часа на въпросния играч коментарите да станат пак 5 ?

    Ползвате опцията за събития на mysql: https://dev.mysql.com/doc/refman/5.7/en/events-overview.html

    и нулирате съдържанието на брояча за коментари

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове
    borislav_g    1

    Бих ти предложил да ползваш lazy подход. В момента пазиш някъде броя коментари за деня и ако надвишават не позволяваш нови, нали?  Добави и колона  за деня на  последния коментар. Проверката после става нещо от типа на:

     

     

     

    if  (last_comment_day != today) {

    post_comment(); 

    comment=1

    } elseif

    (comment < max_comment) {

    post_comment();

    comment++

    } else  deny_comment()

     

    редимството тук е, че не ти се налага да ресетваш коментарите, което те лишава от невъобразимото удоволствие да закачаш пхп на крон и  да дебъгваш с мейли :)

     

     

    Редактирано от borislav_g
    7 сутринта не ми е най продуктивното време... (преглед на промените)
    • Харесва ми 1

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове
    capnemo    43981
    преди 13 минути, borislav_g написа:

    Бих ти предложил да ползваш lazy подход. В момента пазиш някъде броя коментари за деня и ако надвишават не позволяваш нови, нали?  Добави и колона  за деня на  последния коментар. Проверката после става нещо от типа на: 

    if (comment < max_comment) {

    post_comment();

    comment++

    } elseif  (last_comment_day != today) {

    post_comment(); 

    comment=1

    } else  deny_comment()

     

    редимството тук е, че не ти се налага да ресетваш коментарите, което те лишава от невъобразимото удоволствие да закачаш пхп на крон и  да дебъгваш с мейли :)

    Какъв крон, какви пет лева. По-горе дадох линк към вградените възможности на mysql. Да не говорим че това, което сте предложили ще се изпълнява при всеки нов коментар и ще тормози излишно системата, както и ще добави още данни в таблицата

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове
    borislav_g    1

    Не съм съгласен, че има допълнително затормозяване - той така или иначе вече има проверка преди всеки коментар за лимита и ъпдейт след всеки с новия брой за деня.Дали ще вади и ъпдейтва 1 или 2 колони е все тая. А колкото до допълнителната колона - 4 байта на всеки ред при 10к потребителя е 40кб - на практика пренебрежимо.

    Относно крона - на хостингите, които ползвам,  mysql events апито е една от многото благинки, които са отрязани. Алтернативата е cpanel cron.

    И пак да отбележа - давам мнение с плюсове и минуси, кое е най-подходящо за автора е негово решение.

     


    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове
    capnemo    43981
    преди 2 минути, borislav_g написа:

    Не съм съгласен, че има допълнително затормозяване - той така или иначе вече има проверка преди всеки коментар за лимита и ъпдейт след всеки с новия брой за деня.Дали ще вади и ъпдейтва 1 или 2 колони е все тая. А колкото до допълнителната колона - 4 байта на всеки ред при 10к потребителя е 40кб - на практика пренебрежимо.

    Относно крона - на хостингите, които ползвам,  mysql events апито е една от многото благинки, които са отрязани. Алтернативата е cpanel cron.

    И пак да отбележа - давам мнение с плюсове и минуси, кое е най-подходящо за автора е негово решение.

     

    ДОпълнителен товар е, защото има иф (и то външния), който всеки път проверява датата. Докато в предложеното от мен ще имате само една проверка

    Относно събитията на Mysql - това са спекулации от ваша страна и без да имате повече информация е безсмислено.

    Да не говорим че никой не казва че сктипта в крон трябва да е на php, аз мога да дразна един на шел за секунди

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове
    borovaka    286

    Дам с event scheduler-a на MySQL е най-удачно решението. Другия вариант е наистина с cron. Плюсове и минуси имат и двете.

    Ако си 100% сигурен, че ще ползваш MySQL директно давай с event scheduler-a. Но ако има идея да се сменя DB (към друга релационна или NoSQL) и ползваш ORM, можеш да се "прецакаш", ако го ползваш.

    Та можеш да ползваш нещо от сорта на: https://github.com/peppeocchi/php-cron-scheduler има и други библиотеки ( а никак не е трудно и сам да си напишеш подобна ). Които да ти управляват task-овете. По-добър вариант е отколкото да ползваш директно crontab-a, защото можеш да си напишеш някаква логика при изпълнението и да настройваш през интерфейс.

    Кое е по-бързо и кое не е - не намесвам. Просто когато трябва да се прави нещо конкретно, трябва да се избере оптимален вариант за проекта. 

    p.s.

    @borislav_g За споделен хостинг ли говориш? Защото аз лично не бих избрал никога хостинг, който ми реже такива неща.

    Редактирано от borovaka (преглед на промените)

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове
    MrAlienBG    7

    След активирането на Mysql Event Scheduler
    Евента би трябвало да е нещо от сорта на:

    Create Event ResetComments
    On Schedule Every 1 DAY
    DO
    UPDATE users SET comments='5' 

    Също така си мислих, но не знам точно как да го направя дали да не добавя при регистрацията на акаунта един генериран час, следтователно в header.php кода просто вкарвам нещо от сорта на:


    if (CalculatedTIme >= 24) (Да сравнява разликата между часовете)
    {
    SetAccountCommentTo5();
    UpdateTimeInMysql();
    }

    Въпроса ми към това е как да сравня разликата в часовете между регистъра в Mysql (например: 1443920952) и сегашното време пак в същия формат.

    Според мен втория варянт би бил по удачен, защото няма да товаря цялата база данни а при човек който е влязал в акаунта си ще проверява разликата ако е под 24 часа от регистъра няма да прави нищо а ако е над 24 ще си изпълни функцията и при следващото зареждане ще е пак под 24 часа разлика.

    EDIT:

    Също така мисля, че би намалило и товаренето на сървъра от изоставени акаунти които може да не влизат 1 месец и просто е излишно да се задават всеки ден коментари.

    Редактирано от MrAlienBG (преглед на промените)

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове
    borovaka    286

    Не си прав изобщо. Нищо не товариш с update, още повече, че при update можеш да сложиш и условие да update-ва, само активните потребители.

    Относно бързината: Много по-"бързо" е да изпълниш query през mysql server-a, който работи, отколкото да вдигаш инстанция на PHP, от там нататък да изпълняваш query към сървъра за данни и логика и да "убиеш" скрипта.
    А за "регистъра" на времето - това се нарича unix timestamp. Имаш си функции за работа с него, можеш да го обърнеш в datetime със FROM_ UNIXTIME() в mysql, в PHP имаш time() която ти връща текущото време в unix timestamp формат и можеш да го форматираш със date() при нужда имаш и DateTime обект или Carbon библиотеката ( която е по-удобна за работа и наследява DateTime).

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове
    capnemo    43981
    преди 15 минути, borovaka написа:

    Не си прав изобщо. Нищо не товариш с update, още повече, че при update можеш да сложиш и условие да update-ва, само активните потребители.

    Относно бързината: Много по-"бързо" е да изпълниш query през mysql server-a, който работи, отколкото да вдигаш инстанция на PHP, от там нататък да изпълняваш query към сървъра за данни и логика и да "убиеш" скрипта.
    А за "регистъра" на времето - това се нарича unix timestamp. Имаш си функции за работа с него, можеш да го обърнеш в datetime със FROM_ UNIXTIME() в mysql, в PHP имаш time() която ти връща текущото време в unix timestamp формат и можеш да го форматираш със date() при нужда имаш и DateTime обект или Carbon библиотеката ( която е по-удобна за работа и наследява DateTime).

    Ако трябва да сме прецизни това се нарича POSIX time, а timestamp е общ термин, независещ от формата на датата. Просто показва точното време на определено действие

    • Харесва ми 1

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове
    MrAlienBG    7

    Добре значи, пробвах доста начини по които нито един от тях не се получи, със date,mktime взима часа на потребителя които може да симулира час на собствения си компютър примерно timestamp-а в Базата данни е за днес 28.12.2015г 12:34:00 обаче потребителя може да си направи часа на 30.12.2015г 12:34:00 например.. и така ще симулира автоматично задна врата в скрипта.

    Бих искал да помоля споменахте,че това е възможно да се направи по лесно в Мусял може ли да ми обясните как мога да настроя тази функция.

    Прилагам снимка как изглежда базата ми данни.

    comments = Оставащи коментари за писане.
    date = Последния час/дата на получените коментари

    Благодаря предварително, Поздрави Румен Димитров.

    NvfEFol.png

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове
    capnemo    43981
    преди 5 часа, MrAlienBG написа:

    Добре значи, пробвах доста начини по които нито един от тях не се получи, със date,mktime взима часа на потребителя които може да симулира час на собствения си компютър примерно timestamp-а в Базата данни е за днес 28.12.2015г 12:34:00 обаче потребителя може да си направи часа на 30.12.2015г 12:34:00 например.. и така ще симулира автоматично задна врата в скрипта.

    Бих искал да помоля споменахте,че това е възможно да се направи по лесно в Мусял може ли да ми обясните как мога да настроя тази функция.

    Прилагам снимка как изглежда базата ми данни.

    comments = Оставащи коментари за писане.
    date = Последния час/дата на получените коментари

    Благодаря предварително, Поздрави Румен Димитров.

    NvfEFol.png

    времето трябва да го взимате само от сървъра. И трябва да записвате времето на първия коментар, не на последния.

    Като цяло се замислете да пуснете примерно в полунощ нещо, което за нулира боря на коментарите, така както вие подхождате е много по-комплицирано

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове
    MrAlienBG    7
    преди 1 час, capnemo написа:

    времето трябва да го взимате само от сървъра. И трябва да записвате времето на първия коментар, не на последния.

    Като цяло се замислете да пуснете примерно в полунощ нещо, което за нулира боря на коментарите, така както вие подхождате е много по-комплицирано

    При създаване на профила се генерира едно време. от него време след 24 часа коментарите се рестартират АКО потребителя логне след точно 24 часа, ако влезе примерно след 30 часа, времето ще се промени примерно на времето регистрацията + 30 часа и от резултата ще трябва пак 24 часа да минат за да се рестартира, това е с цел за изоставените профили, които може да не влизат 150 часа и излишно да се рестартират редовете им в Мусял, това е с цел да не натоварвам сървъра излишно. в случая въпроса ми е как мога да взимам времето от Сървъра вместо времето от PC на потребителя? 

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове
    borovaka    286

    Ти в PHP със time() си го взимаш времето от сървъра. Както и в MySQL now() ти връща времето на сървъра.

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове
    capnemo    43981
    Току що, MrAlienBG написа:

    При създаване на профила се генерира едно време. от него време след 24 часа коментарите се рестартират АКО потребителя логне след точно 24 часа, ако влезе примерно след 30 часа, времето ще се промени примерно на времето регистрацията + 30 часа и от резултата ще трябва пак 24 часа да минат за да се рестартира, това е с цел за изоставените профили, които може да не влизат 150 часа и излишно да се рестартират редовете им в Мусял, това е с цел да не натоварвам сървъра излишно. в случая въпроса ми е как мога да взимам времето от Сървъра вместо времето от PC на потребителя? 

    Вие май не разбрахте какво ви казвам. Моля, опитайте се да го осмислите. Ресетвайте коментарите в полунощ, независимо от последното време на логване на потребителя. И нормалните функции на php ще вземат времето на сървъра

    • Харесва ми 1

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове
    borovaka    286
    преди 29 минути, MrAlienBG написа:

    При създаване на профила се генерира едно време. от него време след 24 часа коментарите се рестартират АКО потребителя логне след точно 24 часа, ако влезе примерно след 30 часа, времето ще се промени примерно на времето регистрацията + 30 часа и от резултата ще трябва пак 24 часа да минат за да се рестартира, това е с цел за изоставените профили, които може да не влизат 150 часа и излишно да се рестартират редовете им в Мусял, това е с цел да не натоварвам сървъра излишно. в случая въпроса ми е как мога да взимам времето от Сървъра вместо времето от PC на потребителя? 

    https://stackoverflow.com/questions/5099893/update-a-value-using-mysql-events Разгледай това. Едно от първите търсения в google

    • Харесва ми 1

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове
    MrAlienBG    7

    Искам да попитам дали mysql сървъра ми би се затормозил много. Използвах таблица "realtime" с колони "id,rtime"

    ID е просто примерно, rtime е сегашното време, използвам следния синтаксис??

    CREATE EVENT IF NOT EXISTS update_time
    ON SCHEDULE EVERY 1 SECOND
    DO
      UPDATE realtime SET rtime=rtime+1 WHERE id=1;

     

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове
    capnemo    43981
    преди 3 минути, MrAlienBG написа:

    Искам да попитам дали mysql сървъра ми би се затормозил много. Използвах таблица "realtime" с колони "id,rtime"

    ID е просто примерно, rtime е сегашното време, използвам следния синтаксис??

    
    CREATE EVENT IF NOT EXISTS update_time
    ON SCHEDULE EVERY 1 SECOND
    DO
      UPDATE realtime SET rtime=rtime+1 WHERE id=1;

     

    Това ще товари, ще се изпълнява всяка секунда. Въпроса е имате ли нужда от изпълнение всяка секунда. И има ли въобще смисъл (в логиката на програмата) от това да ъпдейтвате тази клетка толкова често

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове
    MrAlienBG    7
    $seconds = strtotime($TimeNow) - strtotime($mysqlTime);
    $hours = floor($seconds / 60 /  60);
    
    if($hours >= 24)
    {
    #Рестартира коментарите на човека.

    $TimeNow взима данни от базата данни точно това rtime от новата таблица другото е времето от акаунта на човека, сравнява ги и ако имат 24 разлика или повече рестартира коментарите и замества $TimeNow в таблицата на акаунта на потребителя където е датата.


    EDIT: Предполагам мога да променя таймера да ъпдейтва на 15 минути времето, но не знам защото така ще има забавяне на сървъра 

    Редактирано от MrAlienBG (преглед на промените)

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове
    capnemo    43981
    Току що, MrAlienBG написа:
    
    $seconds = strtotime($TimeNow) - strtotime($mysqlTime);
    $hours = floor($seconds / 60 /  60);
    
    if($hours >= 24)
    {
    #Рестартира коментарите на човека.

    $TimeNow взима данни от базата данни точно това rtime от новата таблица другото е времето от акаунта на човека, сравнява ги и ако имат 24 разлика или повече рестартира коментарите и замества $TimeNow в таблицата на акаунта на потребителя където е датата.

    Логиката ви е грешна, това ще ресетне стойността ако от последното действие на потребителя са минали 24 часа. И нека го напиша за трети път: идеята е за 24 часа човек да има брой коментари. Т.е. времето се брои от ПЪРВИЯ пост, не от последния. В момента в който брояча за потребител е 0 и той въведе пост вие записвате времето в клетката и него пипате.

    И вместо делене не е ли по-лесно да направите така:

    $seconds = strtotime($TimeNow) - strtotime($mysqlTime);
    
    if($seconds >= 86400)
    {
    #Рестартира коментарите на човека.

     

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове
    borovaka    286

    Просто ползвай нещо от сорта на:

    CREATE EVENT IF NOT EXISTS test_shit_event
    ON SCHEDULE EVERY 1 DAY
    STARTS CURRENT_DATE() + INTERVAL 23 HOUR + INTERVAL 59 MINUTE + INTERVAL 1 DAY
    DO
    	QUERY-то ти

    Като това ще ти изпълнява въпросното query всеки ден в 23:59. А самото query може да е нещо от сорта на:

    UPDATE `users` SET `limit` = 5 WHERE `active` = 1 AND `limit` != 5

     

    п.с. @capnemo или някой друг, ако може да погледне все пак query-то, което давам, че съм на няколко бири и доста път днес и може да пиша глупости, но към момента ми се струва достоверно :) 

    Ако лъжа се извинявам.

    Редактирано от borovaka (преглед на промените)
    • Харесва ми 1

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове
    MrAlienBG    7
    преди 1 минута, capnemo написа:

    Логиката ви е грешна, това ще ресетне стойността ако от последното действие на потребителя са минали 24 часа. И нека го напиша за трети път: идеята е за 24 часа човек да има брой коментари. Т.е. времето се брои от ПЪРВИЯ пост, не от последния. В момента в който брояча за потребител е 0 и той въведе пост вие записвате времето в клетката и него пипате.

    И вместо делене не е ли по-лесно да направите така:

    
    $seconds = strtotime($TimeNow) - strtotime($mysqlTime);
    
    if($seconds >= 86400)
    {
    #Рестартира коментарите на човека.

     

    Сякаш най ми допада вашия метод, ще опитам с него. дано да се получи...

    преди 6 минути, capnemo написа:

    Логиката ви е грешна, това ще ресетне стойността ако от последното действие на потребителя са минали 24 часа. И нека го напиша за трети път: идеята е за 24 часа човек да има брой коментари. Т.е. времето се брои от ПЪРВИЯ пост, не от последния. В момента в който брояча за потребител е 0 и той въведе пост вие записвате времето в клетката и него пипате.

    И вместо делене не е ли по-лесно да направите така:

    
    $seconds = strtotime($TimeNow) - strtotime($mysqlTime);
    
    if($seconds >= 86400)
    {
    #Рестартира коментарите на човека.

     

    По скоро идеята беше да задава 5 коментара на всички хора независимо дали са използвали коментарите си.

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове
    capnemo    43981
    преди 7 минути, borovaka написа:

    Просто ползвай нещо от сорта на:

    
    CREATE EVENT IF NOT EXISTS test_shit_event
    ON SCHEDULE EVERY 1 DAY
    STARTS CURRENT_DATE() + INTERVAL 23 HOUR + INTERVAL 59 MINUTE + INTERVAL 1 DAY
    DO
    	QUERY-то ти

    Като това ще ти изпълнява въпросното query всеки ден в 23:59. А самото query може да е нещо от сорта на:

    
    UPDATE `users` SET `limit` = 5 WHERE `active` = 1 AND `limit` != 5

     

    п.с. @capnemo или някой друг, ако може да погледне все пак query-то, което давам, че съм на няколко бири и доста път днес и може да пиша глупости, но към момента ми се струва достоверно :) 

    Ако лъжа се извинявам.

    Аз лично бих подходил с нулиране и бих я спретнал с нещо от рода:

    UPDATE `users` SET `limit` = 0 WHERE `active` = 1 AND date <= CURRENT_DATE()-86400

     

    преди 1 минута, MrAlienBG написа:

    Сякаш най ми допада вашия метод, ще опитам с него. дано да се получи...

    По скоро идеята беше да задава 5 коментара на всички хора независимо дали са използвали коментарите си.

    ТОва е и идеята по-горе, стане ли полунощ процедурата минава и нулира всички броячи

    Ако искате да нулирате когато от първия коментар са минали повече от 24 часа  (а не в полунощ на всички) ще трябва да пускате процедурата примерно всеки час (или всеки 10 минути)

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове
    MrAlienBG    7
    преди 11 минути, capnemo написа:

    Аз лично бих подходил с нулиране и бих я спретнал с нещо от рода:

    
    UPDATE `users` SET `limit` = 0 WHERE `active` = 1 AND date <= CURRENT_DATE()-86400

     

    ТОва е и идеята по-горе, стане ли полунощ процедурата минава и нулира всички броячи

    Ако искате да нулирате когато от първия коментар са минали повече от 24 часа  (а не в полунощ на всички) ще трябва да пускате процедурата примерно всеки час (или всеки 10 минути)

    Сега излезе друг проблем използвам

    CREATE EVENT IF NOT EXISTS update_users
    ON SCHEDULE EVERY 1 DAY
    STARTS CURRENT_DATE() + INTERVAL 23 HOUR + INTERVAL 59 MINUTE + INTERVAL 1 DAY
    DO
    UPDATE `users` SET `comments` = 5 ,`date` = current_timestamp WHERE active=1
    

    Обаче ми изкарва винаги "2147483647" в полето date което в действителност е:

    GMT: Tue, 19 Jan 2038 03:14:07 GMT
    Your time zone: 19.01.2038 г., 4:14:07 GMT+1:00

    И винаги ми показва това, не се променя вмомента го тествам да прави функцията на всеки 15 секунди но не се променя.

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове
    capnemo    43981
    преди 1 минута, MrAlienBG написа:

    Сега излезе друг проблем използвам

    
    CREATE EVENT IF NOT EXISTS update_users
    ON SCHEDULE EVERY 1 DAY
    STARTS CURRENT_DATE() + INTERVAL 23 HOUR + INTERVAL 59 MINUTE + INTERVAL 1 DAY
    DO
    UPDATE `users` SET `comments` = 5 ,`date` = current_timestamp WHERE active=1

    Обаче ми изкарва винаги "2147483647" в полето date което в действителност е:

    GMT: Tue, 19 Jan 2038 03:14:07 GMT
    Your time zone: 19.01.2038 г., 4:14:07 GMT+1:00

    И винаги ми показва това, не се променя вмомента го тествам да прави функцията на всеки 15 секунди но не се променя.

    Проверете дали времето на компютъра ви е вярно и дали правите правилните преобразувания на датата в позикс формат

    Сподели този отговор


    Линк към този отговор
    Сподели в други сайтове

    Регистрирайте се или влезете в профила си за да коментирате

    Трябва да имате регистрация за да може да коментирате това

    Регистрирайте се

    Създайте нова регистрация в нашия форум. Лесно е!

    Нова регистрация

    Вход

    Имате регистрация? Влезте от тук.

    Вход


    ×

    Информация

    Този сайт използва бисквитки (cookies), за най-доброто потребителско изживяване. С използването му, вие приемате нашите Условия за ползване.