【问题标题】:Push notifications in PHP using Amazon SNS/SQS?使用 Amazon SNS/SQS 在 PHP 中推送通知?
【发布时间】:2012-07-16 11:11:39
【问题描述】:

在我的网站上,我想像 Stackoverflow 那样推送 cmets 通知。 Amazon SNS/SQS 似乎提供了一个框架来执行此操作,但我很难在 Web 上找到任何代码/解释,而不是“hello world”等价物。

从阅读 AWS SNS/SQS 文档看来,我需要以下内容:

逻辑:

  1. 发表评论/回答新问题
  2. 创建主题(仅限第一次评论/回答)
  3. 发布消息
  4. 订阅主题

发布 cmets 的页面上的 PHP (http://mysite.com/postCommentOrAnswer.php):

$comment=$_POST['comment']; //posted comment
require_once 'application/third_party/AWSSDKforPHP/sdk.class.php';
$sns = new AmazonSNS();

$response = $sns->create_topic('SO-like-question-12374940'); //create topic

$response = $sns->publish(
  'arn:aws:sns:us-east-1:9876543210:SO-like-question-12374940',
  $comment
);  //publish comment

$response = $sns->subscribe(
  'arn:aws:sns:us-east-1:9876543210:SO-like-question-12374940',
  'https ',
  'https://mysite.com/notificationsReceiver'
); // Subscribe to notifications

接收通知的页面上的 PHP (http://mysite.com/notificationsReceiver.php):

no idea, thoughts?

显然,这不是一个完整的演示,并且可能有一些不正确的函数调用,但我想知道是否有人可以帮助构建这个?

【问题讨论】:

  • 您是否因此而与 SQS/SNS 结缘?我不认为我会使用它们。
  • 嗨@ceejayoz,不,我不喜欢他们。我很乐意使用其他东西。我只是没有找到任何全面的东西,只是简单地向像我这样的相关 PHP 新手解释。如果您知道您想到的任何 PHP 和/或 Codeigniter 解决方案,我也在使用 Codeigniter。
  • 对于大多数网站,在您用于网站的主数据库(也许是 MySQL)中执行此操作是完全可以的。
  • @ceejayoz,谢谢,是的,我正在使用 mysql。这听起来不错,但你能否提供更多细节,也许是在回答这个问题?我的理解非常少。目前我正在使用setInterval() 定期查询我的数据库以获取新消息,但更愿意使用推送系统。我只是不知道如何做到这一点的逻辑。
  • @ceejayoz 您对如何使用 PHP 进行推送通知有任何建议/链接吗?我主要困惑的是如何构建将接收消息的页面?

标签: php amazon-web-services push-notification amazon-sqs amazon-sns


【解决方案1】:

你的评论暗示你不喜欢 SQS,所以我用 MySQL 解决方案来回答。

除非您处理的流量如此之大以至于消息实际上会排队,否则我建议您只使用一种简单的 MySQL 表方法。

我有一个带有 MySQL 通知表的站点,如下所示:

CREATE TABLE `notification` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `user_id` INT(11) NOT NULL,
    `notification_type` ENUM('inline','popup') NOT NULL DEFAULT 'inline',
    `html` TEXT NOT NULL,
    `entered_date` DATETIME NOT NULL,
    `display_date` DATETIME NOT NULL,
    `show_once` TINYINT(1) NOT NULL DEFAULT '0',
    `closable` TINYINT(1) NOT NULL DEFAULT '1',
    `destroy_on_close` TINYINT(1) NOT NULL DEFAULT '1',
    PRIMARY KEY (`id`),
    INDEX `user_id` (`user_id`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM

在页面加载时检查此表,并根据通知数据显示正确的通知。插入是在网站上发生各种动作或事件时完成的。

我拥有超过 10,000 个用户,到目前为止,这种方法还没有被证明是网站的瓶颈。我也不指望它很快。

【讨论】:

  • -@Andy,谢谢。我仍然感到困惑的一件事是如何在页面加载后更新通知,即以“推送”方式。你知道“推送”是如何以编程方式工作的吗?
  • PHP 领域中最常见的两个选项是长轮询(Facebook 经常使用该选项)或您之前在评论中提出的间隔检查。长轮询是向服务器发出请求,但服务器直到它有数据可用于响应(在这种情况下为通知)或达到超时阈值并重新启动轮询后才会回复请求。好文章在这里:blog.perplexedlabs.com/2009/05/04/…
  • -@Andy,感谢您的链接。我想我更喜欢推送机制,但我并不真正了解轮询的工作时间。这个链接开始变得有意义......
  • -@Andy,我也在一个 Apache 服务器上,人们总是在谈论它不能支持很多打开的连接。因此,即使我还没有启动我的网站,我宁愿现在就实施“正确”的方法,而不是稍后重新配置为推送方法,因为我选择不花时间学习如何去做.
  • -@Andy,最后一个问题,在您发送的链接中,usleep(25000); 的意义何在?我认为这只是一个延迟,以防止某种破坏,循环中的循环,但只是想检查一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多