PDA

View Full Version : بحث و تبادل نظر در مورد event اتوماتیک



farshad_persia
دوشنبه 25 بهمن 1389, 02:17 صبح
سلام
از این که نمیدونستم عنوان تاپیک رو چی بزارم منو ببخشید


بحث در مورد سیستم های جدیدی است که اخیرا سایتهایی که از اجکس استفاده میکنن خیلی باب کردن
مثل نمونه بارز اون فیس بوک

من سیستم رو اینجوری توضیح میدم
فرض کنین شما میخواین یک سیستم چت آنلاین مثل چت فیس بوک و امثالهم بنویسین
بحث ورود اطلاعات به روش اجکس که خوب میشه راحت نوشت
اما مشکل اینجاست که فرض کنیم دو کاربر در حال چت کردن میباشند
وقتی نفر اول یک پیغام رو برای نفر دوم ارسال میکنه طبیعتا باید تو همون لحظه بدون اینکه کاربر دوم عملی رو انجام بده پیغام نمایش داده بشه یعنی یه جور کار اتوماتیک که مرورگر انجام میده
حالا برای رفع این مشکل هم راه هست و اون هم اینکه یه اجکس بزاری که لیست پیغام های چت برای هر دو کاربر مثلا هر یک ثانیه یک بار Refresh بشه تا بدون هیچ اقدامی از سوی کاربر دوم پیغام دریافت بشه
اما مشکل اینجاست که پس باید به ازای هر کاربر آنلاین یک بار به دیتابیس Request فرستاد که این عمل در مقادیر بالای کاربر قطعا باعث مشکلات زیادی برای سرور میشه ( که من مطمئنم سایتی مثل فیس بوک با تعددی که در کاربراش داره قطعا این کار رو انجام نمیده )
راه حل مناسب تر رو میزارم به عهده دوستان که ببینیم به چه نتیجه ای خواهیم رسید
چون من فکر میکنم شاید یه عده ای دیگری مثل من به این مسئله نیاز داشته باشن

در ضمن بنده به کلیه مباحث برنامه نویسی php و javascript و ajax و jquery و .... مسلط هستم
این رو گفتم با عرض معذرت چون عموما دوستان لطف دارن و راهنمایی میکنن که برو اینارو یاد بگیر

eshpilen
دوشنبه 25 بهمن 1389, 09:13 صبح
يه روش قديمي هم هست بنام comet (http://en.wikipedia.org/wiki/Comet_%28programming%29) كه ميتوني تحقيق كني شايد فيسبوك از اون روش استفاده ميكنه.

sattaryekta
دوشنبه 25 بهمن 1389, 09:38 صبح
یک چیزی را من خیلی اتفاقی متوجه شدم
اگر دو نفر در یک شبکه توی یاهو مسنجر در حال چت کردن باشند و بعد از مدتی اینترنت اونها قطع بشه، اون دو نفر باز هم میتونند با هم چت کنند.
فکر میکنم سرور فقط نقش برقرار کننده ارتباط اولیه بین اونها را داره!

در ضمن شما موقعی که از یک Browser برای چت کردن استفاده کنید و شبکه را مانیتورینگ کنید متوجه می شوید که هیچ رفرش کردنی در فواصل زمانی در کار نیست. بلکه send و receive فقط زمانی فعال میشه که یا شما تایپ کنی یا طرف مقابل.

amir001
دوشنبه 25 بهمن 1389, 10:13 صبح
چیزی که من بررسی کردم:
چند روش برای چت در وب هست.

در روشهای قدیمیتر هر چند ثانیه یک بار یک درخواست به سرور ارسال میشه و پیامهای جدیدی که برای کاربر ارسال شده گرفته میشن و نمایش داده میشن.
این کار با کمک آجاکس انجام میگیره. (روشی که شما توضیح دادین)

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

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

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

amir001
دوشنبه 25 بهمن 1389, 10:20 صبح
در مورد Comet :
فکر میکنم به این شکل عمل میکنه که یک درخواست را که مرورگر به وب ارسال کرد ، سوکت اون را نمیبنده و اون را پایدار نگه میداره. در این حالت ارسال و دریافت همزمان هست و بدون نیاز به رفرش شدن صفحه هست.

این روش باید توسط سرور و مرورگر کاربر پشتیبانی بشه.

eshpilen
دوشنبه 25 بهمن 1389, 10:27 صبح
آره. البته توسط مرورگر كه فكر ميكنم پشتيباني ميشه. توسط سرور رو نميدونم چه شرايطي ميخواد.
منتها برنامه نويسي و فعال كردن و تنظيم كردنش فكر ميكنم ساده نيست.
من يه بار خواستم تست كنم اما در تستهاي مقدماتي كه كار نكرد ديگه بيخيال شدم. چون در شرايط معمول كاربردي نداره و در تعداد برنامه هاي خيلي كمي از كل برنامه هاي مورد نياز بكار ميره. روشش يه حالتي شبيه ترفند داره و زياد استاندارد نيست.
خلاصه اگر تست كرديد به ما هم بگيد.

farshad_persia
دوشنبه 25 بهمن 1389, 11:10 صبح
با تشکر از همه دوستانی که نظر دادن
راستش من به عنوان مثال چت فیسبوک رو عرض کردم
مثلا این سایت رو که کاری از گروه عصر جوان هست رو نگاه کنین
http://bordobakht.com/global/home.html
جلوی هر خبر تعداد نظر رو نوشته که این به محض دادن نظر از سوی کاربران به مرورگر اطلاع میده
کلا خیلی قسمت تو این سایت هست که به صورت اتوماتیک هست که منو مطمئن کرده اینا یه event پیدا کردن احتمال زیاد که زمانی که اونطرف ورود اطلاعات میشه بر روی مرورگر کاربران این event انجام وظیفه میکنه

ولی این سوال برای من پیش میاد وقتی رابط بین insert و select فقط دیتابیس هست چجوری همچین چیزی غیر رفرش امکان پذیره ؟؟؟:عصبانی++:

sattaryekta
دوشنبه 25 بهمن 1389, 11:15 صبح
شاید روی سرور یک نرم افزار سرور کمکی چت هم نصب کرده اند. مثل DigiChat که یک سرور داره که روی Windows Server نصب میشه.

amir001
دوشنبه 25 بهمن 1389, 12:41 عصر
شما دقیقا میخوای توی سایتت چه کاری انجام ید؟؟

این سایتی که معرفی کردی هم داره هر چند ثانیه یک بار یک درخواست به یک صفحه php میفرسته و اطلاعات را به روز رسانی میکنه.
http://bordobakht.com/global/home.html

http://0.bordobakht.com:6969/0/?

یکسری اطلاعات را با json پک میکنه و به سرور میفرسته و در جواب json میگیره و به روز میکنه.

farshad_persia
دوشنبه 25 بهمن 1389, 12:46 عصر
آخه چرا با این همه Request به سرور مشکلی پیش نمیاد ؟؟؟

amir001
دوشنبه 25 بهمن 1389, 13:04 عصر
قرار نیست مشکلی پیش بیاد. بعد هم این سایت ورزشی که دادی یک کار دیگه هم کرده.

فکر میکنم فقط زمانی که صفحه فعال هست درخواست ارسال میکنه.

اطلاعاتی که ارسال و دریافت میشن هم خیلی کم حجم هستند.

فرض کن میخواهی 10 قسمت مختلف از سایتت را به روزرسانی کنی. یک درخواست به سرور ارسال میکنی و اطلاعات 10 قسمت را با هم میگیری. میتونی از آرایه و سریالیزه کردن اون با json استفاده کنی.
حالا اون اطلاعات دریافی را به کمک جاوا اسکریپت سر جاهای خودشون قرر میدی.
اینطوری به جای چند درخواست همه را درون یک درخواست خلاصه کردی.

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

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

amir001
دوشنبه 25 بهمن 1389, 13:07 عصر
سایت برد و باخت فکر کنم از همون Comet استفاده کرده. با این برنامه:
http://www.ape-project.org/

farshad_persia
دوشنبه 25 بهمن 1389, 13:42 عصر
قرار نیست مشکلی پیش بیاد. بعد هم این سایت ورزشی که دادی یک کار دیگه هم کرده.

فکر میکنم فقط زمانی که صفحه فعال هست درخواست ارسال میکنه.

اطلاعاتی که ارسال و دریافت میشن هم خیلی کم حجم هستند.

فرض کن میخواهی 10 قسمت مختلف از سایتت را به روزرسانی کنی. یک درخواست به سرور ارسال میکنی و اطلاعات 10 قسمت را با هم میگیری. میتونی از آرایه و سریالیزه کردن اون با json استفاده کنی.
حالا اون اطلاعات دریافی را به کمک جاوا اسکریپت سر جاهای خودشون قرر میدی.
اینطوری به جای چند درخواست همه را درون یک درخواست خلاصه کردی.

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

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

amir001
دوشنبه 25 بهمن 1389, 14:14 عصر
درست میفرمایید. اول کار عرض کردم که باید از یک سوکت پایدار استفاده کنید. یا از سوکت نویسی در فلش استفاده کنید و یا از Comet که در لینکی که گذاشتم هست.

روی اون کار کنید و ببینید چه شکلی هست. میتونیم با هم یک نمونه ازش اجرا کنیم تا هردومون یادش بگیریم.
http://www.ape-project.org/download/APE_Complete_Package.html