تعداد بازدید: 1049

تکنیک comet در پیاده سازی درخواست ها

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

  • ارسال درخواست در یک سیکل زمانی مشخص setinterval
  • استفاده از تکنیک comet و تاخیر در پاسخ

راه حل اول این است که ما در هر درخواست یک واقعه را چک کنیم و اگر درست بود عملیات لازم را انجام دهیم و در غیر اینصورت بر گردیم و مجددا درخواست را ارسال کنیم. برای این منظور از تابع setinterval در جاوا اسکریپت استفاده می کنیم :

function update_chatroom() {
    var jqxhr = $.ajax({
        url: "update.php",
        method: "POST",
        success: function (data) {
            if(data.status = true){
                  $("#result").html(data.result);
            }
        }
    });
}
setInterval(update_chatroom, 1000);
update_chatroom();

در سمت سرور نیز چک می کنیم که اگر پاسخ مد نظر موجود باشد (واقعه اتفاق افتاده باشد) خروجی را با پاسخ مناسب ارسال می کنیم و در غیر این صورت درخواست بیهوده شناخته شده و دست خالی برای ارسال درخواست بعدی به کلاینت برمی گردیم :

if(EVENT_OCCURE){
      echo json_encode(array('status' => true,'result' => $result));
}else{
      echo json_encode(array('status' => false));
}

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

تکنیک comet

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

 

comet بار پردازشی سرور را کاهش نمی دهد بلکه با کاهش تعداد درخواست ها و پاسخ ها بار کل سرور را کاهش می دهد. همان طور که در تصویر مشاهده می کنید پس از هر درخواست در سرور منتظر وقوع واقعه می مانیم و از آنجا که سرور پس از مدت زمان معلوم (max_execution_time) اسکریپت را متوقف می کند پس ما یک بار بر می گردیم و مجددا درخواست را ارسال می کنیم(قسمت سمت چپ).

برای ایجاد درخواست باید از توابع بازگشتی استفاده کنیم . در این تابع می توانیم درخواست را پس از اجرای موفقیت آمیز ادامه دهیم.

function update() {
    var jqxhr = $.ajax({
        url: "update.php",
        method: "POST",
        success: function (data) {
            if(data.status = true){
                 alert('success');
            }
            update();
        }
    });
}
update_chatroom();

در سمت سرور باید Event را چک کنیم و در صورت وقوع آن پاسخ مناسب را بفرستیم و در غیر اینصورت یک حلقه مدت دار را می گردانیم تا این واقعه اتفاق بیفتد. در صورت عدم اتفاق واقعه تا پایان حلقه باید برگردیم و دوباره درخواست بفرستیم:

for($i=0; $<20; $i++){
    if(EVENT_OCCURE){
          echo json_encode(array('status' => true,'result' => $result));
    }else{
           sleep(1);
    }
}

برای کاهش بار سرور logic چک کردن واقعه را با یک تاخیر چند ثانیه ای انجام می دهیم که برای این منظور از تابع sleep استفاده می کنیم . بررسی logic باید در سمت سرور انجام گیرد.

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

Event در comet

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

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

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

$.ajax({
    url: "/your_ajax_method/",
    type: "GET",
    dataType: "json",
    timeout: 3000, //Set your timeout value in milliseconds or 0 for unlimited
    success: function(response) { alert(response); }
});

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

مطالب مشابه

مدیریت خطا در جاوا اسکریپت

مبحث مدیریت خطا (Error Handling) یک موضوع مهم در تولید نرم افزار فارغ از بستر پیاده سازی (سیستم عامل) و ابزار (زبان...

تکنولوژی ایجکس Ajax

ایجکس Ajax (Asynchronous JavaScript and XML) مجموعه ای از استانداردها و تکنولوژی های وب است که با استفاده از زبان جاوا...

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

یک دیدگاه برای تکنیک comet در پیاده سازی درخواست ها

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *