PDA

View Full Version : افزایش سرعت پاسخدهی php برای بازی آنلاین



shahabbasic
چهارشنبه 13 تیر 1397, 00:32 صبح
سلام
یک بازی آنلاین ساختم
روش کار بدین صورت هست که اطلاعات هر ثانیه درون دیتابیس mysql ذخیره میشن و اطلاعات دیگری خونده میشن و بدین ترتیب نفرات با هم بازی میکنن
پارامترها بصورت post به فایل های php ارسال میشن و منتظر جواب میمونن

حالا مشکل اینجاست که سرعت بازی کمه و اونقدری که باید باشه تا بازی روان اجرا بشه نیست و کسل کننده میشه برای بازیکنا
سرور اختصاصی داخل ایران دارم و از نظر سروری مشکل سرعت نیست

طبق بررسی که کردم دیدم همه این مشکل رو ندارند و فقط کسانیکه نتشون یه مقدار ضعیف تره به این مشکل میخورن که اتفاقا تعدادشون کم هم نیست!
حالا میخوام بپرسم چکار میشه بکنم تا سرعت پاسخدهی بره بالا؟
کلا استفاده از پروتکل http برای ساخت اینگونه بازی های آنلاین روش درستی هست یا همین موضوع باعث کند شدن سرعت شده؟؟؟

plague
چهارشنبه 13 تیر 1397, 14:21 عصر
نه php برای اینکار نیست و اینکاری که شما میکنی اصلا بهینه نیست و در صورتیکه تعداد کاربر ها از حدی بالاتر بره کلا سرورت داون میشه

سیتم الان شما مثل یه اداره پست هستش که پستچی نداره برا همین کاربرا باید هر چند ثانیه پاشن بیان اداره بپرسن که نامه دارن یا نه ... این روش کلی وقت و انرژِی کاربر و سرور رو هدر میده و خیلی کنده چون کاربر ها مرتب باید بیان تا اداره پست از خونشون و وقتی برسن چند صد نفر دیگه هم اومدن و جلوشون هستن و البته وقتی تعداد کاربرا از حدی بیشتر بشه دیگه اون اداره نمیتونه پاسخگو باشه و تعطیل میشه


شما میتونی از websocket و یه سرور nodejs استفاده کنی برای اینکه کاربر ها رو به سرور متصل نگه داری و اطلاعات رو بین همشون پخش کنی ... میتونی سیستم php رو نگه داری و فقط اون قسمت ارتباط کاربر ها و پخش دیتا بینشون رو با Nodejs انجام بدی

shahabbasic
چهارشنبه 13 تیر 1397, 22:05 عصر
شما میتونی از websocket و یه سرور nodejs استفاده کنی برای اینکه کاربر ها رو به سرور متصل نگه داری و اطلاعات رو بین همشون پخش کنی ... میتونی سیستم php رو نگه داری و فقط اون قسمت ارتباط کاربر ها و پخش دیتا بینشون رو با Nodejs انجام بدی
یعنی چجوری؟

shahabbasic
جمعه 15 تیر 1397, 17:55 عصر
راستش من وب سوکت را با کلی کلنجار رفتن بالاخره در یک نمونه کوچک (صرفا برای تست) راه اندازی کردم
اما سرعتش بیشتر از روش خودم نیست
با اینکه connection رو هم باز نگه میدارم و close نمیکنم
تفاوتی در سرعت مشاهده نشد

plague
جمعه 15 تیر 1397, 19:30 عصر
بک اند چیه ؟ هنوز با php هستش ؟

shahabbasic
جمعه 15 تیر 1397, 20:09 عصر
آره با php هست
برنامه به وب سرور متصل میشه و کانکشنش بسته نمیشه
اما بازم برای مثال در اینترنت 3g کندی مشاهده میشه

shahabbasic
جمعه 15 تیر 1397, 21:34 عصر
تفاوت این 2 روش رو دقیقا با تایمر که برنامه نویسی کردم اندازه گرفتم
هر روش رو 5 بار اجرا کردم و میانگین گرفتم تا اگر در مقاطعی سرعت نت , افت یا شتاب کرد دقیق تر بدست بیاد
برای دوستان علاقه مند نتیجه از این قراره:

>> میانگین زمان برای روش اول از ارسال رکوئست بصورت post به فایل php تا گرفتن جواب 18 میلی ثانیه
>> میانگین زمان برای روش دوم از ارسال متن (که کلاینت عنوان میکنه چه چیز میخواد از سرور) تا بازگشت پاسخ 8.2 میلی ثانیه

پس 54% روش دوم سریعتر عمل میکنه

اما بازم یجورایی حس میکنم اگر روش دوم در بازی پیاده کنم کندی از بین نمیره (در مقایسه با سایر بازی های آنلاین)

plague
جمعه 15 تیر 1397, 23:06 عصر
نحوه ارتباط کلاینت تازه یه قسمتش

من فکر میکنم با اینکه سویچ کردی رو سوکت هنوزم باز داری همونجوری از کلاینت درخواست میفرستی به سرور در حالی که همه مزیت سوکت اینه که دیگه کلاینت درخواست نفرسته به سرور بلکه خوده سرور پوش کنه داده ها رو به کلاینت ها
اگه قرار باشه همچنان بریزی تو دیتابیس بعد کلاینت ها رکوئست بفرستن به سرور و از دیتبایس بخونن که عملا همون سیستم قبلیه

اینکه من گفتم سویچ کن به وب سوکت برای این نبود که سرعتش نسبت به http بیشتره برای اینه که با وجود یه ارتباط پایدار سوکت این امکان رو میده که ساختار انتقال دیتا بین کلاین تو سرور رو متحول و بهینه کنی

shahabbasic
شنبه 16 تیر 1397, 00:05 صبح
به این موضوع فکر کردم
اما مشکل اینجاست که تعداد کاربر زیادی همزمان به سرور متصل هستن و پردازش و مدیریت اینکه چه دیتایی در کدوم بازی و برای کدوم بازیکن ارسال شده و آیا اون بازیکن موفق به دریافتش شده یا نه اولین مشکله
دومین مشکل اینه که اون فایل php رو چطور مدام در حال اجرا نگه دارم؟ cronjob که زیر یک دقیقه قبول نمیکنه اگر از حلقه بی نهایت استفاده کنم بازم به مشکل میخوره برنامه

توجه کن
بازیکن a درخواست میفرسته به سرور که حرکت بازیکن b چی بوده
اگر موفق به دریافت جواب شد درخواست میفرسته که حرکت بازیکن بعدی یعنی c چی بوده
اگر موفق به دریافت جواب نشد دوباره میگه حرکت بازیکن b چی بوده

یعنی اینجوری مطمئن میشیم که یک بازیکن حرکت رو خونده یا نه
ولی اگر قرار باشه فقط از سمت سرور ارسال بشه این موضوع قابل بررسی نیست
سرور نمیتونه بفهمه که آیا کلاینت a دیتارو بصورت سالم دریافت کرده یا خیر؟
اگر قرار باشه که اگر کلاینت دیتای سالم دریافت کرد دوباره جواب بفرسته به سرور که بله گرفتمش و سرور بخواد اینو جایی ذخیره کنه که یادش باشه بازیکن a حرکت بازیکن b رو خونده اینم که دست کمی از حالت فعلی نداره چون بازم هی کلاینت مجبوره به سرور چیزی ارسال کنه

plague
شنبه 16 تیر 1397, 00:58 صبح
اول اینکه همونجوری که گفتم php برای اینکار نیست و من هم هیچوقت با php انجامش ندادم و نمیدم که بدونم روالش چیه چون میدونم یکم ترافیک بره بالا هرروز سرور داون میشه

ببین مشکل اصلی اینه که کاربر ها باید هر 1 دقیقه (یا حالا هرچی ) بیان به سرور رکوئست بفرستن این چند تا مشکل ایجاد میکنه
اول اینکه اگه کاربر ها تعدادشون بالا بره سرور رو ddos میکنن !
دوم اینکه سر یه تایم خاصی از اتفاقات با خبر میشن نه همون لحظه ای که اتفاق افتاده مثلا شما گزاشتی هر 20 ثانیه رکوئست بفرستن به سرور این یعنی اگه یه کاربر حرکتی کرد کاربر دیگه ممکنه از 1 تا 20 ثانیه بعد با خبر بشه نه همون لحظه
سوم اینکه اینترنت کاربر رو بیخود مصرف میکنی


شما باید کاری کنی که سرور بیاد به کاربر بگه که چه اتفاقی افتاد نه اینکه کاربر ها بیان بپرسن
همون مثالی که زدم یه اداره پست بدون پستچی داری شما که باید یه پستچی استخدام کنی خودت رو راحت کنی

اینکه تو دیتبایس لاگ کنی یا از کاربر تاییدیه بگیری که یه حرکت رو دیده یانه هیچ تناسخی با این روش نداره سوکت یه ارتباط 2 طرفست همونجوری که شما میتونی برای کاربر دیتا بفرستی میتونی تاییدیه دریافت دیتا رو هم از کاربر بگیری


اگه برات سیستم مهمه و میخای حرفه ای و با سرعت انجام بشه یه برنامه نویس مسلط بهnodejs پیدا کن که یه سرور node بنویسه و با کدای PHP شما تلفیقش کنه که عملیات پخش دیتا و ارتباط کاربر ها به هم رو انجام بدمه

اگرم وقت و حالش رو داری و میتونی خودت شروع کن به یاد گرفتن و پیادش کن

vahid-p
شنبه 16 تیر 1397, 13:11 عصر
برام جای سواله چرا در مورد دیتابیس Mysql بحثی نشده؟ آیا برای چنین کاری که آنالیز خاصی نداره و بیشتر واکشی و اضافه کردن در دیتابیس هست، چرا از دیتابیس های NoSQL استفاده نشه که سرعت بالاتری در چنین مواردی دارن؟
یا تاثیرش در این تاخیر به وجود اومده خیلی کمه و آیا اندازه گیری کردید؟

plague
شنبه 16 تیر 1397, 13:26 عصر
اونم مهمه و خیلی ها سویچ میکنن رو دیتابیس هایی مثل مانگو
ولی ااین بازی ایشون ظاهران turn-base هستش و از طرفی تو سیستمی که مد نظر من هستش شما اول دیتا رو پخش میکنی بین کاربر ها و بعد میریزی تو دیتابیس ... یعنی بازی منتظر io دیتابیس نمیمونه و اون بیشتر جنبه log داره برای دیباگ سیستم

فکر میکنم با توجه به با تجربه نبودن ایشون در این ضمینه ها بهتره تمرکز رو روی دیتابیس نزارن فعلا چون چیزای زیادی رو باید یاد بگیرن و نیازه اولویت بندی کنن

shahabbasic
شنبه 16 تیر 1397, 13:33 عصر
برام جای سواله چرا در مورد دیتابیس Mysql بحثی نشده؟ آیا برای چنین کاری که آنالیز خاصی نداره و بیشتر واکشی و اضافه کردن در دیتابیس هست، چرا از دیتابیس های NoSQL استفاده نشه که سرعت بالاتری در چنین مواردی دارن؟

تاثیر این مورد در سرعت خیلی کم هست
درخواست دیر به سرور میرسه اما پردازش در سرور سریع انجام میشه و جواب باز دیر به کلاینت میرسه
پس چیزی که اشاره کردید در اون وسط قرار میگیره و خیلی کم اثره
مشکل نحوه اتصال هست

الان برای مثال با اینترنت 512 ای دی اس ال همین روش وب سوکت در هربار پاسخ دادن حدود 8 میلی ثانیه زمان میبره
اما با اینترنت 4g که سرعتش هنگام دانلود چند برابر 512 ای دی اس ال هست مدت زمان پاسخ سوکت یه بار 100 میلی ثانیه میشه یه بار 400 میلی ثانیه!
مشکل اصلی اینه

vahid-p
شنبه 16 تیر 1397, 20:36 عصر
اما با اینترنت 4g که سرعتش هنگام دانلود چند برابر 512 ای دی اس ال هست مدت زمان پاسخ سوکت یه بار 100 میلی ثانیه میشه یه بار 400 میلی ثانیه!
خب اگر دارید با سرعتی که به دست کاربر میرسه میسنجید که پینگ نقش اساسی داره و چیزی که گفتید نشون میده مشکل شما در حال حاضر با این تعداد کاربر، زمان پردازش نیست.
ولی اگر تعداد کاربرهاتون زیاد باشه، پردازش سمت سرور چون به تمام درخواست ها اضافه میشه مشکل زا است ولی پینگ ها تقریبا مستقل هستند. (منظورم از پینگ فقط ارسال و دریافت هست)
بهبود پینگ هم به جز انتخاب سرور، بقیش دست شما نیست.

shahabbasic
شنبه 16 تیر 1397, 22:12 عصر
بهبود پینگ هم به جز انتخاب سرور، بقیش دست شما نیست.
کاربر دیگری در همین تاپیک عکس حرف شما را میزند و این مشکل را ناشی از ارسال زیاد و بیهوده درخواست ها از کلاینت به سرور میداند
و با سوکتی که ایجاد کردم و زمانی که اندازه گرفتم مشخص شد دست کم از روش خودم سریعتر است
پینگ رو قبول دارم که دست من نیست ولی بهینه کردن درخواست های ارسالی کلاینت که دست خودمه
تعجبم از اینه که چطور اینترنت بی سیم (4g) نسبت به اینترنت سیمی (adsl) سرعت دانلود بالاتری دارد اما پینگ بسیار کند تری!

MRmoon
یک شنبه 17 تیر 1397, 00:16 صبح
کاربر دیگری در همین تاپیک عکس حرف شما را میزند و این مشکل را ناشی از ارسال زیاد و بیهوده درخواست ها از کلاینت به سرور میداند
و با سوکتی که ایجاد کردم و زمانی که اندازه گرفتم مشخص شد دست کم از روش خودم سریعتر است
پینگ رو قبول دارم که دست من نیست ولی بهینه کردن درخواست های ارسالی کلاینت که دست خودمه
تعجبم از اینه که چطور اینترنت بی سیم (4g) نسبت به اینترنت سیمی (adsl) سرعت دانلود بالاتری دارد اما پینگ بسیار کند تری!

پینگ ربطی به سرعت دانلود نداره.

shahabbasic
یک شنبه 17 تیر 1397, 20:29 عصر
من اگر همین روش سوکت رو بجای روش اول در بازی پیاده کنم با این توصیف که روند همون روند قبلی باشه (کلاینت ها رکوئست بفرستن) آیا شاهد افزایش سرعتی خواهم بود یا خیر؟

کامبیز اسدزاده
یک شنبه 17 تیر 1397, 21:52 عصر
سلام
یک بازی آنلاین ساختم
روش کار بدین صورت هست که اطلاعات هر ثانیه درون دیتابیس mysql ذخیره میشن و اطلاعات دیگری خونده میشن و بدین ترتیب نفرات با هم بازی میکنن
پارامترها بصورت post به فایل های php ارسال میشن و منتظر جواب میمونن

حالا مشکل اینجاست که سرعت بازی کمه و اونقدری که باید باشه تا بازی روان اجرا بشه نیست و کسل کننده میشه برای بازیکنا
سرور اختصاصی داخل ایران دارم و از نظر سروری مشکل سرعت نیست

طبق بررسی که کردم دیدم همه این مشکل رو ندارند و فقط کسانیکه نتشون یه مقدار ضعیف تره به این مشکل میخورن که اتفاقا تعدادشون کم هم نیست!
حالا میخوام بپرسم چکار میشه بکنم تا سرعت پاسخدهی بره بالا؟
کلا استفاده از پروتکل http برای ساخت اینگونه بازی های آنلاین روش درستی هست یا همین موضوع باعث کند شدن سرعت شده؟؟؟


- در صورتی که روی Php5.6 هستین از نسخه‌ی ۷ به بالا ۷.۲ استفاده کنید چون سرعتش قابل مقایسه نیست. اگر باز‌هم مشکل سرعت داشتین مشکل بر می‌گرده به منابع سرور :) منابع رو بررسی کنید که کدوم قسمت کم میاره.
- اینکه به چه روشی در دیتابیس اطلاعات رو ثبت و به روز رسانی می‌کنید خیلی مهمه! مثلا تحت معماری خاصی هست یا همینطور ارتباط مستقیم؟
- در MySQL انجین رو هم روی InnoDB تنظیم کنید.
- نمی‌خوام نظر منفی بدم اما روش اصولی برای بازی آنلاین این هست که بک اند رو با ++C بنویسید :)

shahabbasic
یک شنبه 17 تیر 1397, 23:38 عصر
مواردی که مطرح فرمودید هیچ کدام مشکل فعلی بازی نیستن!
عرض کردم که نحوه ارتباط کلاینت هایی که در یک بازی حضور دارند و نیاز هست هرکدام حرکت بازیکن دیگر را از سرور دریافت کند مشکل اصلی است

plague
دوشنبه 18 تیر 1397, 13:53 عصر
اگه همین روش رو بری فقط سویچ کنی رو وب سوکت مزیتش اینه که دیگه نیاز نیست برای هر رکوئست یه کانکشن جدید بازی کنه و یه کانکشن پایدار و باز هست که از همون استفاده میکنه و از این نظر سرعت بالاتر میره

فکر میکنم اینجا مشکل اصلی کند بودن بازی رو بهت گفتم که اینکار شما حلش نمیکنه


دوم اینکه سر یه تایم خاصی از اتفاقات با خبر میشن نه همون لحظه ای که اتفاق افتاده مثلا شما گزاشتی هر 20 ثانیه رکوئست بفرستن به سرور این یعنی اگه یه کاربر حرکتی کرد کاربر دیگه ممکنه از 1 تا 20 ثانیه بعد با خبر بشه نه همون لحظه

راه حل هایی که دوستان میگن از دیتابیس تا نوع کانکشن و .... میتونه چند میلی ثانیه سرعت شما رو افزایش بده
ولثی اگه میخای سرعت رو به شکل محسوس چند ثانیه افزایش بدی باید ساختار چرخش دیتا رو تغییر بدی

سیستم شما الان مثل اینه که چند نفر میخان با هم گفتگو کنن
یه کاغذ وسط اتاق گزاشته که هرکدوم میخاد چیزی بگه میاد روش مینویسه و بقیه باید بیان بخونن چی گفته و همونجوری پاسخ بدن
که به شکل مضحکی کند و غیر منطقی هستش

shahabbasic
دوشنبه 18 تیر 1397, 17:04 عصر
مضحک یار غیرمضحک بودنشو نمیدونم ولی اگر نفرات که با هم بازی میکنن اتصال پرسرعت داشته باشن حتی با همین روش غیرمنطقی هم کندی مشاهده نمیشه!
و با اینکه نفرات آنلاین زیاد و فشار روی سرور بالاست هیچ موقع ندیدم دان بشه درصد استفاده از cpu از 97 بیشتر نمیشه
هرچی ام تعداد بازی هایی که در حال انجامه زیاد میشه من ندیدم از 97% بالاتر بره یا بخواد به عنوان حمله ddos آی پی رو بلاک کنه


اگه همین روش رو بری فقط سویچ کنی رو وب سوکت مزیتش اینه که دیگه نیاز نیست برای هر رکوئست یه کانکشن جدید بازی کنه و یه کانکشن پایدار و باز هست که از همون استفاده میکنه و از این نظر سرعت بالاتر میره
میتونی بگی حدودا چند درصد باعث افزایش سرعت میشه؟

plague
دوشنبه 18 تیر 1397, 19:38 عصر
تعداد نفرات زیاد یه عدد نسبی هستش برای سرور شما ممکنه 100 نفر زیاد باشه برای من 1000 نفر و ... 97% cpu مقدار خیلی زیادیه به نظر من و عملا چیزی تا داون شدن نداری شاید 20-30 تا یوزر آنلاین دیگه اون 3 درصد رو هم تمام کنه
من نمیدونم رو سرورت چی نصب داری ولی احتمالا سرورت مستقیم داون بشه و کسی رو بلاک نکنه چون همه کاربر ها دارن به یه مقدار رکوئست میفرستن و اینجوری نیست که ینفر بیشتر از بقیه بفرسته ... دیداس بر خلاف داس یه عملیات دسته جمعیه و بلاک کردنش عملا غیر ممکنه یا خیلی سخته

من فکر میکنم که نکاتی که به نظرم میرسید رو گفتم و احساس میکنم من دارم هی خودم رو تکرار میکنم و شما هم داری حرفت خودت رو تکرار میکنی .... امیدوارم بتونی راه حل مناسبی پیدا کنی


میتونی بگی حدودا چند درصد باعث افزایش سرعت میشه؟
نمیدونم اندازه نگرفتم و چند صدم برای سرعت های معمولی و بالا ... مقدار بیشتری برای سرعت های پایین

peymang
یک شنبه 28 مرداد 1397, 18:37 عصر
https://www.pubnub.com/blog/2015-01-05-websockets-vs-rest-api-understanding-the-difference

https://developerinsider.co/difference-between-http-and-http-2-0-websocket

https://blog.feathersjs.com/http-vs-websockets-a-performance-comparison-da2533f13a77?gi=7b26ed7956f1

http://blog.arungupta.me/rest-vs-websocket-comparison-benchmarks


دوتای اولی مربوط به تفاوتشون و دوتا لینک اخری مربوط به بنچمارکشون هست