由于通知轮询,页面加载速度非常慢
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 后它工作正常。但是如果由于连续轮询导致用户不足,服务器是否会过载?以上是关于由于通知轮询,页面加载速度非常慢的主要内容,如果未能解决你的问题,请参考以下文章