chai 服务器

考虑到c++11的普遍性和chaiscript语言本身的小众性,mongols-v1.6.0之后将不在支持。

chaiscript是一种对C++程序员非常友好的脚本语言。具体用法参考:https://github.com/ChaiScript/ChaiScript/blob/develop/cheatsheet.md

它直接支持脚本模块和C++模块,极为方便。可惜普及程度不高,很多c++程序员甚至不知道它能干什么。现在,它能像lua或者js一样,服务于web开发了。

来看例子:

  1. #include <string>
  2. #include <mongols/lib/hash/md5.hpp>
  3. #include <mongols/lib/hash/sha1.hpp>
  4. #include <mongols/chai_server.hpp>
  5. class person {
  6. public:
  7. person() : name("Tom"), age(0) {
  8. }
  9. virtual~person() = default;
  10. void set_name(const std::string& name) {
  11. this->name = name;
  12. }
  13. void set_age(unsigned int age) {
  14. this->age = age;
  15. }
  16. const std::string& get_name() {
  17. return this->name;
  18. }
  19. unsigned int get_age() {
  20. return this->age;
  21. }
  22. private:
  23. std::string name;
  24. unsigned int age;
  25. };
  26. class studest : public person {
  27. public:
  28. studest() : person() {
  29. }
  30. virtual~studest() = default;
  31. double get_score() {
  32. return this->score;
  33. }
  34. void set_score(double score) {
  35. this->score = score;
  36. }
  37. private:
  38. double score;
  39. };
  40. int main(int, char**) {
  41. int port = 9090;
  42. const char* host = "127.0.0.1";
  43. mongols::chai_server
  44. server(host, port, 5000, 8096, 0/*2*/);
  45. server.set_root_path("html/chai");
  46. server.set_enable_bootstrap(true);
  47. server.set_enable_lru_cache(true);
  48. server.set_lru_cache_expires(1);
  49. server.add(chaiscript::user_type<person>(), "person");
  50. server.add(chaiscript::constructor < person()>(), "person");
  51. server.add(chaiscript::fun(&person::get_age), "get_age");
  52. server.add(chaiscript::fun(&person::set_age), "set_age");
  53. server.add(chaiscript::fun(&person::get_name), "get_name");
  54. server.add(chaiscript::fun(&person::set_name), "set_name");
  55. server.add(chaiscript::user_type < studest>(), "studest");
  56. server.add(chaiscript::constructor < studest()>(), "studest");
  57. server.add(chaiscript::fun(&studest::get_score), "get_score");
  58. server.add(chaiscript::fun(&studest::set_score), "set_score");
  59. server.add(chaiscript::base_class<person, studest>());
  60. server.add(chaiscript::fun(&mongols::md5), "md5");
  61. server.add(chaiscript::fun(&mongols::sha1), "sha1");
  62. std::vector<std::string> package_paths = {"html/chai/package"}
  63. , package_cpaths = {"html/chai/package/test"};
  64. for (auto& item : package_paths) {
  65. server.set_package_path(item);
  66. }
  67. for (auto& item : package_cpaths) {
  68. server.set_package_cpath(item);
  69. }
  70. server.run();
  71. }
  1. use("foo/foo.chai")
  2. use("demo.chai")
  3. load_module("test")
  4. ///*
  5. {
  6. var a = foo()
  7. var b = demo()
  8. a.set_value("hello,")
  9. b.set_value("world")
  10. mongols_res.header("Content-Type","text/plain;charset=UTF-8")
  11. mongols_res.content(concat(a.get_value(),b.get_value()))
  12. mongols_res.status(200)
  13. }
  14. //*/
  15. /*
  16. {
  17. var a = studest()
  18. a.set_score(23.8)
  19. a.set_name("Jerry")
  20. a.set_age(14)
  21. mongols_res.header("Content-Type","text/plain;charset=UTF-8")
  22. mongols_res.content(concat(a.get_name(),a.get_age().to_string()))
  23. mongols_res.status(200)
  24. }
  25. */

脚本模块通过use引进,c++模块通过load_module引进。临时变量通过{}大括号自动清除。

API

mongols_req

  • uri
  • method
  • client
  • param
  • user_agent
  • has_header
  • get_header
  • has_form
  • get_form
  • has_session
  • get_session
  • has_cookie
  • get_cookie
  • has_cache
  • get_cache

mongols_res

  • status
  • content
  • header
  • session
  • cache

模块

脚本模块

  1. class demo {
  2. var value;
  3. def demo() { this.value = "demo"; }
  4. def set_value(x) { this.value = x;}
  5. def get_value() { return this.value; }
  6. };

C++ 模块

可以直接向服务器注入C/C++函数和类,也可以写动态库:

  1. #include <string>
  2. #include <mongols/lib/chaiscript/chaiscript.hpp>
  3. std::string concat(const std::string& a,const std::string& b){
  4. return a+b;
  5. }
  6. CHAISCRIPT_MODULE_EXPORT chaiscript::ModulePtr create_chaiscript_module_test() {
  7. chaiscript::ModulePtr m(new chaiscript::Module());
  8. m->add(chaiscript::fun(&concat), "concat");
  9. return m;
  10. }

详细例子请参考:https://github.com/webcpp/mongols/tree/master/example/html/chai

其他

比较于lua_server和js_server,chai_server的性能属于中等偏上。当然,开启lru缓存的话,三者没什么效率上的分别。

因此从开发者的角度来看,选择lua,chai还是js,由开发者的品味决定。

原文: https://mongols.hi-nginx.com/doc/chai.html