龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

PHP或Python调用C++实现的服务器

时间:2009-12-17 12:00来源:未知 作者:admin 点击:
分享到:
周末2天,一天写了个php_cerl模块,完成cerl的php client,一天写了个pycerl模块,完成cerl的python client。呵呵,C++的server可以用php或者python来调用了。 对于我们之前用CERL写的HashServer这个服务

周末2天,一天写了个php_cerl模块,完成cerl的php client,一天写了个pycerl模块,完成cerl的python client。呵呵,C++的server可以用php或者python来调用了。

对于我们之前用CERL写的HashServer这个服务器(一个很简单的样例,代码参阅:Erlang vs. CERL - CERL简介),其PHP写的Client样例如下:

view plaincopy to clipboardprint?

define('HashSever_put', 1);

define('HashSever_get', 2);

if (!extension_loaded('php_cerl')) {

if (!dl('php_cerl.' . PHP_SHLIB_SUFFIX))

die("ERROR: Cannot load php_cerl library!\n");

}

cerl_thread_init();

$server = cerl_connect('localhost:8889', 'HashServer');

if (!$server)

die("ERROR: Connect HashSever failed!\n");

printf(

"+-----------------------------------------------------------\n" .

"| put - Put (key, value)\n" .

"| get - Get value of a key\n" .

"| q - Quit\n" .

"+-----------------------------------------------------------\n");

for (;;)

{

echo "\n> ";

list($cmd, $key, $value) = fscanf(STDIN, '%s%d%d');

if ($cmd == 'get' || $cmd == 'g')

{

$ret = $server->call(HashSever_get, $key);

if ($ret[0] == code_ok)

echo "result: $ret[1]\n";

else

echo "error: $ret[0]\n";

}

else if ($cmd == 'put' || $cmd == 'p')

{

$ret = $server->call(HashSever_put, $key, $value);

if ($ret[0] == code_ok)

echo "ok!\n";

else

echo "error: $ret[0]\n";

}

else if ($cmd == 'q')

{

break;

}

else

{

echo "unknown command!\n";

}

}

cerl_thread_term();

?>

define('HashSever_put', 1);

define('HashSever_get', 2);

if (!extension_loaded('php_cerl')) {

if (!dl('php_cerl.' . PHP_SHLIB_SUFFIX))

die("ERROR: Cannot load php_cerl library!\n");

}

cerl_thread_init();

$server = cerl_connect('localhost:8889', 'HashServer');

if (!$server)

die("ERROR: Connect HashSever failed!\n");

printf(

"+-----------------------------------------------------------\n" .

"| put - Put (key, value)\n" .

"| get - Get value of a key\n" .

"| q - Quit\n" .

"+-----------------------------------------------------------\n");

for (;;)

{

echo "\n> ";

list($cmd, $key, $value) = fscanf(STDIN, '%s%d%d');

if ($cmd == 'get' || $cmd == 'g')

{

$ret = $server->call(HashSever_get, $key);

if ($ret[0] == code_ok)

echo "result: $ret[1]\n";

else

echo "error: $ret[0]\n";

}

else if ($cmd == 'put' || $cmd == 'p')

{

$ret = $server->call(HashSever_put, $key, $value);

if ($ret[0] == code_ok)

echo "ok!\n";

else

echo "error: $ret[0]\n";

}

else if ($cmd == 'q')

{

break;

}

else

{

echo "unknown command!\n";

}

}

cerl_thread_term();

?>

而Python写的Client样例如下:

view plaincopy to clipboardprint?

HashSever_put = 1

HashSever_get = 2

import sys, pycerl

pycerl.thread_init()

server = pycerl.connect("localhost:8889", "HashServer")

if not server:

print "ERROR: Connect HashSever failed!"

else:

print "+-----------------------------------------------------------"

print "| put - Put (key, value)"

print "| get - Get value of a key"

print "| q - Quit"

print "+-----------------------------------------------------------"

while True:

sys.stdout.write("\n> ")

input = sys.stdin.readline().split()

cmd = input[0]

if cmd == "get" or cmd == "g":

if len(input) < 2:

continue

key = int(input[1], 10)

ret = server.call(HashSever_get, key)

if ret[0] == pycerl.code_ok:

print "result:", ret[1]

else:

print "error:", ret[0]

elif cmd == "put" or cmd == "p":

if len(input) < 3:

continue

key = int(input[1], 10)

value = int(input[2], 10)

ret = server.call(HashSever_put, key, value)

if ret[0] == pycerl.code_ok:

print "ok!"

else:

print "error:", ret[0]

elif cmd == "q":

break

else:

print "unknown command!"

pycerl.thread_term()

HashSever_put = 1

HashSever_get = 2

import sys, pycerl

pycerl.thread_init()

server = pycerl.connect("localhost:8889", "HashServer")

if not server:

print "ERROR: Connect HashSever failed!"

else:

print "+-----------------------------------------------------------"

print "| put - Put (key, value)"

print "| get - Get value of a key"

print "| q - Quit"

print "+-----------------------------------------------------------"

while True:

sys.stdout.write("\n> ")

input = sys.stdin.readline().split()

cmd = input[0]

if cmd == "get" or cmd == "g":

if len(input) < 2:

continue

key = int(input[1], 10)

ret = server.call(HashSever_get, key)

if ret[0] == pycerl.code_ok:

print "result:", ret[1]

else:

print "error:", ret[0]

elif cmd == "put" or cmd == "p":

if len(input) < 3:

continue

key = int(input[1], 10)

value = int(input[2], 10)

ret = server.call(HashSever_put, key, value)

if ret[0] == pycerl.code_ok:

print "ok!"

else:

print "error:", ret[0]

elif cmd == "q":

break

else:

print "unknown command!"

pycerl.thread_term()

值得注意的是,这里我们没有像C/C++一样,用一个编译器为SDL翻译生成PHP/Python的Proxy代码。这是动态语言的优势,哪怕没有Proxy,其代码仍然看起来相当优雅(不过话又说回来,其实C++也可以做到的,但是略损失些性能)。

本文来自CSDN博客:http://blog.csdn.net/xushiweizh/archive/2009/08/24/4477517.aspx

精彩图集

赞助商链接