2017-06-10 7 views
0

通知システムで作業していますが、通知のポーリングによりページが非常に遅く読み込まれます。 私は非常に遅いという意味ですが、通知コードをコメントアウトするとスムーズに実行されます。ここでは、ポーリング通知のための私のAjaxのコードは次のとおりです。ここで通知ポーリングによりページが非常に遅くなります

function pollNotification() { 

$.ajax({ 
    method: 'POST', 
    url: urlGetNotification, 
    async: true,   
    timeout: 0,   
    cache: false, 
    data: { 
     _token: token 
    }, 

}).done(function (notifs) { 
    //my code here 

}).always(pollNotification); 
} 

は、通知を取得するための私のサーバー側のPHP(laravelフレームワーク)のコードは次のとおりです。要するに

public function getNotification() 
{ 
    $count=0; 
    $user = User::select('last_notif_timestamp')->where('id',Auth::user()->id)->get(); // fetching last timestamp when user clicked on notification 

    $notification = Notification::where('receiver',Auth::user()->id)->orderBy('updated_at','desc')->get(); //checking for notification in table 
    $prevDate = Session::get('prevDate'); //temporary variable to check when the last notification came 

     if($notification->count()>0) { 
      if ($prevDate == null || $prevDate < $notification[0]->updated_at) { 
       Session::set('prevDate', $notification[0]->updated_at); 

       $notifications = array(); 
       foreach ($notification as $notif){ 
        if($notif->updated_at > $user[0]->last_notif_timestamp) //Keeping track of notification counter 
         $count++; 
        $notifications[] = $notif; 
       } 

       return response()->json(['notifications'=>$notifications, 'count'=>$count],200); 
      } 
      else{ 
       sleep(10); // Sleeping for 10 seconds for next poll 
       self::getNotification(); //calling function recursively 
      } 
     } 
    sleep(10); 
    self::getNotification(); 
} 

新しい通知通知のためとあれば、このコードのチェックがありますそれが存在すれば、カウント値でそれらの通知を返します。 通知がない場合は、10秒間スリープ状態になり、同じ機能が再帰的に呼び出されます。

ページを高速に読み込むための解決策を提案してください。 ありがとう!

答えて

0

なぜあなたはPHP側で待っていますか?

現在のところ、ajaxリクエストへの応答を送信する前にPHPスクリプトを強制的に待機させてください。この待機時間は、非常に長くなり、再帰呼び出しを伴うサーバーではメモリを消費する可能性があります。

たとえば、setTimeout()を使用してJavaScript側で簡単なポーリングを行うことができます。 PHP側では、sleep()を使わずに空の場合(Javascriptを使ってチェックする)でも通知配列を返すことができます。 これは、少なくともあなたのajaxリクエストの応答時間とページの読み込み時間を減らす必要があります。

+0

よろしくお願い致します!それはsleep()を削除してから正常に動作し、通知がない場合はnullを返します。しかし、継続的なポーリングのためにユーザーの数が多い場合、サーバーに負荷がかかりますか? –

関連する問題