1 Востаннє редагувалося Monolith (02.01.2016 10:27:18)

Тема: Демон на PHP

Всіх з 2016-м!  *HI*
Хочу найближчим часом почати розробку невеличкої браузерної гри на HTML/CSS/JS + PHP/MySQL. Зараз під-учую все. Виникло питання, можливо трохи дурне. Є демон на PHP, в ньому прописано, що він повинен через інтервал часу або в конкретний момент обчислювати, наприклад, кількість ресурсів. Це все зрозуміло: рахує скільки не було гравця, помножує на кількість ресурсів які видобули за інтервал часу, додає до старого значення в БД чи ще якось там... Мені цікаво, цей скрипт буде виконуватися для кожного користувача(гравця) окремо чи цю властивість якось треба прописувати. Мені це важливо бо у моїй грі буде щось на подобі віртуального світі або ZPG чи що... І коли гравець закрив браузер, його герой продовжує "качатися", заробляти досвід тощо. І цікаво як це реалізувати. Наскільки зрозумів написати демон. Чи треба у цьому скрипті написати загальний код який буде брати кожного гравця по-черзі і робити потрібні обчислення чи як? Підкажіть будь ласка.  :)

Подякували: 221VOLT1

2

Re: Демон на PHP

А cron чим не вгодив?

Подякували: Monolith, 221VOLT2

3

Re: Демон на PHP

Sensetivity написав:

А cron чим не вгодив?

в мене питання в іншому(хоча можливо це я сам просто не до кінця щось зрозумів): щоб цей скрипт працював для кожного користувача окремо треба щось спеціально прописувати?

4

Re: Демон на PHP

Для кожного користувача - це Ви маєте написати скрипт,який буде виконувати дії для кожного користувача по його ID, а cron його буде виконувати.

Подякували: Monolith, 221VOLT2

5 Востаннє редагувалося koala (02.01.2016 10:51:38)

Re: Демон на PHP

А нащо? Гравець закрив браузер - в базі лишилися останні показники (скажімо, досвід X, швидкість набуття досвіді dX на момент часу t1). Гравець за годину в момент t2 відкрив браузер - основний скрипт дивиться: гравця не було t2-t1 часу, це більше, ніж за нормальний період оновлення онлайн (скажімо, 2 хв), за цей час було зароблено dX*(t2-t1) досвіду, отже, оновлюємо дані: досвід X+dX*(t2-t1), швидкість (залежно від рівня, роду завдань і т.д.) dX1, момент часу t2, і одразу показуємо це гравцеві.
А навіщо посередині цієї години щось запускати?

Подякували: Monolith, leofun012

6 Востаннє редагувалося Monolith (02.01.2016 10:57:08)

Re: Демон на PHP

koala написав:

А нащо? Гравець закрив браузер - в базі лишилися останні показники (скажімо, досвід X, швидкість набуття досвіді dX на момент часу t1). Гравець за годину в момент t2 відкрив браузер - основний скрипт дивиться: гравця не було t2-t1 часу, це більше, ніж за нормальний період оновлення онлайн (скажімо, 2 хв), за цей час було зароблено dX*(t2-t1) досвіду, отже, оновлюємо дані: досвід X+dX*(t2-t1), швидкість (залежно від рівня, роду завдань і т.д.) dX1, момент часу t2, і одразу показуємо це гравцеві.
А навіщо посередині цієї години щось запускати?

Така специфіка гри, що герой сам без впливу зі сторони користувача виконує квести тощо. І найголовніше у віртуальному світі все залежне. Тобто наприклад твій герой вбив монстра, другий герой, коли буде проходити повз побачить вже труп монстра. Я вже більш-менш продумав як реалізувати це все. Єдине питання залишилося с демоном...

7

Re: Демон на PHP

koala написав:

А нащо? Гравець закрив браузер - в базі лишилися останні показники (скажімо, досвід X, швидкість набуття досвіді dX на момент часу t1). Гравець за годину в момент t2 відкрив браузер - основний скрипт дивиться: гравця не було t2-t1 часу, це більше, ніж за нормальний період оновлення онлайн (скажімо, 2 хв), за цей час було зароблено dX*(t2-t1) досвіду, отже, оновлюємо дані: досвід X+dX*(t2-t1), швидкість (залежно від рівня, роду завдань і т.д.) dX1, момент часу t2, і одразу показуємо це гравцеві.
А навіщо посередині цієї години щось запускати?

Мається на увазі,що cron скрипт наприклад вбиватиме монстрів. І якщо під час виконання в 12:05 мій персонаж його вб'є. То всі юзери мають побачити,шо вбив я і саме в 12:05,навіть коли я офлайн. Бо може бути,що всі юзери офлайн і "не виконає" основний скрипт.

Подякували: 221VOLT1

8

Re: Демон на PHP

misha_bondar_2012 написав:
koala написав:

А нащо? Гравець закрив браузер - в базі лишилися останні показники (скажімо, досвід X, швидкість набуття досвіді dX на момент часу t1). Гравець за годину в момент t2 відкрив браузер - основний скрипт дивиться: гравця не було t2-t1 часу, це більше, ніж за нормальний період оновлення онлайн (скажімо, 2 хв), за цей час було зароблено dX*(t2-t1) досвіду, отже, оновлюємо дані: досвід X+dX*(t2-t1), швидкість (залежно від рівня, роду завдань і т.д.) dX1, момент часу t2, і одразу показуємо це гравцеві.
А навіщо посередині цієї години щось запускати?

Така специфіка гри, що герой сам без впливу зі сторони користувача виконує квести тощо. І найголовніше у віртуальному світі все залежне. Тобто наприклад твій герой вбив монстра, другий герой, коли буде проходити повз побачить вже труп монстра. Я вже більш-менш продумав як реалізувати це все. Єдине питання залишилося с демоном...

Формуєте список персонажів оффлайн. Крон дивиться цей список і виконує ті чи інші дії які прописані для персонажу коли той оффлайн.

Подякували: Monolith1

9 Востаннє редагувалося Monolith (02.01.2016 13:42:58)

Re: Демон на PHP

Sensetivity написав:

Формуєте список персонажів оффлайн. Крон дивиться цей список і виконує ті чи інші дії які прописані для персонажу коли той оффлайн.

Ага, зрозуміло. Буду рити тоді у цього напрямку... Дякую!  :)
І ще одне питання: якщо скрипт на PHP вічний.Тобто не викликається командою через деякий час, а виконується постійно, чи не буде це сильно навантажувати сервер и чи взагалі це нормально?

10

Re: Демон на PHP

І ще одне маленьке питання. Виходить, що з-за жанру моєї гри все буде відбуватися автономно(прокачка тощо). Тобто один файл буде перебирати кожного гравця и робити для нього якісь дії. Це нормально? Чи не буде все дико лагати та завантажувати сервер?

11

Re: Демон на PHP

Якщо ви на звичайному хостингу, а не на виділеному сервері, то в більшості випадків час виконання скрипту обмежений до 30 сек. Наперед скажу,що різні set_time_limit() та ini_set() не допоможуть.

Подякували: leofun01, Monolith2

12

Re: Демон на PHP

misha_bondar_2012 написав:
Sensetivity написав:

Формуєте список персонажів оффлайн. Крон дивиться цей список і виконує ті чи інші дії які прописані для персонажу коли той оффлайн.

Ага, зрозуміло. Буду рити тоді у цього напрямку... Дякую!  :)
І ще одне питання: якщо скрипт на PHP вічний.Тобто не викликається командою через деякий час, а виконується постійно, чи не буде це сильно навантажувати сервер и чи взагалі це нормально?

Якщо в скрипті якийсь while (true) то буде.

Усе інше залежить від архітектури БД (наявністю правильних індексів), кількості гравців у списку для обробки, тощо.

Можна розбивати завдання на кілька частин. І просто частіше викликати скріпт, скажімо не кожні 5хв, а кожні 2хв. І за раз обробляти половину.

Подякували: Monolith1

13 Востаннє редагувалося Monolith (02.01.2016 14:34:04)

Re: Демон на PHP

VTrim написав:

Якщо ви на звичайному хостингу, а не на виділеному сервері, то в більшості випадків час виконання скрипту обмежений до 30 сек. Наперед скажу,що різні set_time_limit() та ini_set() не допоможуть.

Зрозуміло. Тоді краще викликати його кожну секунду, виходить?

14

Re: Демон на PHP

misha_bondar_2012 написав:
VTrim написав:

Якщо ви на звичайному хостингу, а не на виділеному сервері, то в більшості випадків час виконання скрипту обмежений до 30 сек. Наперед скажу,що різні set_time_limit() та ini_set() не допоможуть.

Зрозуміло. Тоді краще викликати його кожу секунду, виходить?

Прихований текст

Створіть той скрипт та поставте браузер на автоооновлення :D

Подякували: Monolith1

15 Востаннє редагувалося Monolith (02.01.2016 14:33:52)

Re: Демон на PHP

VTrim написав:
misha_bondar_2012 написав:
VTrim написав:

Якщо ви на звичайному хостингу, а не на виділеному сервері, то в більшості випадків час виконання скрипту обмежений до 30 сек. Наперед скажу,що різні set_time_limit() та ini_set() не допоможуть.

Зрозуміло. Тоді краще викликати його кожну секунду, виходить?

Прихований текст

Створіть той скрипт та поставте браузер на автоооновлення :D

:D

16

Re: Демон на PHP

misha_bondar_2012 написав:

Така специфіка гри, що герой сам без впливу зі сторони користувача виконує квести тощо. І найголовніше у віртуальному світі все залежне. Тобто наприклад твій герой вбив монстра, другий герой, коли буде проходити повз побачить вже труп монстра. Я вже більш-менш продумав як реалізувати це все. Єдине питання залишилося с демоном...

Тоді завдання суперечить філософії PHP. PHP, нагадаю, це PHP Hypertext Preprocessor, а в ранніх редакціях - Personal HomePage. Кожен скрипт PHP обробляє запит, дає відповідь і помирає. А у вас щось, що постійно працює. Звісно, PHP - це Тьюрінг-повна мова програмування, на ній можна робити що завгодно, але є зручніші мови для такого завдання.
Зрештою, можна рухати ваш сервісний процес при надходженні запитів від гравців. Тобто перед тим, як відповісти гравцеві, обчислюється, що сталося з моменту останнього запиту у всіх гравців.

Подякували: Monolith, VTrim, 221VOLT3

17 Востаннє редагувалося 221VOLT (03.01.2016 13:12:13)

Re: Демон на PHP

misha_bondar_2012 написав:

І ще одне питання: якщо скрипт на PHP вічний.Тобто не викликається командою через деякий час, а виконується постійно, чи не буде це сильно навантажувати сервер и чи взагалі це нормально?

варіант такий (php while true) звичайно існує,
проте він малопродуктивний\малоефективний, зхильний до збоїв, зїсть вам купу памяті, впаде коли вам це буде ой як не потрібно...
"php born to die"

по темі -- як це роблять у іграх --
1) всі події "складають" у окрему табличку бд,
2) окремий скрипт їх обробляє по-черзі,
3) скрипт запускають через певні проміжки часу (в залежності від потрібності - чи кожні 5хв, чи кожну секунду)

по першому пункту - потрібно визначитися стосовно порядку подій, найменьшої неділимої частки часу --
для прикладу у браузерці "війна племен" - при відправленні армії враховуються й мілісекунди,
а у травіані - лише секунди, при цьому якщо в одну і ту ж секунду у одне і те ж поселення приходять дві чи більше різних армій -- першою прийде та армія, яка першою(раніше) вийшла по часу сервера

по другому пункту - там усе просто, дістається з бд і рахується (можна ще не у бд складати а тримати у оперативці - редіс, мемкеш etc -- то вже залежить від того що ви вирішите встановлювати на своєму сервері, на простому хостингу можна сказати - без варіантів - mysql)

по 3му пункту -- деякі розробники за умови відсутності крону і небажаючи користувати сторонніми сервісами - запускають такий скрипт при кожному чиху кожного активного користувача, що не є ефективно при наявності великої кількості активних користувачів та малому часу періодичності запуску скрипта,,
хоча за умови не самого маленького періоду (наприклад, 5хв) - можна записувати в бд час наступного запуску - timestamp now+ 5 хвилин і запускати скрипт, а далі - перевіряти чи timestamp now меньше за час який ми зберегли у бд,,
за умови маленького періоду часу - секунда -дві --- потрібно або cron, або скористатися для даної задачі іншою мовою програмування - наприклад erlang(-like) чи іншою, яка власне оптимізована для "довгої роботи", і звідки лише запускати потрібний нам php-скрипт

можливо існують ще якісь варіанти та\або алгоритми, потрібно подумати та\або придумати  :)

як ви дивитесь на те, щоб разом попрацювати над чимось цікавим?

Подякували: Monolith1

18 Востаннє редагувалося Monolith (03.01.2016 13:30:32)

Re: Демон на PHP

221VOLT написав:
misha_bondar_2012 написав:

І ще одне питання: якщо скрипт на PHP вічний.Тобто не викликається командою через деякий час, а виконується постійно, чи не буде це сильно навантажувати сервер и чи взагалі це нормально?

варіант такий (php while true) звичайно існує,
проте він малопродуктивний\малоефективний, зхильний до збоїв, зїсть вам купу памяті, впаде коли вам це буде ой як не потрібно...
"php born to die"

по темі -- як це роблять у іграх --
1) всі події "складають" у окрему табличку бд,
2) окремий скрипт їх обробляє по-черзі,
3) скрипт запускають через певні проміжки часу (в залежності від потрібності - чи кожні 5хв, чи кожну секунду)

по першому пункту - потрібно визначитися стосовно порядку подій, найменьшої неділимої частки часу --
для прикладу у браузерці "війна племен" - при відправленні армії враховуються й мілісекунди,
а у травіані - лише секунди, при цьому якщо в одну і ту ж секунду у одне і те ж поселення приходять дві чи більше різних армій -- першою прийде та армія, яка першою(раніше) вийшла по часу сервера

по другому пункту - там усе просто, дістається з бд і рахується (можна ще не у бд складати а тримати у оперативці - редіс, мемкеш etc -- то вже залежить від того що ви вирішите встановлювати на своєму сервері, на простому хостингу можна сказати - без варіантів - mysql)

по 3му пункту -- деякі розробники за умови відсутності крону і небажаючи користувати сторонніми сервісами - запускають такий скрипт при кожному чиху кожного активного користувача, що не є ефективно при наявності великої кількості активних користувачів та малому часу періодичності запуску скрипта,,
хоча за умови не самого маленького періоду (наприклад, 5хв) - можна записувати в бд час наступного запуску - timestamp now+ 5 хвилин і запускати скрипт, а далі - перевіряти чи timestamp now меньше за час який ми зберегли у бд,,
за умови маленького періоду часу - секунда -дві --- потрібно або cron, або скористатися для даної задачі іншою мовою програмування - наприклад erlang(-like) чи іншою, яка власне оптимізована для "довгої роботи", і звідки лише запускати потрібний нам php-скрипт

можливо існують ще якісь варіанти та\або алгоритми, потрібно подумати та\або придумати  :)

як ви дивитесь на те, щоб разом попрацювати над чимось цікавим?

Дякую!Звичайно буду тільки радий.Зараз під-вчив HTML/CSS.Зараз JS вчу.На днях добре під-вчу PHP/MySQLі буду готовий до великих(на мої знання :) ) проектів. 8)

Подякували: 221VOLT1

19

Re: Демон на PHP

Демон на PHP це збочення. Звичайного крону в більшості випадків достатньо.

Подякували: Monolith, 221VOLT2