由于通知轮询,页面加载速度非常慢

Posted

技术标签:

【中文标题】由于通知轮询,页面加载速度非常慢【英文标题】:Pages load very slow due to notification polling 【发布时间】:2017-06-10 06:55:56 【问题描述】:

我正在开发通知系统,但由于轮询通知,我的页面加载速度非常慢。 我的意思是非常慢,但是当我注释掉通知代码时,它运行得很顺利。这是我用于轮询通知的 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 秒并递归调用相同的函数。

请提出任何解决方案以更快地加载页面。 谢谢!

【问题讨论】:

【参考方案1】:

为什么要在 php 端等待?

目前,您强制您的 php 脚本在向您的 ajax 请求发送响应之前等待,这种等待可能会很长,并且对于具有递归调用的服务器来说会消耗内存。

例如,您可以使用 setTimeout() 在 javascript 端进行简单的轮询。在 php 方面,您可以只返回通知数组,即使它是空的(使用 Javascript 检查它)而无需任何 sleep()。 这至少应该减少您的 ajax 请求的响应时间,也许还可以减少页面的加载时间。

【讨论】:

嘿,谢谢!!如果没有通知,则在删除 sleep() 并返回 null 后它工作正常。但是如果由于连续轮询导致用户不足,服务器是否会过载?

以上是关于由于通知轮询,页面加载速度非常慢的主要内容,如果未能解决你的问题,请参考以下文章

使用gzip优化页面加载遇到的问题

Codeigniter 加载页面非常慢

重新启动或不活动期间后,Django 站点加载速度非常慢

平均堆栈网站在服务器上的加载速度非常慢

vueelementadmin加载慢

由于在内容类型中创建 65 个字段,节点添加/编辑页面加载缓慢