日期:2014-05-17  浏览次数:20401 次

php与其他语言的交互(80)
假如我现在有一个web服务器 S1
还有一个 应用服务器 S2(比如做搜索功能)

S1y用php写的, S2的应用是用c(或者java,c++)写的,
怎么样实现这两台服务器之间的交互

流程我是这样想的,
1.用户访问S1 
2.服务器将运算交给S2
3.S2将运算结果返回S1 
4.S1返回信息给用户


------解决方案--------------------
soap
------解决方案--------------------
json不可以吗
------解决方案--------------------
任何网络上服务器间的数据通讯方案都可以使用
soap/xmlrpc/REST/json(p)/ 这些都是比较方便的成熟的

如果你对这两个服务器都有足够控制权限,
当然也可以自己通过socket直接通讯(可以用非80端口)

如果这两个服务器都可以操作某个公共媒介,比如同一个数据库,或网络文件系统,
当然也可以通过这个媒介传递数据。。。

。。。。


------解决方案--------------------
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。
------解决方案--------------------
可以尝试用这个
http://developer.51cto.com/art/201002/182757.htm
当然略有差异。目标是一样的
------解决方案--------------------
写接口吧
------解决方案--------------------
最简单的方法应该是使用php的file_get_contents('http://ip:port'),可以通过GET或者POST方式传值,而函数的返回值就是S2的处理结果,关键是S2要如何创建一个基于http协议的监听程序。

使用libevent可以非常方便,快捷的建立一个http服务,一个简单的代码如下:
C/C++ code

#include < sys/types.h> 
 
#include < stdio.h> 
#include < stdlib.h> 
#include < unistd.h> 
 
#include < event.h> 
#include < evhttp.h> 
 
 
void generic_request_handler(struct evhttp_request *req, void *arg) 
{ 
    struct evbuffer *returnbuffer = evbuffer_new(); 
 
    evbuffer_add_printf(returnbuffer, "Thanks for the request!"); 
    evhttp_send_reply(req, HTTP_OK, "Client", returnbuffer); 
    evbuffer_free(returnbuffer); 
    return; 
} 
 
int main(int argc, char **argv) 
{ 
    short http_port = 8084; 
    char *http_addr = "0.0.0.0"; 
    struct evhttp *http_server = NULL; 
 
    event_init(); 
    http_server = evhttp_start(http_addr, http_port); 
    evhttp_set_gencb(http_server, generic_request_handler, NULL); 
 
    fprintf(stderr, "Server started on port %d\n", http_port); 
    event_dispatch(); 
 
    return(0); 
}