推送通知如何工作?

时间:2012-07-21 13:54:07

标签: php javascript apache push-notification amazon-sns

我正在尝试在基于PHP的网站上实现推送通知。目标是制作与Stackoverflow和其他网站类似的内容,以便在用户收到消息时实时通知用户。

我正在使用mysql作为我的数据库,Apache作为我的服务器,我正在考虑使用Amazon-SNS作为这些通知的框架,因为这就是该服务的目的。

我从文献中了解了如何以编程方式设置sending.phpreceiving.php页面。我假设sending.php页面只涉及某个页面$_POST['message'],但从那里我真的迷失了。

如果某些内容可以帮助我了解推送通知的receiving.php页面的内容,我将非常感激。

2 个答案:

答案 0 :(得分:15)

工作

HTML5rocks提供了一个很好的解释here,关于websockets如何工作。

您可以为支持它的浏览器使用Websockets(因为所有现代浏览器都提供了很好的支持)

入门

您可以开始使用这些资源:

HTML5rocks

Nettuts+

Nettuts +为websockets入门提供了一个很好的教程。

For Browsers Supporting Websockets

后备

您可以使用Modernizr来检测客户端的浏览器是否支持websockets&作为后备,您可以使用闪存而不是Websockets。

对于这些项目,在没有WebSockets或禁用WebSockets的浏览器上运行时,将使用web-socket-js。它将比本机效率低,但仍然比长轮询更低的延迟。

任何带Flash的浏览器都可以使用web-socket-js填充/填充来支持WebSocket。

参考:

Alternative to WebSockets

https://softwareengineering.stackexchange.com/questions/33713/is-there-an-alternative-to-html-web-sockets-now-that-firefox-4-has-disabled-the

答案 1 :(得分:4)

我只想分享我的实际实施情况。我决定选择一个很棒的SAAS,Pusher,因为在实现推送通知时存在许多具有挑战性的问题,因为我在阅读@ Virendra的优秀答案中的链接时,Pusher为您解决了这个问题。

我印象最深刻的是你必须编写多少代码来完成这项工作。见下文。 我的服务器端是PHP(Pusher has libraries in many languages)。

require('/application/thirdParty/pusher-html5-realtime-push-notifications/lib/squeeks-Pusher-PHP/lib/Pusher.php');
require('/application/thirdParty/pusher-html5-realtime-push-notifications/config.php');
$pusher = new Pusher(APP_KEY, APP_SECRET, APP_ID);

foreach($recipients as $row){                   
  $channel='my-channel'.$row->recipient_id;
  $pusher->trigger($channel, 'notifications', 
    array('message' => $row->message,
          'notification_id' => $row->notification_id) 
  );
}

这是HTML / JS(不要被淹没,大部分代码只是填充小圆圈和带有传入通知的列表,如Stackoverflow和其他人这样做):

<script src="/application/thirdParty/pusher.min.js"></script>
<script>     
var myID=179; // would receive notification if myID matches $row->recipient_id above;
var myChannel = pusher.subscribe('my-channel'+myID);
myChannel.bind('notifications',
  function(data) {
        var message=String(data.message),
            url='/notifications/'+data.notification_id, 
            icon='<i class=\'icon-heart\'></i>',
            urlText=icon+message;

        var notificationRow='<li><a href='+url+'>'+urlText+'</a></li>';
         $('#notificationsDropdownList').prepend(notificationRow);   

        if(notificationCircleCount==0){
             notificationCircleCount++;
              $notificationCircle.show();
               $notificationCircleCount.html(notificationCircleCount);
        }
        else{
             notificationCircleCount++;
             $notificationCircleCount.html(notificationCircleCount);
        }
        console.log('Pusher happened'+data.message);                  
  } //function
); //myChannel
</script>