使用Redis、Python和PHP的基于事件的邮件

使用Redis、Python和PHP的基于事件的邮件,redis,publish-subscribe,Redis,Publish Subscribe,我想经常从Python组件向Redis服务器发布消息。然后,在另一个也可以访问这个Redis服务器的PHP组件中,我想根据Redis中存储的消息向用户发送电子邮件。如果我没有错的话,有两种方法:推-拉和推-推设计: 拉力设计 PHP组件经常向Redis服务器发出请求,当出现新消息时,执行该操作 推送设计: 我们不需要频繁地从PHP组件发出这些请求:只要在Redis中发布新消息,就可以触发PHP组件的操作 我的问题 我们如何实现Push-Push设计?当我阅读关于Pub-Sub模型的Redis文档

我想经常从Python组件向Redis服务器发布消息。然后,在另一个也可以访问这个Redis服务器的PHP组件中,我想根据Redis中存储的消息向用户发送电子邮件。如果我没有错的话,有两种方法:推-拉和推-推设计:

拉力设计

PHP组件经常向Redis服务器发出请求,当出现新消息时,执行该操作

推送设计:

我们不需要频繁地从PHP组件发出这些请求:只要在Redis中发布新消息,就可以触发PHP组件的操作

我的问题

我们如何实现Push-Push设计?当我阅读关于Pub-Sub模型的Redis文档时,我没有找到任何关于它的信息。所以我真的不明白我们如何触发一个动作,以另一种方式,然后频繁地向redis服务器发出请求

您需要使用诸如
nohup
supervisor
upstart
等解决方案,作为守护进程运行“长期运行”的php进程。此进程将继续作为守护进程使用您的redis
频道
。Python将继续生产,php将继续消费

有几个库可以作为守护进程运行php进程,例如,或者如果您使用的是一个框架,例如laravel,它提供了一个很好的发布/订阅

就是这样,

Php部分将
订阅
mychannel

127.0.0.1:6379> SUBSCRIBE mychannel
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "mychannel"
3) (integer) 1
127.0.0.1:6379> publish mychannel myemailjson
(integer) 1
127.0.0.1:6379> publish mychannel myanotheremailjson
(integer) 1
127.0.0.1:6379>
python将
发布到
mychannel

127.0.0.1:6379> SUBSCRIBE mychannel
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "mychannel"
3) (integer) 1
127.0.0.1:6379> publish mychannel myemailjson
(integer) 1
127.0.0.1:6379> publish mychannel myanotheremailjson
(integer) 1
127.0.0.1:6379>
同时,您的php进程将收到这些消息

1) "message"
2) "mychannel"
3) "myemailjson"
1) "message"
2) "mychannel"
3) "myanotheremailjson"

在这个
subscriber
php进程中,每当它收到消息时,你就会调用/触发/分派你的电子邮件传递作业(可能是异步的)。

好吧,这就是推送设计,因为这个php进程会调用电子邮件传递作业?在拉式设计中,这就是调用Redis服务器的电子邮件组件?实际上php部分由两个类组成——主类将监听该频道,每当它收到消息时,它将调用
MailDelivery
类的
send
方法@太好了,非常感谢,很清楚。如果你认为问题足够具体,请随意投票:)@nolw38我是两位投票人之一;)不客气。