CERL: PHP或Python調用C++實現的伺服器

來源:互聯網
上載者:User

周末2天,一天寫了個php_cerl模組,完成cerl的php client,一天寫了個pycerl模組,完成cerl的python client。呵呵,C++的server可以用php或者python來調用了。

 

對於我們之前用CERL寫的HashServer這個伺服器(一個很簡單的範例,代碼參閱:Erlang vs. CERL - CERL簡介),其PHP寫的Client範例如下:

<?php<br />define('HashSever_put', 1);<br />define('HashSever_get', 2);</p><p>if (!extension_loaded('php_cerl')) {<br />if (!dl('php_cerl.' . PHP_SHLIB_SUFFIX))<br />die("ERROR: Cannot load php_cerl library!/n");<br />}</p><p>cerl_thread_init();</p><p>$server = cerl_connect('localhost:8889', 'HashServer');<br />if (!$server)<br />die("ERROR: Connect HashSever failed!/n");</p><p>printf(<br />"+-----------------------------------------------------------/n" .<br />"| put <key> <value> - Put (key, value)/n" .<br />"| get <key> - Get value of a key/n" .<br />"| q - Quit/n" .<br />"+-----------------------------------------------------------/n");</p><p>for (;;)<br />{<br />echo "/n> ";<br />list($cmd, $key, $value) = fscanf(STDIN, '%s%d%d');<br />if ($cmd == 'get' || $cmd == 'g')<br />{<br />$ret = $server->call(HashSever_get, $key);<br />if ($ret[0] == code_ok)<br />echo "result: $ret[1]/n";<br />else<br />echo "error: $ret[0]/n";<br />}<br />else if ($cmd == 'put' || $cmd == 'p')<br />{<br />$ret = $server->call(HashSever_put, $key, $value);<br />if ($ret[0] == code_ok)<br />echo "ok!/n";<br />else<br />echo "error: $ret[0]/n";<br />}<br />else if ($cmd == 'q')<br />{<br />break;<br />}<br />else<br />{<br />echo "unknown command!/n";<br />}<br />}</p><p>cerl_thread_term();<br />?><br />

 

而Python寫的Client範例如下:

HashSever_put = 1<br />HashSever_get = 2</p><p>import sys, pycerl</p><p>pycerl.thread_init()</p><p>server = pycerl.connect("localhost:8889", "HashServer")<br />if not server:<br />print "ERROR: Connect HashSever failed!"</p><p>else:<br />print "+-----------------------------------------------------------"<br />print "| put <key> <value> - Put (key, value)"<br />print "| get <key> - Get value of a key"<br />print "| q - Quit"<br />print "+-----------------------------------------------------------"</p><p>while True:</p><p>sys.stdout.write("/n> ")</p><p>input = sys.stdin.readline().split()<br />cmd = input[0]</p><p>if cmd == "get" or cmd == "g":<br />if len(input) < 2:<br />continue<br />key = int(input[1], 10)<br />ret = server.call(HashSever_get, key)<br />if ret[0] == pycerl.code_ok:<br />print "result:", ret[1]<br />else:<br />print "error:", ret[0]</p><p>elif cmd == "put" or cmd == "p":<br />if len(input) < 3:<br />continue<br />key = int(input[1], 10)<br />value = int(input[2], 10)<br />ret = server.call(HashSever_put, key, value)<br />if ret[0] == pycerl.code_ok:<br />print "ok!"<br />else:<br />print "error:", ret[0]</p><p>elif cmd == "q":<br />break</p><p>else:<br />print "unknown command!"</p><p>pycerl.thread_term()<br />

 

值得注意的是,這裡我們沒有像C/C++一樣,用一個編譯器為SDL翻譯產生PHP/Python的Proxy代碼。這是動態語言的優勢,哪怕沒有Proxy,其代碼仍然看起來相當優雅(不過話又說回來,其實C++也可以做到的,但是略損失些效能)。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.