Python和PHP之间简单而稳定的IPC
我有一个用Python写的程序,它通过subprocess.Popen()
这个功能来启动一个PHP脚本。这个PHP脚本需要和Python之间进行双向通信,我想找一个简单又可靠的方法来管理消息的发送和接收。
我已经用基本的套接字(sockets)写了一个可以工作的协议,但我觉得这并不够可靠——我没有处理丢失消息的逻辑,而且我对套接字的工作原理也不是很了解,这让我对可能出现的其他问题感到不安。
有没有比原始套接字更简单的通用库或进程间通信(IPC)框架?
- 目前我需要一个支持Python 和 PHP的东西,但将来我可能还想用C、Perl和Ruby。
- 我希望这个东西是可靠的,也就是说,当服务器或客户端崩溃时,另一方能够优雅地恢复。
2 个回答
0
你可以考虑使用共享内存或者命名管道,但我觉得还有两个更可能的选择,假设至少有一种语言是用来做网页应用的:
A. 利用你数据库的原子性。在Python中,开始一个事务,把一条消息放进一个表里,然后结束这个事务。在PHP中,开始一个事务,从表里取出一条消息或者把它标记为“已读”,然后结束这个事务。确保你的PHP和/或Python程序足够聪明,不会重复发送相同的消息。这样就能实现可靠且可扩展的进程间通信,利用现有的网页架构。
B. 让你的网页服务器(假设是网页应用)能够同时运行PHP和Python,并且把内部进程限制为只能本地访问,然后使用xmlrpc或soap从另一种语言调用它们,使用标准库。这也是可扩展的,因为你可以在之后更改你的网址和安全设置。
2
听起来你想要一个通用的RPC框架。
你可以看看以下这些:
- Thrift http://incubator.apache.org/thrift/
- XML RPC http://docs.python.org/library/xmlrpclib.html 和 http://phpxmlrpc.sourceforge.net/
- AMQP 比如 http://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol
Thrift 可能更符合你的需求。它在Facebook内部使用。