نیاز به راهنمایی در رابطه با دریافت اطلاعات از دیتابیس mysqli

این تاپیک 11 پاسخ و 2 مشارکت کننده دارد . آخرین آپدیت توسط :  reza____ebliser ،‏ 4 روز و 19 ساعت پیش .

۱۳۲ visibility
نویسنده پست
جمعه ، ۱۱ خرداد ۱۳۹۷     ۱۲:۲۴ ب.ظ #


reza____ebliser

Subscriber
605 پست94 تاپیک

سلام روز بخیر خسته نباشید

من دو صفحه ایجاد کردم که یکی به نوعی صفحه شخصی کاربران سایت هست و دیگری صفحه نمایش پست های کاربران

کاربران در صفحه شخصی خودشون میتونند پست اضافه کرده و منتشر کنند.

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

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

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

 

// میتوان در یک دیتابیس لیست افرادی که دنبال می کنند را ذخیره کرد و سپس یکی یکی آی دی اون افراد جستجو بشه و پست ها نمایش داده بشه اما این کار اصلاً جالب نیست و همچنین وقتی کاربر مثلاً 400 نفر را دنبال کند این کار اصلاً منطقی نیست چون هم زمان زیادی صرف دریافت اطلاعات از سرور می شود و هم اینکه چهارصد مرتبه اتصال به دیتابیس جهت دریافت اطلاعات با هر رفرش مناسب نیست

 

لطفاً روش انجام این کار را به من بگید، پروتکل و روش و راه جستجوی پستهای افرادی که دنبال شدند را بهم بگید ممنون میشم

 

2  تشکر
سه شنبه ، ۲۲ خرداد ۱۳۹۷     ۲:۴۹ ق.ظ #


زهرا فرحمند

Subscriber
7 پست0 تاپیک

سلام. به نظرم بهترین راه جوین کردن جداول فالویینگ و پست هست. مثلا اگر شما دو جدول posts و follows رو داشته باشید کوئری تون یه همچین چیزی میشه:

2  تشکر
سه شنبه ، ۲۲ خرداد ۱۳۹۷     ۶:۱۰ ق.ظ #


reza____ebliser

Subscriber
605 پست94 تاپیک

سلام متشکرم از پاسخ شما، میدونم که چطور میشه اطلاعات رو دریافت کرد و نمایش داد؛ مشکل اینجاست که الان فرضا یک کاربر 1000 نفر را فالو کرده و لود کردن و جستجو در دیتابیس و دریافت اطلاعات پست های این 1000 نفر با هر مرتبه رفرش شدن صفحه بسیار زمان بر و کند خواهد بود

2  تشکر
چهارشنبه ، ۲۳ خرداد ۱۳۹۷     ۱۲:۰۹ ق.ظ #


زهرا فرحمند

Subscriber
7 پست0 تاپیک

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

3  تشکر
چهارشنبه ، ۲۳ خرداد ۱۳۹۷     ۶:۳۹ ق.ظ #


reza____ebliser

Subscriber
605 پست94 تاپیک

سلام، بله دقیقاً مشکل از همین کند بودن هست و نوع صفحه بندی آنچنان اهمیتی نداره فعلاً

در حال حاضر بزرگترین مشکل همین دریافت اطلاعات هست که با سرعت بسیار پایین انجام میشه

راهی نیست که بشه نوع دیتابیس را تغییر داد؟ بهترین انجین دیتابیس برای انجام این کار چی هست ؟

من از innodb استفاده کردم، آیا کند بودن به دلیل استفاده از innodb هست ؟

میخواستم به myisam تبدیل کنم اما چون تعداد کاربران خیلی زیاد هست و در هر لحظه اطلاعات دیتابیس در حال اضافه شدن هست یک برنامه نویس بهم گفت innodb بهتر هست برای این کار.

البته یک دلیل دیگر هم این هست که myisam در زمان بک آپ گیری کل دیتابیس قفل میشه تا بک آپ تمام بشه و چون تک سرور دارم کار میکنم و لود بالانس ندارم که چندین سرور داشته باشم و هر دو روز یک مرتبه بک آپ میگیرم به همین دلیل innodb گذاشته بودم

جسارتاً کش کوئری چی هست و به چه صورت عمل میکند ؟ با توجه به اینکه با هر مرتبه رفرش کل اطلاعات دریافتی تغییر پیدا میکنه آیا کش کوئری کاربردی برای من دارد یا خیر؟

3  تشکر
دوشنبه ، ۲۸ خرداد ۱۳۹۷     ۱۲:۵۵ ب.ظ #


زهرا فرحمند

Subscriber
7 پست0 تاپیک

سلام. به طور کلی برای کوئری های خوندن از دیتابیس myisam سریع تر هست. بر عکس برای کار های نوشتن یا ترکیبی از خوندن و نوشتن innodb سریع تر هست. کوئری کشینگ یعنی اینکه کوئری های دقیقا(روی دقیقا ناکید می کنم!) مشابه در حافظه کش میشن و برای درخواست های بعدی سریع تر میشن. اما در مورد جدول شما که اطلاعات هر لحظه در حال تغییره کوئری کشینگ گزینه مناسبی نیست. کلا یه سری روش های بهینه سازی و افزایش سرعت وجود داره که می تونید در موردش سرچی داشته باشید.

اما فعلا ساده ترین و در دسترس ترین راه برای شما اینه که آی دی آخرین ایندکسی که تو اولین کويری گرفتید توی یه متغیر ذخیره کنید و تو where بعدی لحاظ کنید که خوندن رو از آی دی های بیشتر از اون شروع کنه.

2  تشکر
دوشنبه ، ۲۸ خرداد ۱۳۹۷     ۴:۳۵ ب.ظ #


reza____ebliser

Subscriber
605 پست94 تاپیک

سلام ممنونم از شما بابت راهنمایی‌های خیلی خوبتون.

ببخشید یک سوال دیگه هم داشتم، با توجه به اینکه کدهای جاوا /جیکوئری ... سمت کاربر هست و بازدیدکننده میتونه به اونها دسترسی داشته باشه، راهی هست که به نوعی کد را رمزنگاری یک طرفه کرد که به هیچ وجه کاربر نتونه به کدها دسترسی داشته باشه یا خیر؟

روش های انکود کردن مختلفی در اینترنت پیدا کردم اما تمام اونها دو طرفه بود و بعد از تبدیل خیلی ساده با یک کلیک برعکسش نیز انجام میشد

 

1  تشکر
دوشنبه ، ۲۸ خرداد ۱۳۹۷     ۷:۴۷ ب.ظ #


زهرا فرحمند

Subscriber
7 پست0 تاپیک

سلام خواهش می کنم دوست عزیز.

تا اونجا که می دونم راهی برای اینکه به هیچ وجه(!!!) نشه وجود نداره ولی میشه این کار رو به حدی سخت کرد که کاربر مجبور شه ازش صرف نظر کنه. دو راه برای این کار وجود داره. اولیش minify کردن کد هست. دومیش که واقعا دیگه خیلی خوانایی کد رو کم و تقریبا مهندسی معکوسش رو ناممکن و طاقت فرسا می کنه به obfuscate کردن کد معروفه. یعنی مبهم و نامفهوم کردن. برای هر دو ابزار های زیادی وجود داره. مثلا این یک نمونه اش:

https://obfuscator.io

اما به هرجال حتی این هم با یه عمل beatify تا حدود زیادی خوانایی پیدا می کنه. تا اونجا که من می دونم راه محکمی براش نیست. شما منطقی هم به قضیه نگاه کنید تهش باید کد برای مفسر مرورگر قابل خوندن باشه واگرنه نمی تونه اجرا شه. تنها کاری که تمام این کد ها می کنن زشت کردن کد تا حد ممکنه!

1  تشکر
دوشنبه ، ۲۸ خرداد ۱۳۹۷     ۸:۲۲ ب.ظ #


reza____ebliser

Subscriber
605 پست94 تاپیک

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

obfuscate هم که خوب هست اما دو طرفه هست و خیلی از سایتها برعکسش رو هم گذاشتن

2  تشکر
سه شنبه ، ۲۹ خرداد ۱۳۹۷     ۱۲:۳۴ ب.ظ #


reza____ebliser

Subscriber
605 پست94 تاپیک

ببخشید یک سوال مهم دیگه هم برام پیش اومده

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

به خاطر حجم زیاد اطلاعات و پردازش ها، با اینترنت سرعت پایین وقتی روی دکمه مورد نظر کلیک بشه حدود 8 ثانیه طول میکشه تا نتیجه نمایش داده بشه و با اینترنت سرعت بالا هم در بهترین حالت 4 ثانیه طول کشید

آیا راهی هست زمانیکه کاربر درخواست رو ارسال کرد، این مراحل دریافت اطلاعات و پردازش ها توسط خود سرور انجام بشه و در نهایت نتیجه برای کاربر ارسال بشه ؟ منظورم این هست که مثلاً کدها رو در یک فایل جانبی قرار بدم که روی سرور قرار دارد و پردازش توسط اون انجام بشه ؟ آیا CURL همین کار رو انجام میده یا اینکه در هر صورت زمان بر حسب سرعت اینترنت کاربر متفاوت خواهد بود ؟

 

0  تشکر
پست 1 تا 10 (از مجموع 12 پست)

برای پاسخ دادن به این تاپیک باید وارد سایت شوید .