26

我正在尝试在我的基于 PHP 的网站上实现推送通知。目标是制作类似于 Stackoverflow 和其他网站的东西,它们会在用户收到消息时实时通知用户。

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

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

如果有什么东西可以帮助我理解receiving.php推送通知的页面是什么样的,我将不胜感激。

4

2 回答 2

15

在职的

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

好吧,您可以将 Websockets 用于支持它的浏览器(因为所有现代浏览器都提供了良好的支持)

入门

您可以从以下几个资源开始:

HTML5rocks

网易+

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

对于支持 Websockets 的浏览器

倒退

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

对于这些项目,当在没有 WebSockets 或禁用它的浏览器上运行时,将使用web-socket-js 。它的效率将低于原生,但仍比长轮询低得多。

任何带有 Flash 的浏览器都可以使用web-socket-js shim/polyfill支持 WebSocket 。

参考:

WebSocket 的替代方案

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

于 2012-07-21T18:01:02.757 回答
4

我只是想分享我使用的实际实现。我决定使用一个很棒的 SAAS,Pusher,因为在实现推送通知方面存在许多具有挑战性的问题,正如我在阅读 @Virendra 的优秀答案中的链接时意识到的那样,Pusher 可以为您解决。

最让我印象深刻的是您只需编写很少的代码即可完成这项工作。见下文。我的服务器端是 PHP(Pusher 有多种语言的库)。

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>
于 2013-02-18T16:16:07.847 回答