Auto deploy from Github Actions

This commit is contained in:
crazywhalecc 2024-09-19 08:29:13 +00:00
commit 5c95c4a0e6
2331 changed files with 117785 additions and 0 deletions

29
404.html Normal file
View File

@ -0,0 +1,29 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<title>炸毛框架 v3</title>
<meta name="description" content="">
<meta name="generator" content="VuePress 1.9.10">
<link rel="icon" href="/logo_trans.png">
<script>
var _hmt = _hmt || [];
(function () {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?f0f276cefa10aa31a20ae3815a50b795";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
<meta name="description" content="一个高性能聊天机器人 + Web 框架">
<link rel="preload" href="/assets/css/0.styles.de075592.css" as="style"><link rel="preload" href="/assets/js/app.cf958133.js" as="script"><link rel="preload" href="/assets/js/5.073233e8.js" as="script"><link rel="prefetch" href="/assets/js/1.d8755a39.js"><link rel="prefetch" href="/assets/js/10.960912c3.js"><link rel="prefetch" href="/assets/js/11.cd171694.js"><link rel="prefetch" href="/assets/js/12.ff9ca1d1.js"><link rel="prefetch" href="/assets/js/13.a56deac8.js"><link rel="prefetch" href="/assets/js/14.b222a011.js"><link rel="prefetch" href="/assets/js/15.31489867.js"><link rel="prefetch" href="/assets/js/16.e921dbc4.js"><link rel="prefetch" href="/assets/js/17.58f730d3.js"><link rel="prefetch" href="/assets/js/18.26c46c49.js"><link rel="prefetch" href="/assets/js/19.ee0bfd3b.js"><link rel="prefetch" href="/assets/js/2.4c04991c.js"><link rel="prefetch" href="/assets/js/20.bb3578b8.js"><link rel="prefetch" href="/assets/js/21.e66f7fe5.js"><link rel="prefetch" href="/assets/js/22.cba8ca48.js"><link rel="prefetch" href="/assets/js/23.cb49f41c.js"><link rel="prefetch" href="/assets/js/24.d95b175a.js"><link rel="prefetch" href="/assets/js/25.b0d69869.js"><link rel="prefetch" href="/assets/js/26.8e7089c0.js"><link rel="prefetch" href="/assets/js/27.333a53a1.js"><link rel="prefetch" href="/assets/js/28.df4b871c.js"><link rel="prefetch" href="/assets/js/29.5427ad45.js"><link rel="prefetch" href="/assets/js/3.07fc018e.js"><link rel="prefetch" href="/assets/js/30.7cb7445a.js"><link rel="prefetch" href="/assets/js/31.5c4bb546.js"><link rel="prefetch" href="/assets/js/32.7fc05474.js"><link rel="prefetch" href="/assets/js/33.9684a4f8.js"><link rel="prefetch" href="/assets/js/34.83e32a28.js"><link rel="prefetch" href="/assets/js/35.95d03df6.js"><link rel="prefetch" href="/assets/js/36.80aace42.js"><link rel="prefetch" href="/assets/js/37.1eaed2ee.js"><link rel="prefetch" href="/assets/js/38.75fa7a1c.js"><link rel="prefetch" href="/assets/js/39.117f5802.js"><link rel="prefetch" href="/assets/js/4.6623271b.js"><link rel="prefetch" href="/assets/js/40.57eba153.js"><link rel="prefetch" href="/assets/js/41.89c4a7c8.js"><link rel="prefetch" href="/assets/js/42.d8f92f99.js"><link rel="prefetch" href="/assets/js/43.5ee83631.js"><link rel="prefetch" href="/assets/js/44.c09b5b0c.js"><link rel="prefetch" href="/assets/js/45.bd850606.js"><link rel="prefetch" href="/assets/js/46.732b1cef.js"><link rel="prefetch" href="/assets/js/47.2a872d0d.js"><link rel="prefetch" href="/assets/js/48.959e18f4.js"><link rel="prefetch" href="/assets/js/49.a9bb32f7.js"><link rel="prefetch" href="/assets/js/50.ca90a854.js"><link rel="prefetch" href="/assets/js/51.79142530.js"><link rel="prefetch" href="/assets/js/52.fe63ad16.js"><link rel="prefetch" href="/assets/js/53.ed84845a.js"><link rel="prefetch" href="/assets/js/54.3ab7e492.js"><link rel="prefetch" href="/assets/js/55.9028e407.js"><link rel="prefetch" href="/assets/js/56.8173f798.js"><link rel="prefetch" href="/assets/js/57.2166b068.js"><link rel="prefetch" href="/assets/js/58.7c52b6bf.js"><link rel="prefetch" href="/assets/js/59.e9965a7b.js"><link rel="prefetch" href="/assets/js/60.f277436c.js"><link rel="prefetch" href="/assets/js/61.3712f8fe.js"><link rel="prefetch" href="/assets/js/8.899a0731.js"><link rel="prefetch" href="/assets/js/9.e2e8da12.js"><link rel="prefetch" href="/assets/js/vendors~docsearch.303532f0.js">
<link rel="stylesheet" href="/assets/css/0.styles.de075592.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><div class="theme-antdocs-content page-404"><h1>404</h1> <blockquote>How did we get here?</blockquote> <a href="/" class="router-link-active">
Take me home.
</a></div></div><div class="global-ui"></div></div>
<script src="/assets/js/app.cf958133.js" defer></script><script src="/assets/js/5.073233e8.js" defer></script>
</body>
</html>

1
CNAME Normal file
View File

@ -0,0 +1 @@
framework.zhamao.me

107
advanced/custom-start.html Normal file
View File

@ -0,0 +1,107 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<title>框架高级启动 | 炸毛框架 v3</title>
<meta name="description" content="">
<meta name="generator" content="VuePress 1.9.10">
<link rel="icon" href="/logo_trans.png">
<script>
var _hmt = _hmt || [];
(function () {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?f0f276cefa10aa31a20ae3815a50b795";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
<meta name="description" content="一个高性能聊天机器人 + Web 框架">
<link rel="preload" href="/assets/css/0.styles.de075592.css" as="style"><link rel="preload" href="/assets/js/app.cf958133.js" as="script"><link rel="preload" href="/assets/js/2.4c04991c.js" as="script"><link rel="preload" href="/assets/js/1.d8755a39.js" as="script"><link rel="preload" href="/assets/js/25.b0d69869.js" as="script"><link rel="prefetch" href="/assets/js/10.960912c3.js"><link rel="prefetch" href="/assets/js/11.cd171694.js"><link rel="prefetch" href="/assets/js/12.ff9ca1d1.js"><link rel="prefetch" href="/assets/js/13.a56deac8.js"><link rel="prefetch" href="/assets/js/14.b222a011.js"><link rel="prefetch" href="/assets/js/15.31489867.js"><link rel="prefetch" href="/assets/js/16.e921dbc4.js"><link rel="prefetch" href="/assets/js/17.58f730d3.js"><link rel="prefetch" href="/assets/js/18.26c46c49.js"><link rel="prefetch" href="/assets/js/19.ee0bfd3b.js"><link rel="prefetch" href="/assets/js/20.bb3578b8.js"><link rel="prefetch" href="/assets/js/21.e66f7fe5.js"><link rel="prefetch" href="/assets/js/22.cba8ca48.js"><link rel="prefetch" href="/assets/js/23.cb49f41c.js"><link rel="prefetch" href="/assets/js/24.d95b175a.js"><link rel="prefetch" href="/assets/js/26.8e7089c0.js"><link rel="prefetch" href="/assets/js/27.333a53a1.js"><link rel="prefetch" href="/assets/js/28.df4b871c.js"><link rel="prefetch" href="/assets/js/29.5427ad45.js"><link rel="prefetch" href="/assets/js/3.07fc018e.js"><link rel="prefetch" href="/assets/js/30.7cb7445a.js"><link rel="prefetch" href="/assets/js/31.5c4bb546.js"><link rel="prefetch" href="/assets/js/32.7fc05474.js"><link rel="prefetch" href="/assets/js/33.9684a4f8.js"><link rel="prefetch" href="/assets/js/34.83e32a28.js"><link rel="prefetch" href="/assets/js/35.95d03df6.js"><link rel="prefetch" href="/assets/js/36.80aace42.js"><link rel="prefetch" href="/assets/js/37.1eaed2ee.js"><link rel="prefetch" href="/assets/js/38.75fa7a1c.js"><link rel="prefetch" href="/assets/js/39.117f5802.js"><link rel="prefetch" href="/assets/js/4.6623271b.js"><link rel="prefetch" href="/assets/js/40.57eba153.js"><link rel="prefetch" href="/assets/js/41.89c4a7c8.js"><link rel="prefetch" href="/assets/js/42.d8f92f99.js"><link rel="prefetch" href="/assets/js/43.5ee83631.js"><link rel="prefetch" href="/assets/js/44.c09b5b0c.js"><link rel="prefetch" href="/assets/js/45.bd850606.js"><link rel="prefetch" href="/assets/js/46.732b1cef.js"><link rel="prefetch" href="/assets/js/47.2a872d0d.js"><link rel="prefetch" href="/assets/js/48.959e18f4.js"><link rel="prefetch" href="/assets/js/49.a9bb32f7.js"><link rel="prefetch" href="/assets/js/5.073233e8.js"><link rel="prefetch" href="/assets/js/50.ca90a854.js"><link rel="prefetch" href="/assets/js/51.79142530.js"><link rel="prefetch" href="/assets/js/52.fe63ad16.js"><link rel="prefetch" href="/assets/js/53.ed84845a.js"><link rel="prefetch" href="/assets/js/54.3ab7e492.js"><link rel="prefetch" href="/assets/js/55.9028e407.js"><link rel="prefetch" href="/assets/js/56.8173f798.js"><link rel="prefetch" href="/assets/js/57.2166b068.js"><link rel="prefetch" href="/assets/js/58.7c52b6bf.js"><link rel="prefetch" href="/assets/js/59.e9965a7b.js"><link rel="prefetch" href="/assets/js/60.f277436c.js"><link rel="prefetch" href="/assets/js/61.3712f8fe.js"><link rel="prefetch" href="/assets/js/8.899a0731.js"><link rel="prefetch" href="/assets/js/9.e2e8da12.js"><link rel="prefetch" href="/assets/js/vendors~docsearch.303532f0.js">
<link rel="stylesheet" href="/assets/css/0.styles.de075592.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="ant-row"><div class="nav-button"><i aria-label="icon: bars" class="anticon anticon-bars"><svg viewBox="0 0 1024 1024" focusable="false" data-icon="bars" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M912 192H328c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 284H328c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 284H328c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM104 228a56 56 0 1 0 112 0 56 56 0 1 0-112 0zm0 284a56 56 0 1 0 112 0 56 56 0 1 0-112 0zm0 284a56 56 0 1 0 112 0 56 56 0 1 0-112 0z"></path></svg></i> <span></span></div> <div class="ant-col ant-col-xs-24 ant-col-sm-24 ant-col-md-6 ant-col-lg-6 ant-col-xl-5 ant-col-xxl-4"><a href="/" class="router-link-active home-link"><img src="/logo_trans.png" alt="炸毛框架 v3" class="logo"> <span class="site-name">炸毛框架 v3</span></a> <div class="search-box mobile-search"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div></div> <div class="nav-space-between ant-col ant-col-xs-0 ant-col-sm-0 ant-col-md-18 ant-col-lg-18 ant-col-xl-19 ant-col-xxl-20"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><ul role="menu" id="nav" class="ant-menu ant-menu-horizontal ant-menu-root ant-menu-light"><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/guide/">
指南
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/event/">
事件
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/components/bot/bot-context.html">
组件
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/plugins/management.html">
插件
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item ant-menu-item-selected"><a href="/advanced/" class="router-link-active">
进阶
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/update/v3.html">
更新日志
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/doxy/" target="_blank">
API 文档
<i aria-label="icon: link" class="anticon anticon-link"><svg viewBox="64 64 896 896" focusable="false" data-icon="link" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M574 665.4a8.03 8.03 0 0 0-11.3 0L446.5 781.6c-53.8 53.8-144.6 59.5-204 0-59.5-59.5-53.8-150.2 0-204l116.2-116.2c3.1-3.1 3.1-8.2 0-11.3l-39.8-39.8a8.03 8.03 0 0 0-11.3 0L191.4 526.5c-84.6 84.6-84.6 221.5 0 306s221.5 84.6 306 0l116.2-116.2c3.1-3.1 3.1-8.2 0-11.3L574 665.4zm258.6-474c-84.6-84.6-221.5-84.6-306 0L410.3 307.6a8.03 8.03 0 0 0 0 11.3l39.7 39.7c3.1 3.1 8.2 3.1 11.3 0l116.2-116.2c53.8-53.8 144.6-59.5 204 0 59.5 59.5 53.8 150.2 0 204L665.3 562.6a8.03 8.03 0 0 0 0 11.3l39.8 39.8c3.1 3.1 8.2 3.1 11.3 0l116.2-116.2c84.5-84.6 84.5-221.5 0-306.1zM610.1 372.3a8.03 8.03 0 0 0-11.3 0L372.3 598.7a8.03 8.03 0 0 0 0 11.3l39.6 39.6c3.1 3.1 8.2 3.1 11.3 0l226.4-226.4c3.1-3.1 3.1-8.2 0-11.3l-39.5-39.6z"></path></svg></i></a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="https://docs-v2.zhamao.xin/" target="_blank">
炸毛框架 v2
<i aria-label="icon: link" class="anticon anticon-link"><svg viewBox="64 64 896 896" focusable="false" data-icon="link" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M574 665.4a8.03 8.03 0 0 0-11.3 0L446.5 781.6c-53.8 53.8-144.6 59.5-204 0-59.5-59.5-53.8-150.2 0-204l116.2-116.2c3.1-3.1 3.1-8.2 0-11.3l-39.8-39.8a8.03 8.03 0 0 0-11.3 0L191.4 526.5c-84.6 84.6-84.6 221.5 0 306s221.5 84.6 306 0l116.2-116.2c3.1-3.1 3.1-8.2 0-11.3L574 665.4zm258.6-474c-84.6-84.6-221.5-84.6-306 0L410.3 307.6a8.03 8.03 0 0 0 0 11.3l39.7 39.7c3.1 3.1 8.2 3.1 11.3 0l116.2-116.2c53.8-53.8 144.6-59.5 204 0 59.5 59.5 53.8 150.2 0 204L665.3 562.6a8.03 8.03 0 0 0 0 11.3l39.8 39.8c3.1 3.1 8.2 3.1 11.3 0l116.2-116.2c84.5-84.6 84.5-221.5 0-306.1zM610.1 372.3a8.03 8.03 0 0 0-11.3 0L372.3 598.7a8.03 8.03 0 0 0 0 11.3l39.6 39.6c3.1 3.1 8.2 3.1 11.3 0l226.4-226.4c3.1-3.1 3.1-8.2 0-11.3l-39.5-39.6z"></path></svg></i></a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="visibility:hidden;position:absolute;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li></ul> <ul class="extra-group"><li><a href="https://github.com/zhamao-robot/zhamao-framework" target="_blank" rel="noopener noreferrer" class="repo-link"><i aria-label="icon: github" class="anticon anticon-github"><svg viewBox="64 64 896 896" focusable="false" data-icon="github" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M511.6 76.3C264.3 76.2 64 276.4 64 523.5 64 718.9 189.3 885 363.8 946c23.5 5.9 19.9-10.8 19.9-22.2v-77.5c-135.7 15.9-141.2-73.9-150.3-88.9C215 726 171.5 718 184.5 703c30.9-15.9 62.4 4 98.9 57.9 26.4 39.1 77.9 32.5 104 26 5.7-23.5 17.9-44.5 34.7-60.8-140.6-25.2-199.2-111-199.2-213 0-49.5 16.3-95 48.3-131.7-20.4-60.5 1.9-112.3 4.9-120 58.1-5.2 118.5 41.6 123.2 45.3 33-8.9 70.7-13.6 112.9-13.6 42.4 0 80.2 4.9 113.5 13.9 11.3-8.6 67.3-48.8 121.3-43.9 2.9 7.7 24.7 58.3 5.5 118 32.4 36.8 48.9 82.7 48.9 132.3 0 102.2-59 188.1-200 212.9a127.5 127.5 0 0 1 38.1 91v112.5c.8 9 0 17.9 15 17.9 177.1-59.7 304.6-227 304.6-424.1 0-247.2-200.4-447.3-447.5-447.3z"></path></svg></i></a></li> <!----></ul></nav></div></div> <!----></header> <aside class="sidebar"><!----> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>进阶</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/advanced/" aria-current="page" title="进阶" class="sidebar-link">进阶</a></li><li><a href="/advanced/multi-process.html" title="框架的多进程" class="sidebar-link">框架的多进程</a></li><li><a href="/advanced/custom-start.html" aria-current="page" title="框架高级启动" class="active sidebar-link">框架高级启动</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/advanced/custom-start.html#框架安装方式" title="框架安装方式" class="sidebar-link">框架安装方式</a></li><li class="sidebar-sub-header"><a href="/advanced/custom-start.html#框架启动参数" title="框架启动参数" class="sidebar-link">框架启动参数</a></li></ul></li></ul></section></li></ul> </aside> <main class="page has-page-anchor"> <div class="theme-antdocs-content content__default"><h1 id="框架高级启动"><a href="#框架高级启动" class="header-anchor">#</a> 框架高级启动</h1> <h2 id="框架安装方式"><a href="#框架安装方式" class="header-anchor">#</a> 框架安装方式</h2> <p>框架提供了多种安装和运行的方式。</p> <ul><li>Composer 库引入模式</li> <li>源码模式</li> <li>Phar Composer 库引入模式</li> <li>Phar 源码模式</li> <li>单文件模式</li></ul> <h3 id="composer-库引入模式"><a href="#composer-库引入模式" class="header-anchor">#</a> Composer 库引入模式</h3> <p>框架在最初的指南教程中,给出的安装方式是 Composer 库引入模式,这种模式安装框架也是比较灵活的。
Composer 库引入模式,顾名思义就是把框架本体当作一个 Composer 库来引入,这样就可以通过 Composer 来管理框架的版本,例如使用 <code>composer update</code> 更新。</p> <p>Composer 库引入模式的文件夹结构如下,我们假设你的项目目录为 <code>/root/zhamao-v3</code></p> <div class="language- line-numbers-mode"><pre class="language-text"><code>/root/zhamao-v3/
├── composer.json // 引入框架和项目的 composer.json 描述文件
├── composer.lock // Composer 生成的 lock 文件
├── config/ // 炸毛框架依赖的全局配置文件
│ ├── global.php // 全局配置文件,大部分配置项在这里配置
│ ├── container.php // 框架的容器配置文件
│ └── motd.txt // 框架启动时的 MOTD 提示语
├── plugins/ // 开发者编写和安装的插件目录
│ ├── example/ // 插件示例,这里以名称为 example 的插件为例
│ │ ├── main.php // 这个插件使用了单文件格式main.php 为插件的核心代码
│ │ └── composer.json // 这个文件描述了炸毛框架插件的元信息,包括插件名称、版本、作者等
├── vendor/ // 你自身项目的依赖库,由 Composer 生成
│ ├── zhamao/
│ │ └── framework/ // 框架的本体源码根目录
│ │ ├── src/ZM/ // 框架的核心代码
│ │ └── ...... // 框架的根目录其他文件
│ └── ....... // 其他依赖库
├── zhamao // 启动炸毛框架的入口文件
└── zm_data/ // 存放框架依赖的持久化数据目录,如日志、缓存等
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br></div></div><h3 id="源码模式"><a href="#源码模式" class="header-anchor">#</a> 源码模式</h3> <p>源码模式不是指开发者的源码,而是框架的源码。也就是说,源码模式是从 GitHub 直接拉取框架源码仓库后使用框架的模式。
源码模式允许你对框架本身进行一系列修改,框架本体就可以直接运行。例如,你可以在框架的源码中添加一些自己的代码,或者修改框架的某些功能。</p> <p>源码模式的结构和 Composer 库引入模式有些许不同,因为框架本身就是一个项目,所以它的目录结构也是一个项目的目录结构。</p> <div class="language- line-numbers-mode"><pre class="language-text"><code>/root/zhamao-framework/
├── composer.json // 框架本身的 composer.json
├── composer.lock // Composer 生成的 lock 文件
├── config/ // 炸毛框架依赖的全局配置文件
│ ├── global.php // 全局配置文件,大部分配置项在这里配置
│ ├── container.php // 框架的容器配置文件
│ └── motd.txt // 框架启动时的 MOTD 提示语
├── plugins/ // 开发者编写和安装的插件目录
│ ├── example/ // 插件示例,这里以名称为 example 的插件为例
│ │ ├── main.php // 这个插件使用了单文件格式main.php 为插件的核心代码
│ │ └── composer.json // 这个文件描述了炸毛框架插件的元信息,包括插件名称、版本、作者等
├── src/ // 框架的本体源码根目录
│ ├── ZM/ // 框架的核心代码
│ └── ...... // 框架的根目录其他文件
├── vendor/ // 框架本身依赖的 Composer 库文件夹
│ └── ....... // 其他依赖库
├── zhamao // 启动炸毛框架的入口文件
└── zm_data/ // 存放框架依赖的持久化数据目录,如日志、缓存等
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br></div></div><p>源码模式下你可以在 <code>src/</code> 目录编写你的项目或修改框架源码运行,此时在 <code>src/</code> 下的代码虽然在设置 psr-4 自动加载后会被框架解析,但在该目录下的代码不属于插件的范畴。
如果你不喜欢在插件的形式下开发自己的功能,也可以直接在 src 目录下编写代码。这种方式除了源码模式外Composer 库引入模式下也可以在你的目录新建一个 <code>src/</code> 文件夹并设置自动加载,
以实现在非插件环境下加载你的项目。</p> <h3 id="phar-模式"><a href="#phar-模式" class="header-anchor">#</a> Phar 模式</h3> <p>Phar 模式的意思是将框架和依赖的相关 Composer 库打包为一个可直接使用的 Phar 文件,框架必需的依赖(除 PECL 扩展外)均被包含在一个文件内,方便框架本体分发。</p> <p>Phar 模式主要面向发布到生产环境和减少小文件,但使用 Phar 模式不便于依赖的更新,所有依赖的库将锁定在打包时的版本。</p> <p>Phar 模式也分两个小种类Composer 库引入模式和源码模式。如果你不关注框架本体目录,仅开发功能,无论使用插件形式还是 <code>src/</code> 形式,那么在使用上这两种方式没有区别。</p> <p>框架在未来发布版本时,会同时发布一个打包好的 Phar 版本,你可以直接下载使用。</p> <p>在使用 Phar 时,你的目录结构可能为这样:</p> <div class="language- line-numbers-mode"><pre class="language-text"><code>/root/your-zhamao-app/
├── plugins/ // 开发者编写和安装的插件目录
│ ├── example/ // 插件示例,这里以名称为 example 的插件为例
│ │ ├── main.php // 这个插件使用了单文件格式main.php 为插件的核心代码
│ │ └── composer.json // 这个文件描述了炸毛框架插件的元信息,包括插件名称、版本、作者等
├── config/ // 配置文件目录
├── zhamao.phar // 炸毛框架本体的 Phar
├── zm_data/ // 存放框架依赖的持久化数据目录,如日志、缓存等
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div><h3 id="单文件模式"><a href="#单文件模式" class="header-anchor">#</a> 单文件模式</h3> <p>单文件模式和 Phar 模式几乎一样,单文件模式为一个单独的二进制文件,这个二进制文件使用 phpmicro 项目的打包功能将 php-cli 和炸毛框架的 Phar 合成为一个文件,
即可直接使用。这种方式的好处是不需要额外的 php-cli 环境,但是文件体积会比 Phar 模式大一些。</p> <h2 id="框架启动参数"><a href="#框架启动参数" class="header-anchor">#</a> 框架启动参数</h2> <p>框架启动时可以传入一些参数,这些命令行参数是用于框架启动时的配置。</p> <blockquote><p>这里框架启动参数指的是 <code>./zhamao server</code> 启动框架的参数,而不是 <code>./zhamao</code> 命令的参数。有关 <code>./zhamao</code> 命令的其他功能,可以参考 <a href="/components/common/cli.html">组件 - 命令行</a></p></blockquote> <h3 id="config-dir"><a href="#config-dir" class="header-anchor">#</a> --config-dir</h3> <p>指定配置文件目录,如果不指定,框架会使用默认的配置文件目录。</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>./zhamao server --config-dir<span class="token operator">=</span>/path/to/your/config/dir
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><h3 id="driver"><a href="#driver" class="header-anchor">#</a> --driver</h3> <p>指定框架使用的驱动,目前支持 <code>swoole</code><code>workerman</code> 两种驱动,如果不指定,框架会采用 <code>config/global.php</code> 配置文件内的驱动。</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>./zhamao server <span class="token parameter variable">--driver</span><span class="token operator">=</span>swoole
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><h3 id="log-level"><a href="#log-level" class="header-anchor">#</a> --log-level</h3> <p>指定框架组件 zhamao/logger 显示日志的等级。logger 组件符合 psr-3 日志接口,支持设置 8 个等级:</p> <p><code>emergency</code><code>alert</code><code>critical</code><code>error</code><code>warning</code><code>notice</code><code>info</code><code>debug</code></p> <div class="custom-block warning"><p class="custom-block-title">注意</p> <p>如果你想采用其他 psr-3 日志组件,此配置无效。</p></div> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>./zhamao server --log-level<span class="token operator">=</span>debug
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><h3 id="daemon"><a href="#daemon" class="header-anchor">#</a> --daemon</h3> <p>以守护进程模式启动框架。此参数将直接在输出 motd 后将进程挂到 init 下运行,后台常驻。</p> <blockquote><p>单进程模式下,此参数无效。</p></blockquote> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>./zhamao server <span class="token parameter variable">--daemon</span> <span class="token comment"># 执行后,你可以退出当前终端而不退出框架</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><h3 id="worker-num"><a href="#worker-num" class="header-anchor">#</a> --worker-num</h3> <p>指定框架启动的 worker 进程数。未指定时默认采用 <code>config/global.php</code> 下对应驱动的配置(默认为 1</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>./zhamao server --worker-num<span class="token operator">=</span><span class="token number">8</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><div class="custom-block warning"><p class="custom-block-title">注意</p> <ul><li>在启动多 worker 时,需要注意无法使用 LightCache必须切换为 KVRedis 等支持跨进程的组件。</li> <li>Windows 环境不支持设置进程数。</li></ul></div> <h3 id="watch"><a href="#watch" class="header-anchor">#</a> --watch</h3> <p>启动框架的热更新,并启用调试模式。</p> <blockquote><p>此功能暂未完成,敬请期待。</p></blockquote> <h3 id="env"><a href="#env" class="header-anchor">#</a> --env</h3> <p>设置环境类型 (production, development, staging)。</p> <p>如果不设置此参数,框架默认使用 development 环境类型。</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>./zhamao server <span class="token parameter variable">--env</span><span class="token operator">=</span>production
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><h3 id="disable-safe-exit"><a href="#disable-safe-exit" class="header-anchor">#</a> --disable-safe-exit</h3> <p>禁用安全退出。如果不设置此参数,框架会在收到 SIGINT 信号时,等待所有请求处理完毕后再退出。
设置此参数后,使用键盘 Ctrl+C 会立刻停止所有进程,不会执行退出框架的正常流程,例如保存 LightCache 持久化数据等。</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>./zhamao server --disable-safe-exit
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><h3 id="no-state-check"><a href="#no-state-check" class="header-anchor">#</a> --no-state-check</h3> <p>取消框架在启动前的重复启动检查。如果不设置此参数,框架会在启动前检查是否有其他进程正在运行,如果有则会退出。
设置此参数后,框架会忽略重复启动检查,可能会导致多个框架进程同时运行。</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>./zhamao server --no-state-check
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><h3 id="private-mode"><a href="#private-mode" class="header-anchor">#</a> --private-mode</h3> <p>启动时隐藏框架的配置信息和 MOTD避免打印到终端。配合 logger 组件的选项可以达到启动时除紧急日志外没有任何输出内容到终端。</p> <div class="language-bash line-numbers-mode"><pre class="language-bash"><code>./zhamao server --private-mode
./zhamao server --private-mode --log-level<span class="token operator">=</span>emergency
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/zhamao-robot/zhamao-framework/edit/main/docs/advanced/custom-start.md" target="_blank" rel="noopener noreferrer">Edit this page</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev"><a href="/advanced/multi-process.html" class="prev"><i aria-label="icon: left" class="anticon anticon-left"><svg viewBox="64 64 896 896" focusable="false" data-icon="left" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M724 218.3V141c0-6.7-7.7-10.4-12.9-6.3L260.3 486.8a31.86 31.86 0 0 0 0 50.3l450.8 352.1c5.3 4.1 12.9.4 12.9-6.3v-77.3c0-4.9-2.3-9.6-6.1-12.6l-360-281 360-281.1c3.8-3 6.1-7.7 6.1-12.6z"></path></svg></i>
框架的多进程
</a></span> <!----></p></div> <div class="page-anchor"><div class="ant-space ant-space-vertical" style="width:100%;"><div class="ant-space-item"><div class="page-anchor-offset"><div><div class="ant-anchor-wrapper" style="max-height:100vh;"><div class="ant-anchor"><div class="ant-anchor-ink"><span class="ant-anchor-ink-ball"></span></div><div class="ant-anchor-link"><a href="#框架安装方式" title="框架安装方式" class="ant-anchor-link-title">框架安装方式</a><div class="ant-anchor-link"><a href="#composer-库引入模式" title="Composer 库引入模式" class="ant-anchor-link-title">Composer 库引入模式</a></div><div class="ant-anchor-link"><a href="#源码模式" title="源码模式" class="ant-anchor-link-title">源码模式</a></div><div class="ant-anchor-link"><a href="#phar-模式" title="Phar 模式" class="ant-anchor-link-title">Phar 模式</a></div><div class="ant-anchor-link"><a href="#单文件模式" title="单文件模式" class="ant-anchor-link-title">单文件模式</a></div></div><div class="ant-anchor-link"><a href="#框架启动参数" title="框架启动参数" class="ant-anchor-link-title">框架启动参数</a><div class="ant-anchor-link"><a href="#config-dir" title="--config-dir" class="ant-anchor-link-title">--config-dir</a></div><div class="ant-anchor-link"><a href="#driver" title="--driver" class="ant-anchor-link-title">--driver</a></div><div class="ant-anchor-link"><a href="#log-level" title="--log-level" class="ant-anchor-link-title">--log-level</a></div><div class="ant-anchor-link"><a href="#daemon" title="--daemon" class="ant-anchor-link-title">--daemon</a></div><div class="ant-anchor-link"><a href="#worker-num" title="--worker-num" class="ant-anchor-link-title">--worker-num</a></div><div class="ant-anchor-link"><a href="#watch" title="--watch" class="ant-anchor-link-title">--watch</a></div><div class="ant-anchor-link"><a href="#env" title="--env" class="ant-anchor-link-title">--env</a></div><div class="ant-anchor-link"><a href="#disable-safe-exit" title="--disable-safe-exit" class="ant-anchor-link-title">--disable-safe-exit</a></div><div class="ant-anchor-link"><a href="#no-state-check" title="--no-state-check" class="ant-anchor-link-title">--no-state-check</a></div><div class="ant-anchor-link"><a href="#private-mode" title="--private-mode" class="ant-anchor-link-title">--private-mode</a></div></div></div></div></div></div></div></div></div> </main> <!----></div><div class="global-ui"></div></div>
<script src="/assets/js/app.cf958133.js" defer></script><script src="/assets/js/2.4c04991c.js" defer></script><script src="/assets/js/1.d8755a39.js" defer></script><script src="/assets/js/25.b0d69869.js" defer></script>
</body>
</html>

45
advanced/index.html Normal file
View File

@ -0,0 +1,45 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<title>进阶 | 炸毛框架 v3</title>
<meta name="description" content="">
<meta name="generator" content="VuePress 1.9.10">
<link rel="icon" href="/logo_trans.png">
<script>
var _hmt = _hmt || [];
(function () {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?f0f276cefa10aa31a20ae3815a50b795";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
<meta name="description" content="一个高性能聊天机器人 + Web 框架">
<link rel="preload" href="/assets/css/0.styles.de075592.css" as="style"><link rel="preload" href="/assets/js/app.cf958133.js" as="script"><link rel="preload" href="/assets/js/2.4c04991c.js" as="script"><link rel="preload" href="/assets/js/1.d8755a39.js" as="script"><link rel="preload" href="/assets/js/24.d95b175a.js" as="script"><link rel="prefetch" href="/assets/js/10.960912c3.js"><link rel="prefetch" href="/assets/js/11.cd171694.js"><link rel="prefetch" href="/assets/js/12.ff9ca1d1.js"><link rel="prefetch" href="/assets/js/13.a56deac8.js"><link rel="prefetch" href="/assets/js/14.b222a011.js"><link rel="prefetch" href="/assets/js/15.31489867.js"><link rel="prefetch" href="/assets/js/16.e921dbc4.js"><link rel="prefetch" href="/assets/js/17.58f730d3.js"><link rel="prefetch" href="/assets/js/18.26c46c49.js"><link rel="prefetch" href="/assets/js/19.ee0bfd3b.js"><link rel="prefetch" href="/assets/js/20.bb3578b8.js"><link rel="prefetch" href="/assets/js/21.e66f7fe5.js"><link rel="prefetch" href="/assets/js/22.cba8ca48.js"><link rel="prefetch" href="/assets/js/23.cb49f41c.js"><link rel="prefetch" href="/assets/js/25.b0d69869.js"><link rel="prefetch" href="/assets/js/26.8e7089c0.js"><link rel="prefetch" href="/assets/js/27.333a53a1.js"><link rel="prefetch" href="/assets/js/28.df4b871c.js"><link rel="prefetch" href="/assets/js/29.5427ad45.js"><link rel="prefetch" href="/assets/js/3.07fc018e.js"><link rel="prefetch" href="/assets/js/30.7cb7445a.js"><link rel="prefetch" href="/assets/js/31.5c4bb546.js"><link rel="prefetch" href="/assets/js/32.7fc05474.js"><link rel="prefetch" href="/assets/js/33.9684a4f8.js"><link rel="prefetch" href="/assets/js/34.83e32a28.js"><link rel="prefetch" href="/assets/js/35.95d03df6.js"><link rel="prefetch" href="/assets/js/36.80aace42.js"><link rel="prefetch" href="/assets/js/37.1eaed2ee.js"><link rel="prefetch" href="/assets/js/38.75fa7a1c.js"><link rel="prefetch" href="/assets/js/39.117f5802.js"><link rel="prefetch" href="/assets/js/4.6623271b.js"><link rel="prefetch" href="/assets/js/40.57eba153.js"><link rel="prefetch" href="/assets/js/41.89c4a7c8.js"><link rel="prefetch" href="/assets/js/42.d8f92f99.js"><link rel="prefetch" href="/assets/js/43.5ee83631.js"><link rel="prefetch" href="/assets/js/44.c09b5b0c.js"><link rel="prefetch" href="/assets/js/45.bd850606.js"><link rel="prefetch" href="/assets/js/46.732b1cef.js"><link rel="prefetch" href="/assets/js/47.2a872d0d.js"><link rel="prefetch" href="/assets/js/48.959e18f4.js"><link rel="prefetch" href="/assets/js/49.a9bb32f7.js"><link rel="prefetch" href="/assets/js/5.073233e8.js"><link rel="prefetch" href="/assets/js/50.ca90a854.js"><link rel="prefetch" href="/assets/js/51.79142530.js"><link rel="prefetch" href="/assets/js/52.fe63ad16.js"><link rel="prefetch" href="/assets/js/53.ed84845a.js"><link rel="prefetch" href="/assets/js/54.3ab7e492.js"><link rel="prefetch" href="/assets/js/55.9028e407.js"><link rel="prefetch" href="/assets/js/56.8173f798.js"><link rel="prefetch" href="/assets/js/57.2166b068.js"><link rel="prefetch" href="/assets/js/58.7c52b6bf.js"><link rel="prefetch" href="/assets/js/59.e9965a7b.js"><link rel="prefetch" href="/assets/js/60.f277436c.js"><link rel="prefetch" href="/assets/js/61.3712f8fe.js"><link rel="prefetch" href="/assets/js/8.899a0731.js"><link rel="prefetch" href="/assets/js/9.e2e8da12.js"><link rel="prefetch" href="/assets/js/vendors~docsearch.303532f0.js">
<link rel="stylesheet" href="/assets/css/0.styles.de075592.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="ant-row"><div class="nav-button"><i aria-label="icon: bars" class="anticon anticon-bars"><svg viewBox="0 0 1024 1024" focusable="false" data-icon="bars" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M912 192H328c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 284H328c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 284H328c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM104 228a56 56 0 1 0 112 0 56 56 0 1 0-112 0zm0 284a56 56 0 1 0 112 0 56 56 0 1 0-112 0zm0 284a56 56 0 1 0 112 0 56 56 0 1 0-112 0z"></path></svg></i> <span></span></div> <div class="ant-col ant-col-xs-24 ant-col-sm-24 ant-col-md-6 ant-col-lg-6 ant-col-xl-5 ant-col-xxl-4"><a href="/" class="router-link-active home-link"><img src="/logo_trans.png" alt="炸毛框架 v3" class="logo"> <span class="site-name">炸毛框架 v3</span></a> <div class="search-box mobile-search"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div></div> <div class="nav-space-between ant-col ant-col-xs-0 ant-col-sm-0 ant-col-md-18 ant-col-lg-18 ant-col-xl-19 ant-col-xxl-20"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><ul role="menu" id="nav" class="ant-menu ant-menu-horizontal ant-menu-root ant-menu-light"><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/guide/">
指南
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/event/">
事件
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/components/bot/bot-context.html">
组件
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/plugins/management.html">
插件
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item ant-menu-item-selected"><a href="/advanced/" aria-current="page" class="router-link-exact-active router-link-active">
进阶
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/update/v3.html">
更新日志
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/doxy/" target="_blank">
API 文档
<i aria-label="icon: link" class="anticon anticon-link"><svg viewBox="64 64 896 896" focusable="false" data-icon="link" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M574 665.4a8.03 8.03 0 0 0-11.3 0L446.5 781.6c-53.8 53.8-144.6 59.5-204 0-59.5-59.5-53.8-150.2 0-204l116.2-116.2c3.1-3.1 3.1-8.2 0-11.3l-39.8-39.8a8.03 8.03 0 0 0-11.3 0L191.4 526.5c-84.6 84.6-84.6 221.5 0 306s221.5 84.6 306 0l116.2-116.2c3.1-3.1 3.1-8.2 0-11.3L574 665.4zm258.6-474c-84.6-84.6-221.5-84.6-306 0L410.3 307.6a8.03 8.03 0 0 0 0 11.3l39.7 39.7c3.1 3.1 8.2 3.1 11.3 0l116.2-116.2c53.8-53.8 144.6-59.5 204 0 59.5 59.5 53.8 150.2 0 204L665.3 562.6a8.03 8.03 0 0 0 0 11.3l39.8 39.8c3.1 3.1 8.2 3.1 11.3 0l116.2-116.2c84.5-84.6 84.5-221.5 0-306.1zM610.1 372.3a8.03 8.03 0 0 0-11.3 0L372.3 598.7a8.03 8.03 0 0 0 0 11.3l39.6 39.6c3.1 3.1 8.2 3.1 11.3 0l226.4-226.4c3.1-3.1 3.1-8.2 0-11.3l-39.5-39.6z"></path></svg></i></a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="https://docs-v2.zhamao.xin/" target="_blank">
炸毛框架 v2
<i aria-label="icon: link" class="anticon anticon-link"><svg viewBox="64 64 896 896" focusable="false" data-icon="link" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M574 665.4a8.03 8.03 0 0 0-11.3 0L446.5 781.6c-53.8 53.8-144.6 59.5-204 0-59.5-59.5-53.8-150.2 0-204l116.2-116.2c3.1-3.1 3.1-8.2 0-11.3l-39.8-39.8a8.03 8.03 0 0 0-11.3 0L191.4 526.5c-84.6 84.6-84.6 221.5 0 306s221.5 84.6 306 0l116.2-116.2c3.1-3.1 3.1-8.2 0-11.3L574 665.4zm258.6-474c-84.6-84.6-221.5-84.6-306 0L410.3 307.6a8.03 8.03 0 0 0 0 11.3l39.7 39.7c3.1 3.1 8.2 3.1 11.3 0l116.2-116.2c53.8-53.8 144.6-59.5 204 0 59.5 59.5 53.8 150.2 0 204L665.3 562.6a8.03 8.03 0 0 0 0 11.3l39.8 39.8c3.1 3.1 8.2 3.1 11.3 0l116.2-116.2c84.5-84.6 84.5-221.5 0-306.1zM610.1 372.3a8.03 8.03 0 0 0-11.3 0L372.3 598.7a8.03 8.03 0 0 0 0 11.3l39.6 39.6c3.1 3.1 8.2 3.1 11.3 0l226.4-226.4c3.1-3.1 3.1-8.2 0-11.3l-39.5-39.6z"></path></svg></i></a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="visibility:hidden;position:absolute;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li></ul> <ul class="extra-group"><li><a href="https://github.com/zhamao-robot/zhamao-framework" target="_blank" rel="noopener noreferrer" class="repo-link"><i aria-label="icon: github" class="anticon anticon-github"><svg viewBox="64 64 896 896" focusable="false" data-icon="github" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M511.6 76.3C264.3 76.2 64 276.4 64 523.5 64 718.9 189.3 885 363.8 946c23.5 5.9 19.9-10.8 19.9-22.2v-77.5c-135.7 15.9-141.2-73.9-150.3-88.9C215 726 171.5 718 184.5 703c30.9-15.9 62.4 4 98.9 57.9 26.4 39.1 77.9 32.5 104 26 5.7-23.5 17.9-44.5 34.7-60.8-140.6-25.2-199.2-111-199.2-213 0-49.5 16.3-95 48.3-131.7-20.4-60.5 1.9-112.3 4.9-120 58.1-5.2 118.5 41.6 123.2 45.3 33-8.9 70.7-13.6 112.9-13.6 42.4 0 80.2 4.9 113.5 13.9 11.3-8.6 67.3-48.8 121.3-43.9 2.9 7.7 24.7 58.3 5.5 118 32.4 36.8 48.9 82.7 48.9 132.3 0 102.2-59 188.1-200 212.9a127.5 127.5 0 0 1 38.1 91v112.5c.8 9 0 17.9 15 17.9 177.1-59.7 304.6-227 304.6-424.1 0-247.2-200.4-447.3-447.5-447.3z"></path></svg></i></a></li> <!----></ul></nav></div></div> <!----></header> <aside class="sidebar"><!----> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>进阶</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/advanced/" aria-current="page" title="进阶" class="active sidebar-link">进阶</a></li><li><a href="/advanced/multi-process.html" title="框架的多进程" class="sidebar-link">框架的多进程</a></li><li><a href="/advanced/custom-start.html" title="框架高级启动" class="sidebar-link">框架高级启动</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-antdocs-content content__default"><h1 id="进阶"><a href="#进阶" class="header-anchor">#</a> 进阶</h1> <p>在本章,下面的部分将详细说明一些具体的案例和自定义框架的操作。</p> <blockquote><p>更多进阶教程敬请期待....(或者你可以选择提 Issue 到框架 GitHub有需求就写入文档</p></blockquote></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/zhamao-robot/zhamao-framework/edit/main/docs/advanced/README.md" target="_blank" rel="noopener noreferrer">Edit this page</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><!----> <span class="next"><a href="/advanced/multi-process.html">
框架的多进程
<i aria-label="icon: right" class="anticon anticon-right"><svg viewBox="64 64 896 896" focusable="false" data-icon="right" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M765.7 486.8L314.9 134.7A7.97 7.97 0 0 0 302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 0 0 0-50.4z"></path></svg></i></a></span></p></div> <!----> </main> <!----></div><div class="global-ui"></div></div>
<script src="/assets/js/app.cf958133.js" defer></script><script src="/assets/js/2.4c04991c.js" defer></script><script src="/assets/js/1.d8755a39.js" defer></script><script src="/assets/js/24.d95b175a.js" defer></script>
</body>
</html>

View File

@ -0,0 +1,64 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<title>框架的多进程 | 炸毛框架 v3</title>
<meta name="description" content="">
<meta name="generator" content="VuePress 1.9.10">
<link rel="icon" href="/logo_trans.png">
<script>
var _hmt = _hmt || [];
(function () {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?f0f276cefa10aa31a20ae3815a50b795";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
<meta name="description" content="一个高性能聊天机器人 + Web 框架">
<link rel="preload" href="/assets/css/0.styles.de075592.css" as="style"><link rel="preload" href="/assets/js/app.cf958133.js" as="script"><link rel="preload" href="/assets/js/2.4c04991c.js" as="script"><link rel="preload" href="/assets/js/1.d8755a39.js" as="script"><link rel="preload" href="/assets/js/26.8e7089c0.js" as="script"><link rel="prefetch" href="/assets/js/10.960912c3.js"><link rel="prefetch" href="/assets/js/11.cd171694.js"><link rel="prefetch" href="/assets/js/12.ff9ca1d1.js"><link rel="prefetch" href="/assets/js/13.a56deac8.js"><link rel="prefetch" href="/assets/js/14.b222a011.js"><link rel="prefetch" href="/assets/js/15.31489867.js"><link rel="prefetch" href="/assets/js/16.e921dbc4.js"><link rel="prefetch" href="/assets/js/17.58f730d3.js"><link rel="prefetch" href="/assets/js/18.26c46c49.js"><link rel="prefetch" href="/assets/js/19.ee0bfd3b.js"><link rel="prefetch" href="/assets/js/20.bb3578b8.js"><link rel="prefetch" href="/assets/js/21.e66f7fe5.js"><link rel="prefetch" href="/assets/js/22.cba8ca48.js"><link rel="prefetch" href="/assets/js/23.cb49f41c.js"><link rel="prefetch" href="/assets/js/24.d95b175a.js"><link rel="prefetch" href="/assets/js/25.b0d69869.js"><link rel="prefetch" href="/assets/js/27.333a53a1.js"><link rel="prefetch" href="/assets/js/28.df4b871c.js"><link rel="prefetch" href="/assets/js/29.5427ad45.js"><link rel="prefetch" href="/assets/js/3.07fc018e.js"><link rel="prefetch" href="/assets/js/30.7cb7445a.js"><link rel="prefetch" href="/assets/js/31.5c4bb546.js"><link rel="prefetch" href="/assets/js/32.7fc05474.js"><link rel="prefetch" href="/assets/js/33.9684a4f8.js"><link rel="prefetch" href="/assets/js/34.83e32a28.js"><link rel="prefetch" href="/assets/js/35.95d03df6.js"><link rel="prefetch" href="/assets/js/36.80aace42.js"><link rel="prefetch" href="/assets/js/37.1eaed2ee.js"><link rel="prefetch" href="/assets/js/38.75fa7a1c.js"><link rel="prefetch" href="/assets/js/39.117f5802.js"><link rel="prefetch" href="/assets/js/4.6623271b.js"><link rel="prefetch" href="/assets/js/40.57eba153.js"><link rel="prefetch" href="/assets/js/41.89c4a7c8.js"><link rel="prefetch" href="/assets/js/42.d8f92f99.js"><link rel="prefetch" href="/assets/js/43.5ee83631.js"><link rel="prefetch" href="/assets/js/44.c09b5b0c.js"><link rel="prefetch" href="/assets/js/45.bd850606.js"><link rel="prefetch" href="/assets/js/46.732b1cef.js"><link rel="prefetch" href="/assets/js/47.2a872d0d.js"><link rel="prefetch" href="/assets/js/48.959e18f4.js"><link rel="prefetch" href="/assets/js/49.a9bb32f7.js"><link rel="prefetch" href="/assets/js/5.073233e8.js"><link rel="prefetch" href="/assets/js/50.ca90a854.js"><link rel="prefetch" href="/assets/js/51.79142530.js"><link rel="prefetch" href="/assets/js/52.fe63ad16.js"><link rel="prefetch" href="/assets/js/53.ed84845a.js"><link rel="prefetch" href="/assets/js/54.3ab7e492.js"><link rel="prefetch" href="/assets/js/55.9028e407.js"><link rel="prefetch" href="/assets/js/56.8173f798.js"><link rel="prefetch" href="/assets/js/57.2166b068.js"><link rel="prefetch" href="/assets/js/58.7c52b6bf.js"><link rel="prefetch" href="/assets/js/59.e9965a7b.js"><link rel="prefetch" href="/assets/js/60.f277436c.js"><link rel="prefetch" href="/assets/js/61.3712f8fe.js"><link rel="prefetch" href="/assets/js/8.899a0731.js"><link rel="prefetch" href="/assets/js/9.e2e8da12.js"><link rel="prefetch" href="/assets/js/vendors~docsearch.303532f0.js">
<link rel="stylesheet" href="/assets/css/0.styles.de075592.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="ant-row"><div class="nav-button"><i aria-label="icon: bars" class="anticon anticon-bars"><svg viewBox="0 0 1024 1024" focusable="false" data-icon="bars" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M912 192H328c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 284H328c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 284H328c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM104 228a56 56 0 1 0 112 0 56 56 0 1 0-112 0zm0 284a56 56 0 1 0 112 0 56 56 0 1 0-112 0zm0 284a56 56 0 1 0 112 0 56 56 0 1 0-112 0z"></path></svg></i> <span></span></div> <div class="ant-col ant-col-xs-24 ant-col-sm-24 ant-col-md-6 ant-col-lg-6 ant-col-xl-5 ant-col-xxl-4"><a href="/" class="router-link-active home-link"><img src="/logo_trans.png" alt="炸毛框架 v3" class="logo"> <span class="site-name">炸毛框架 v3</span></a> <div class="search-box mobile-search"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div></div> <div class="nav-space-between ant-col ant-col-xs-0 ant-col-sm-0 ant-col-md-18 ant-col-lg-18 ant-col-xl-19 ant-col-xxl-20"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><ul role="menu" id="nav" class="ant-menu ant-menu-horizontal ant-menu-root ant-menu-light"><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/guide/">
指南
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/event/">
事件
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/components/bot/bot-context.html">
组件
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/plugins/management.html">
插件
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item ant-menu-item-selected"><a href="/advanced/" class="router-link-active">
进阶
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/update/v3.html">
更新日志
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/doxy/" target="_blank">
API 文档
<i aria-label="icon: link" class="anticon anticon-link"><svg viewBox="64 64 896 896" focusable="false" data-icon="link" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M574 665.4a8.03 8.03 0 0 0-11.3 0L446.5 781.6c-53.8 53.8-144.6 59.5-204 0-59.5-59.5-53.8-150.2 0-204l116.2-116.2c3.1-3.1 3.1-8.2 0-11.3l-39.8-39.8a8.03 8.03 0 0 0-11.3 0L191.4 526.5c-84.6 84.6-84.6 221.5 0 306s221.5 84.6 306 0l116.2-116.2c3.1-3.1 3.1-8.2 0-11.3L574 665.4zm258.6-474c-84.6-84.6-221.5-84.6-306 0L410.3 307.6a8.03 8.03 0 0 0 0 11.3l39.7 39.7c3.1 3.1 8.2 3.1 11.3 0l116.2-116.2c53.8-53.8 144.6-59.5 204 0 59.5 59.5 53.8 150.2 0 204L665.3 562.6a8.03 8.03 0 0 0 0 11.3l39.8 39.8c3.1 3.1 8.2 3.1 11.3 0l116.2-116.2c84.5-84.6 84.5-221.5 0-306.1zM610.1 372.3a8.03 8.03 0 0 0-11.3 0L372.3 598.7a8.03 8.03 0 0 0 0 11.3l39.6 39.6c3.1 3.1 8.2 3.1 11.3 0l226.4-226.4c3.1-3.1 3.1-8.2 0-11.3l-39.5-39.6z"></path></svg></i></a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="https://docs-v2.zhamao.xin/" target="_blank">
炸毛框架 v2
<i aria-label="icon: link" class="anticon anticon-link"><svg viewBox="64 64 896 896" focusable="false" data-icon="link" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M574 665.4a8.03 8.03 0 0 0-11.3 0L446.5 781.6c-53.8 53.8-144.6 59.5-204 0-59.5-59.5-53.8-150.2 0-204l116.2-116.2c3.1-3.1 3.1-8.2 0-11.3l-39.8-39.8a8.03 8.03 0 0 0-11.3 0L191.4 526.5c-84.6 84.6-84.6 221.5 0 306s221.5 84.6 306 0l116.2-116.2c3.1-3.1 3.1-8.2 0-11.3L574 665.4zm258.6-474c-84.6-84.6-221.5-84.6-306 0L410.3 307.6a8.03 8.03 0 0 0 0 11.3l39.7 39.7c3.1 3.1 8.2 3.1 11.3 0l116.2-116.2c53.8-53.8 144.6-59.5 204 0 59.5 59.5 53.8 150.2 0 204L665.3 562.6a8.03 8.03 0 0 0 0 11.3l39.8 39.8c3.1 3.1 8.2 3.1 11.3 0l116.2-116.2c84.5-84.6 84.5-221.5 0-306.1zM610.1 372.3a8.03 8.03 0 0 0-11.3 0L372.3 598.7a8.03 8.03 0 0 0 0 11.3l39.6 39.6c3.1 3.1 8.2 3.1 11.3 0l226.4-226.4c3.1-3.1 3.1-8.2 0-11.3l-39.5-39.6z"></path></svg></i></a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="visibility:hidden;position:absolute;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li></ul> <ul class="extra-group"><li><a href="https://github.com/zhamao-robot/zhamao-framework" target="_blank" rel="noopener noreferrer" class="repo-link"><i aria-label="icon: github" class="anticon anticon-github"><svg viewBox="64 64 896 896" focusable="false" data-icon="github" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M511.6 76.3C264.3 76.2 64 276.4 64 523.5 64 718.9 189.3 885 363.8 946c23.5 5.9 19.9-10.8 19.9-22.2v-77.5c-135.7 15.9-141.2-73.9-150.3-88.9C215 726 171.5 718 184.5 703c30.9-15.9 62.4 4 98.9 57.9 26.4 39.1 77.9 32.5 104 26 5.7-23.5 17.9-44.5 34.7-60.8-140.6-25.2-199.2-111-199.2-213 0-49.5 16.3-95 48.3-131.7-20.4-60.5 1.9-112.3 4.9-120 58.1-5.2 118.5 41.6 123.2 45.3 33-8.9 70.7-13.6 112.9-13.6 42.4 0 80.2 4.9 113.5 13.9 11.3-8.6 67.3-48.8 121.3-43.9 2.9 7.7 24.7 58.3 5.5 118 32.4 36.8 48.9 82.7 48.9 132.3 0 102.2-59 188.1-200 212.9a127.5 127.5 0 0 1 38.1 91v112.5c.8 9 0 17.9 15 17.9 177.1-59.7 304.6-227 304.6-424.1 0-247.2-200.4-447.3-447.5-447.3z"></path></svg></i></a></li> <!----></ul></nav></div></div> <!----></header> <aside class="sidebar"><!----> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>进阶</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/advanced/" aria-current="page" title="进阶" class="sidebar-link">进阶</a></li><li><a href="/advanced/multi-process.html" aria-current="page" title="框架的多进程" class="active sidebar-link">框架的多进程</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/advanced/multi-process.html#作用" title="作用" class="sidebar-link">作用</a></li><li class="sidebar-sub-header"><a href="/advanced/multi-process.html#多进程类型" title="多进程类型" class="sidebar-link">多进程类型</a></li><li class="sidebar-sub-header"><a href="/advanced/multi-process.html#框架可用的进程模式" title="框架可用的进程模式" class="sidebar-link">框架可用的进程模式</a></li><li class="sidebar-sub-header"><a href="/advanced/multi-process.html#多进程的内存隔离" title="多进程的内存隔离" class="sidebar-link">多进程的内存隔离</a></li></ul></li><li><a href="/advanced/custom-start.html" title="框架高级启动" class="sidebar-link">框架高级启动</a></li></ul></section></li></ul> </aside> <main class="page has-page-anchor"> <div class="theme-antdocs-content content__default"><h1 id="框架的多进程"><a href="#框架的多进程" class="header-anchor">#</a> 框架的多进程</h1> <p>首先对于多进程概念,对于传统 PHP 程序员可能比较陌生,唯一接触到的地方可能就是 php-fpm 等一些方式处理时间长的请求时开进程去执行。关于多进程,我觉得廖雪峰的 Python 多进程这段讲的不错:</p> <blockquote><p>Unix/Linux 操作系统提供了一个<code>fork()</code>系统调用,它非常特殊。普通的函数调用,调用一次,返回一次,但是<code>fork()</code>调用一次,
返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。</p></blockquote> <p>这里面的重点在于,多进程的创建,是父进程的复制,然后两个进程接下来运行的代码和存的内容就分道扬镳了。</p> <p>PHP 也是如此,框架的多进程又是怎么一回事呢?为什么要采用多进程呢?</p> <h2 id="作用"><a href="#作用" class="header-anchor">#</a> 作用</h2> <p>使用过框架的你一定知道,框架是以命令行方式运行 PHP 的,而命令行方式运行 PHP就代表要常驻内存就像 Python、Node.js 一样。
而默认情况下,比如 Python 的 Flask 为单线程单进程模式,也就是说同时只能处理一个 Web 请求。
但大部分情况下,比如 Node.js提供的都是异步 I/O这也就是说明它在 Web 处理请求上,可同时承接的 I/O 密集型请求会更多一些,
这样在对一般的 Web 应用中 I/O 密集型场景非常有用,而且往往只需要单进程也可以承载上万的并发请求。</p> <p>在炸毛框架中,因为框架基于 Swoole、Workerman 等驱动构建,在使用 Swoole 驱动时可以将一部分 I/O 操作协程化。
协程就是针对 I/O 操作进行一个调度,类似异步的 Node.js所以针对项目中存在太多的 SQL 语句执行、文件读写的话,只需换成 Swoole 驱动,无需做任何修改,也可以达到很好的性能。</p> <p><strong>但是</strong>CPU 密集型的应用或 Workerman 怎么办呢?假设我的 Web 应用有大量的排序、md5 运算怎么办呢?
这样的阻塞,假设是一个超级大的 for 循环或者是要执行很长时间的 while 循环CPU 一直在被占用。多进程就是针对 CPU 密集型的应用说 yes 的一个方案。</p> <h2 id="多进程类型"><a href="#多进程类型" class="header-anchor">#</a> 多进程类型</h2> <p>框架多进程中,所有进程的功能和名称是有区别的。</p> <ul><li>Master 进程:主进程,负责执行最初的启动代码,也是接下来其他类型进程的父进程,它一般不会执行任何业务代码,只是负责管理其他进程。</li> <li>Manager 进程:在使用 Swoole 驱动且使用了 <code>SWOOLE_PROCESS</code> 模式启动框架后,会出现,由 Master 进程 fork 而来,用于管理 Worker 进程。</li> <li>Worker 进程:主要逻辑的工作进程,用户态代码在这里被加载。在 Swoole 驱动的 <code>SWOOLE_PROCESS</code> 模式下由 Manager 进程 fork 而来,在 Workerman 驱动下由 Master 进程 fork 而来。</li> <li>TaskWorker 进程:在使用 Swoole 驱动且设置了 <code>taskworker_num</code> 时,由 Master 或 Manager 进程 fork 而来,用于处理耗时的任务。</li> <li>User 进程:在指定了 UserProcessStartEvent 事件下,驱动抽象层会调用驱动的进程创建方法,创建一个用户自定义的子进程,由 Master 或 Manager 进程 fork 而来。</li></ul> <h2 id="框架可用的进程模式"><a href="#框架可用的进程模式" class="header-anchor">#</a> 框架可用的进程模式</h2> <p>首先,如果按照“指南”章节中的安装和配置使用框架,则框架默认的进程为单 Worker 模式。</p> <p>现在框架支持的多进程模式有以下几种(<code>n &gt; 1</code></p> <ol><li><code>MST1#1</code>Workerman 的单 Worker 模式,也是框架默认启动的模式。</li> <li><code>MST1#n</code>Workerman 的多 Worker 模式,由 Master 进程 fork 出多个 Worker 进程,<code>n</code> 为 Worker 进程数。</li> <li><code>MST1#0</code>Workerman 的无 Worker 模式(在 Windows 上使用的默认模式),用户态代码在 Master 进程中执行,此时 Master 进程也是 Worker #0 进程。</li> <li><code>MST1MAN1#1</code>Swoole 的 <code>SWOOLE_PROCESS</code> 启动模式下的单 Worker 模式,如果切换驱动为 Swoole 时,此模式为框架默认的启动模式。</li> <li><code>MST1MAN1#n</code>Swoole 的 <code>SWOOLE_PROCESS</code> 启动模式下的多 Worker 模式,由 Manager 进程 fork 出多个 Worker 进程,<code>n</code> 为 Worker 进程数。</li> <li><code>MST1MAN0#0</code>Swoole 的 <code>SWOOLE_BASE</code> 启动模式下的无 Worker 模式,用户态代码在 Master 进程中执行,此时 Master 进程也是 Worker #0 进程。</li> <li><code>MST1MAN0#1</code>Swoole 的 <code>SWOOLE_BASE</code> 启动模式下的单 Worker 模式,如果切换驱动为 Swoole 时,此模式下仅有 Master、Worker #0 两个进程存在。</li> <li><code>MST1MAN0#n</code>Swoole 的 <code>SWOOLE_BASE</code> 启动模式下的多 Worker 模式,类似于 <code>MST1#n</code>,由 Master 进程 fork 出多个 Worker 进程,<code>n</code> 为 Worker 进程数。</li></ol> <div class="custom-block tip"><p class="custom-block-title">提示</p> <ul><li>在 Windows 环境MSVC 环境的 PHP框架目前只能使用 Workerman 驱动并使用 <code>MST1#0</code> 模式。</li> <li>在 Linux、macOS 环境,使用 Workerman 驱动时,由于 Workerman 自身的限制,无法使用 <code>MST1#0</code> 模式。</li></ul></div> <h3 id="框架为什么使用单-worker-模式"><a href="#框架为什么使用单-worker-模式" class="header-anchor">#</a> 框架为什么使用单 Worker 模式</h3> <p>炸毛框架从最初的炸毛机器人、炸毛框架 0.x、1.x、2.x 到现在的 v3 版本,一直在探索最合适的进程模式。</p> <p>炸毛机器人本体使用了单 Worker 模式,原因:便于热更新(重载 reload 功能),机器人的逻辑代码在 Worker 进程中执行,重载时只需要重启 Worker 进程即可。</p> <p>框架的项目还在叫 cqbot-swoole 时,采用的是无 Worker 模式,重载应用不是很方便。
框架 1.x 延续了现在炸毛机器人本体的进程模式,但 2.x 发生了变化。框架 2.x 默认使用 Swoole 作为底层驱动且默认使用多 Worker 模式启动。
主要原因是想充分利用 Swoole 的特性以及提升框架的性能上限。
但在 2.x 的开发者调研情况来看,使用多进程在开发层面带来的不便远远大于性能上的提升,因此框架 3.x 继续默认使用单 Worker 模式启动。</p> <p>但我们总不能在新版本对特性做出退步,总有需要多 Worker 或单进程(即 <code>MST1#0</code><code>MST1MAN0#0</code>)的时候。
所以在框架 3.0 全新的大版本中,我们对多进程本身也加入了支持,但是默认仍然是单 Worker。</p> <blockquote><p>单 Worker 不是单进程,单 Worker 是至少有两个进程,一个 Master、一个 Worker。如果是 Swoole还可能有 Manager。</p></blockquote> <ul><li>单进程:适合任意环境。</li> <li>单 Worker适合生产环境和开发环境同时也便于重载。</li> <li>多进程:适合生产环境。</li></ul> <p>在使用单进程模式时,调试代码变得十分容易,比如使用 psysh 下断点将是非常稳定可靠的,因为只有一个进程在运行。
单 Worker 模式做到了用户态代码与主进程隔离,方便重载,同时也有一定的便捷性,比如可以在 Worker 进程使用全局变量和静态成员变量等。</p> <h2 id="多进程的内存隔离"><a href="#多进程的内存隔离" class="header-anchor">#</a> 多进程的内存隔离</h2> <p>多进程模式下有内存隔离,而且各个进程的父子关系也很明确。进程是程序在操作系统中的一个边界,和自己有关的一切变量、内容和代码都在自己的进程内。
不同进程之间如果不使用管道等方式,是不可以互相访问的。而加上开始描述的,创建子进程是一个复制自身的过程,所以也就会有如下图的情况:</p> <p><img src="https://img.zhamao.xin/framework/multi-process-variable.png" alt="多进程-内存隔离"></p> <p>我们以静态类为例,设置一个进程中的全局变量。这里就会出现,同一个静态变量在多个进程中完全不同的值的结果。
此后,我们将会在 Worker 进程中执行用户的代码。
如果设置 Worker 数量仅为 1 的话,那么就简单许多了,你还是可以使用全局变量或静态类来存储你想要的内容而不用担心这种多个进程变量隔离的情况,
因为用户的 Web 请求处理的代码只会在一个 Worker 进程中执行。
如果像设置了多个 Worker则收到的机器人事件或 HTTP 请求等就有可能出现在不同的 Worker 进程中,给全局变量设值就一定会造成不同步的问题。
这时我们就不可以使用全局变量做数据同步(注意,我说的是数据同步)。</p> <p>如果想实现跨进程通信,也有很多种方案,有几种方案是炸毛推荐的:</p> <ul><li>使用 Redis、SQL 等数据库。例如使用 Redis 后,你可以把需要的数据写入 Redis再方便地通过框架地 KV 接口无损从 LightCache 切换以实现跨进程通信。</li> <li>使用 Swoole 驱动并在 Setup 阶段设置 Atomic、Swoole Table 等共享内存的组件,方便跨进程通信。</li> <li>使用 Swoole 的 PipeMessage 也可以直接方便地在多个 Worker 之间相互通信,但目前 <a href="https://github.com/botuniverse/php-libonebot" target="_blank" rel="noopener noreferrer">php-libonebot<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> 暂无支持的计划。</li></ul></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/zhamao-robot/zhamao-framework/edit/main/docs/advanced/multi-process.md" target="_blank" rel="noopener noreferrer">Edit this page</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev"><a href="/advanced/" class="prev router-link-active"><i aria-label="icon: left" class="anticon anticon-left"><svg viewBox="64 64 896 896" focusable="false" data-icon="left" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M724 218.3V141c0-6.7-7.7-10.4-12.9-6.3L260.3 486.8a31.86 31.86 0 0 0 0 50.3l450.8 352.1c5.3 4.1 12.9.4 12.9-6.3v-77.3c0-4.9-2.3-9.6-6.1-12.6l-360-281 360-281.1c3.8-3 6.1-7.7 6.1-12.6z"></path></svg></i>
进阶
</a></span> <span class="next"><a href="/advanced/custom-start.html">
框架高级启动
<i aria-label="icon: right" class="anticon anticon-right"><svg viewBox="64 64 896 896" focusable="false" data-icon="right" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M765.7 486.8L314.9 134.7A7.97 7.97 0 0 0 302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 0 0 0-50.4z"></path></svg></i></a></span></p></div> <div class="page-anchor"><div class="ant-space ant-space-vertical" style="width:100%;"><div class="ant-space-item"><div class="page-anchor-offset"><div><div class="ant-anchor-wrapper" style="max-height:100vh;"><div class="ant-anchor"><div class="ant-anchor-ink"><span class="ant-anchor-ink-ball"></span></div><div class="ant-anchor-link"><a href="#作用" title="作用" class="ant-anchor-link-title">作用</a></div><div class="ant-anchor-link"><a href="#多进程类型" title="多进程类型" class="ant-anchor-link-title">多进程类型</a></div><div class="ant-anchor-link"><a href="#框架可用的进程模式" title="框架可用的进程模式" class="ant-anchor-link-title">框架可用的进程模式</a><div class="ant-anchor-link"><a href="#框架为什么使用单-worker-模式" title="框架为什么使用单 Worker 模式" class="ant-anchor-link-title">框架为什么使用单 Worker 模式</a></div></div><div class="ant-anchor-link"><a href="#多进程的内存隔离" title="多进程的内存隔离" class="ant-anchor-link-title">多进程的内存隔离</a></div></div></div></div></div></div></div></div> </main> <!----></div><div class="global-ui"></div></div>
<script src="/assets/js/app.cf958133.js" defer></script><script src="/assets/js/2.4c04991c.js" defer></script><script src="/assets/js/1.d8755a39.js" defer></script><script src="/assets/js/26.8e7089c0.js" defer></script>
</body>
</html>

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="13"><g stroke-width="2" stroke="#aaa" fill="none"><path d="M11.29 11.71l-4-4"/><circle cx="5" cy="5" r="4"/></g></svg>

After

Width:  |  Height:  |  Size: 216 B

View File

@ -0,0 +1 @@
<svg t="1582001086690" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2019" width="32" height="32"><path d="M192 448c0-141.152 114.848-256 256-256s256 114.848 256 256-114.848 256-256 256-256-114.848-256-256z m710.624 409.376l-206.88-206.88A318.784 318.784 0 0 0 768 448c0-176.736-143.264-320-320-320S128 271.264 128 448s143.264 320 320 320a318.784 318.784 0 0 0 202.496-72.256l206.88 206.88 45.248-45.248z" fill="#8a8a8a" p-id="2020"></path></svg>

After

Width:  |  Height:  |  Size: 492 B

1
assets/js/1.d8755a39.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/10.960912c3.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/11.cd171694.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{700:function(e,t,a){"use strict";var i=TypeError;e.exports=function(e,t){if(e<t)throw new i("Not enough arguments");return e}},701:function(e,t,a){},712:function(e,t,a){"use strict";var i=a(61),n=a(20),s=a(54),r=a(700),o=URLSearchParams,l=o.prototype,h=n(l.append),u=n(l.delete),c=n(l.forEach),p=n([].push),d=new o("a=1&a=2&b=3");d.delete("a",1),d.delete("b",void 0),d+""!="a=2"&&i(l,"delete",(function(e){var t=arguments.length,a=t<2?void 0:arguments[1];if(t&&void 0===a)return u(this,e);var i=[];c(this,(function(e,t){p(i,{key:t,value:e})})),r(t,1);for(var n,o=s(e),l=s(a),d=0,f=0,g=!1,v=i.length;d<v;)n=i[d++],g||n.key===o?(g=!0,u(this,n.key)):f++;for(;f<v;)(n=i[f++]).key===o&&n.value===l||h(this,n.key,n.value)}),{enumerable:!0,unsafe:!0})},713:function(e,t,a){"use strict";var i=a(61),n=a(20),s=a(54),r=a(700),o=URLSearchParams,l=o.prototype,h=n(l.getAll),u=n(l.has),c=new o("a=1");!c.has("a",2)&&c.has("a",void 0)||i(l,"has",(function(e){var t=arguments.length,a=t<2?void 0:arguments[1];if(t&&void 0===a)return u(this,e);var i=h(this,e);r(t,1);for(var n=s(a),o=0;o<i.length;)if(i[o++]===n)return!0;return!1}),{enumerable:!0,unsafe:!0})},714:function(e,t,a){"use strict";var i=a(28),n=a(20),s=a(159),r=URLSearchParams.prototype,o=n(r.forEach);i&&!("size"in r)&&s(r,"size",{get:function(){var e=0;return o(this,(function(){e++})),e},configurable:!0,enumerable:!0})},715:function(e,t,a){"use strict";a(701)},727:function(e,t,a){"use strict";a.r(t);a(391),a(712),a(713),a(714);var i={name:"AlgoliaSearchBox",props:["options"],data:()=>({placeholder:void 0}),watch:{$lang(e){this.update(this.options,e)},options(e){this.update(e,this.$lang)}},mounted(){this.initialize(this.options,this.$lang),this.placeholder=this.$site.themeConfig.searchPlaceholder||""},methods:{initialize(e,t){Promise.all([Promise.all([a.e(0),a.e(7)]).then(a.t.bind(null,725,7)),Promise.all([a.e(0),a.e(7)]).then(a.t.bind(null,726,7))]).then(([a])=>{a=a.default;const{algoliaOptions:i={}}=e;a(Object.assign({},e,{inputSelector:"#algolia-search-input",algoliaOptions:Object.assign({facetFilters:["lang:"+t].concat(i.facetFilters||[])},i),handleSelected:(e,t,a)=>{const{pathname:i,hash:n}=new URL(a.url),s=i.replace(this.$site.base,"/");this.$router.push(`${s}${n}`)}}))})},update(e,t){this.$el.innerHTML='<input id="algolia-search-input" class="search-query">',this.initialize(e,t)}}},n=(a(715),a(84)),s=Object(n.a)(i,(function(){var e=this._self._c;return e("form",{staticClass:"algolia-search-wrapper search-box",attrs:{id:"search-form",role:"search"}},[e("input",{staticClass:"search-query",attrs:{id:"algolia-search-input",placeholder:this.placeholder}})])}),[],!1,null,null,null);t.default=s.exports}}]);

1
assets/js/12.ff9ca1d1.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/13.a56deac8.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{664:function(t,e,n){"use strict";n.d(e,"d",(function(){return r})),n.d(e,"a",(function(){return a})),n.d(e,"f",(function(){return o})),n.d(e,"b",(function(){return c})),n.d(e,"e",(function(){return p})),n.d(e,"h",(function(){return l})),n.d(e,"i",(function(){return f})),n.d(e,"c",(function(){return h})),n.d(e,"g",(function(){return g}));n(391);const r=/#.*$/,i=/\.(md|html)$/,a=/\/$/,o=/^[a-z]+:/i;function s(t){return decodeURI(t).replace(r,"").replace(i,"")}function u(t){return o.test(t)}function c(t){if(u(t))return t;const e=t.match(r),n=e?e[0]:"",i=s(t);return a.test(i)?t:i+".html"+n}function p(t,e){const n=t.hash,i=function(t){const e=t.match(r);if(e)return e[0]}(e);if(i&&n!==i)return!1;return s(t.path)===s(e)}function l(t,e,n){if(u(e))return{type:"external",path:e};n&&(e=function(t,e,n){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return e+t;const i=e.split("/");n&&i[i.length-1]||i.pop();const a=t.replace(/^\//,"").split("/");for(let t=0;t<a.length;t++){const e=a[t];".."===e?i.pop():"."!==e&&i.push(e)}""!==i[0]&&i.unshift("");return i.join("/")}(e,n));const r=s(e);for(let e=0;e<t.length;e++)if(s(t[e].regularPath)===r)return Object.assign({},t[e],{type:"page",path:c(t[e].path)});return console.error(`[vuepress] No matching page found for sidebar item "${e}"`),{}}function f(t,e,n,r){const{pages:i,themeConfig:a}=n,o=r&&a.locales&&a.locales[r]||a;if("auto"===(t.frontmatter.sidebar||o.sidebar||a.sidebar))return function(t){const e=h(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}(t);const s=o.sidebar||a.sidebar;if(s){const{base:t,config:n}=function(t,e){if(Array.isArray(e))return{base:"/",config:e};for(const r in e)if(0===(n=t,/(\.html|\/)$/.test(n)?n:n+"/").indexOf(encodeURI(r)))return{base:r,config:e[r]};var n;return{}}(e,s);return n?n.map(e=>function t(e,n,r,i=1){if("string"==typeof e)return l(n,e,r);if(Array.isArray(e))return Object.assign(l(n,e[0],r),{title:e[1]});{i>3&&console.error("[vuepress] detected a too deep nested sidebar group.");const a=e.children||[];return 0===a.length&&e.path?Object.assign(l(n,e.path,r),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,children:a.map(e=>t(e,n,r,i+1)),collapsable:!1!==e.collapsable}}}(e,i,t)):[]}return[]}function h(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function g(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},671:function(t,e,n){},685:function(t,e,n){var r=n(53),i=n(35),a=n(42);t.exports=function(t){return"string"==typeof t||!i(t)&&a(t)&&"[object String]"==r(t)}},686:function(t,e,n){"use strict";n(671)},693:function(t,e,n){"use strict";n.r(e);n(391);var r=n(664),i=n(685),a=n.n(i),o=n(47),s=n.n(o),u={name:"PageNav",props:["sidebarItems"],computed:{prev(){return p(c.PREV,this)},next(){return p(c.NEXT,this)}}};const c={NEXT:{resolveLink:function(t,e){return l(t,e,1)},getThemeLinkConfig:({nextLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.next},PREV:{resolveLink:function(t,e){return l(t,e,-1)},getThemeLinkConfig:({prevLinks:t})=>t,getPageLinkConfig:({frontmatter:t})=>t.prev}};function p(t,{$themeConfig:e,$page:n,$route:i,$site:o,sidebarItems:u}){const{resolveLink:c,getThemeLinkConfig:p,getPageLinkConfig:l}=t,f=p(e),h=l(n),g=s()(h)?f:h;return!1===g?void 0:a()(g)?Object(r.h)(o.pages,g,i.path):c(n,u)}function l(t,e,n){const r=[];!function t(e,n){for(let r=0,i=e.length;r<i;r++)"group"===e[r].type?t(e[r].children||[],n):n.push(e[r])}(e,r);for(let e=0;e<r.length;e++){const i=r[e];if("page"===i.type&&i.path===decodeURIComponent(t.path))return r[e+n]}}var f=u,h=(n(686),n(84)),g=Object(h.a)(f,(function(){var t=this,e=t._self._c;return t.prev||t.next?e("div",{staticClass:"page-nav"},[e("p",{staticClass:"inner"},[t.prev?e("span",{staticClass:"prev"},["external"===t.prev.type?e("a",{staticClass:"prev",attrs:{href:t.prev.path,target:"_blank",rel:"noopener noreferrer"}},[t._v("\n "+t._s(t.prev.title||t.prev.path)+"\n\n "),e("OutboundLink")],1):e("RouterLink",{staticClass:"prev",attrs:{to:t.prev.path}},[e("a-icon",{attrs:{type:"left"}}),t._v("\n "+t._s(t.prev.title||t.prev.path)+"\n ")],1)],1):t._e(),t._v(" "),t.next?e("span",{staticClass:"next"},["external"===t.next.type?e("a",{attrs:{href:t.next.path,target:"_blank",rel:"noopener noreferrer"}},[t._v("\n "+t._s(t.next.title||t.next.path)+"\n\n "),e("OutboundLink")],1):e("RouterLink",{attrs:{to:t.next.path}},[t._v("\n "+t._s(t.next.title||t.next.path)+"\n "),e("a-icon",{attrs:{type:"right"}})],1)],1):t._e()])]):t._e()}),[],!1,null,null,null);e.default=g.exports}}]);

1
assets/js/14.b222a011.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{708:function(t,a,i){},722:function(t,a){t.exports=[{name:"hitokoto",description:"一言",avatar:null,link:"https://github.com/awesome-zhamao/hitokoto"},{name:"baidu-translate",description:"翻译插件(百度)",avatar:null,link:"https://github.com/zhamao-robot/baidu-translate-plugin"},{name:"go-cqhttp-adapter-plugin",description:"框架接入 gocq 的适配器(将 OneBot 11 转为 12",avatar:"https://user-images.githubusercontent.com/25968335/120111974-8abef880-c139-11eb-99cd-fa928348b198.png",link:"https://github.com/zhamao-robot/go-cqhttp-adapter-plugin"},{name:"what2eat",description:"今天吃什么",avatar:null,link:"https://github.com/FishZe/zhamao_plugin_what2eat"},{name:"plugin-handle",description:"炸毛框架的猜成语插件,仅适配 onebots 实现。",avatar:"https://opengraph.githubassets.com/0/AeQiQi/plugin-handle",link:"https://github.com/AeQiQi/plugin-handle"},{name:"crazy-thursday",description:"疯狂星期四",avatar:null,link:"https://github.com/FishZe/zhamao_plugin_crazy_thursday"},{name:"code-runner",description:"代码运行",avatar:null,link:"https://github.com/FishZe/zhamao_plugin_code_runner"},{name:"ZMChatGPT",description:"炸毛ChatGPT",avatar:"https://upload.wikimedia.org/wikipedia/commons/thumb/0/04/ChatGPT_logo.svg/120px-ChatGPT_logo.svg.png",link:"https://github.com/DreamMiu/zm-chat-gpt"}]},723:function(t,a,i){"use strict";i(708)},732:function(t,a,i){"use strict";i.r(a);var n={name:"PluginList",data:()=>({plugin_list:[]}),created(){this.plugin_list=i(722),console.log(this.plugin_list)},methods:{jumpTo:t=>(window.location.href=t.link,!0)}},o=(i(723),i(84)),e=Object(o.a)(n,(function(){var t=this,a=t._self._c;return a("a-row",t._l(t.plugin_list,(function(i){return a("a-col",t._b({attrs:{span:8}},"a-col",i,!1),[a("a",{attrs:{href:i.link}},[a("a-card",{staticStyle:{width:"280px",margin:"8px",height:"120px"},attrs:{hoverable:""}},[a("a-card-meta",{attrs:{title:i.name,description:i.description},scopedSlots:t._u([{key:"avatar",fn:function(){return[a("a-avatar",{attrs:{src:null==i.avatar?"https://zhamao.xin/file/hello.jpg":i.avatar}})]},proxy:!0}],null,!0)})],1)],1)])})),1)}),[],!1,null,"3b6fcffe",null);a.default=e.exports}}]);

1
assets/js/15.31489867.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/16.e921dbc4.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{664:function(t,e,n){"use strict";n.d(e,"d",(function(){return i})),n.d(e,"a",(function(){return a})),n.d(e,"f",(function(){return s})),n.d(e,"b",(function(){return l})),n.d(e,"e",(function(){return u})),n.d(e,"h",(function(){return d})),n.d(e,"i",(function(){return p})),n.d(e,"c",(function(){return f})),n.d(e,"g",(function(){return h}));n(391);const i=/#.*$/,r=/\.(md|html)$/,a=/\/$/,s=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(i,"").replace(r,"")}function c(t){return s.test(t)}function l(t){if(c(t))return t;const e=t.match(i),n=e?e[0]:"",r=o(t);return a.test(r)?t:r+".html"+n}function u(t,e){const n=t.hash,r=function(t){const e=t.match(i);if(e)return e[0]}(e);if(r&&n!==r)return!1;return o(t.path)===o(e)}function d(t,e,n){if(c(e))return{type:"external",path:e};n&&(e=function(t,e,n){const i=t.charAt(0);if("/"===i)return t;if("?"===i||"#"===i)return e+t;const r=e.split("/");n&&r[r.length-1]||r.pop();const a=t.replace(/^\//,"").split("/");for(let t=0;t<a.length;t++){const e=a[t];".."===e?r.pop():"."!==e&&r.push(e)}""!==r[0]&&r.unshift("");return r.join("/")}(e,n));const i=o(e);for(let e=0;e<t.length;e++)if(o(t[e].regularPath)===i)return Object.assign({},t[e],{type:"page",path:l(t[e].path)});return console.error(`[vuepress] No matching page found for sidebar item "${e}"`),{}}function p(t,e,n,i){const{pages:r,themeConfig:a}=n,s=i&&a.locales&&a.locales[i]||a;if("auto"===(t.frontmatter.sidebar||s.sidebar||a.sidebar))return function(t){const e=f(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}(t);const o=s.sidebar||a.sidebar;if(o){const{base:t,config:n}=function(t,e){if(Array.isArray(e))return{base:"/",config:e};for(const i in e)if(0===(n=t,/(\.html|\/)$/.test(n)?n:n+"/").indexOf(encodeURI(i)))return{base:i,config:e[i]};var n;return{}}(e,o);return n?n.map(e=>function t(e,n,i,r=1){if("string"==typeof e)return d(n,e,i);if(Array.isArray(e))return Object.assign(d(n,e[0],i),{title:e[1]});{r>3&&console.error("[vuepress] detected a too deep nested sidebar group.");const a=e.children||[];return 0===a.length&&e.path?Object.assign(d(n,e.path,i),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,children:a.map(e=>t(e,n,i,r+1)),collapsable:!1!==e.collapsable}}}(e,r,t)):[]}return[]}function f(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function h(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},670:function(t,e,n){},684:function(t,e,n){"use strict";n(670)},692:function(t,e,n){"use strict";n.r(e);var i=n(47),r=n.n(i),a=n(664),s={name:"PageEdit",computed:{lastUpdated(){return this.$page.lastUpdated},lastUpdatedText(){return"string"==typeof this.$themeLocaleConfig.lastUpdated?this.$themeLocaleConfig.lastUpdated:"string"==typeof this.$site.themeConfig.lastUpdated?this.$site.themeConfig.lastUpdated:"Last Updated"},editLink(){const t=r()(this.$page.frontmatter.editLink)?this.$site.themeConfig.editLinks:this.$page.frontmatter.editLink,{repo:e,docsDir:n="",docsBranch:i="master",docsRepo:a=e}=this.$site.themeConfig;return t&&a&&this.$page.relativePath?this.createEditLink(e,a,n,i,this.$page.relativePath):null},editLinkText(){return this.$themeLocaleConfig.editLinkText||this.$site.themeConfig.editLinkText||"Edit this page"}},methods:{createEditLink(t,e,n,i,r){if(/bitbucket.org/.test(t)){return(a.f.test(e)?e:t).replace(a.a,"")+"/src"+`/${i}/`+(n?n.replace(a.a,"")+"/":"")+r+`?mode=edit&spa=0&at=${i}&fileviewer=file-view-default`}return(a.f.test(e)?e:"https://github.com/"+e).replace(a.a,"")+"/edit"+`/${i}/`+(n?n.replace(a.a,"")+"/":"")+r}}},o=(n(684),n(84)),c=Object(o.a)(s,(function(){var t=this,e=t._self._c;return e("footer",{staticClass:"page-edit"},[t.editLink?e("div",{staticClass:"edit-link"},[e("a",{attrs:{href:t.editLink,target:"_blank",rel:"noopener noreferrer"}},[t._v(t._s(t.editLinkText))]),t._v(" "),e("OutboundLink")],1):t._e(),t._v(" "),t.lastUpdated?e("div",{staticClass:"last-updated"},[e("span",{staticClass:"prefix"},[t._v(t._s(t.lastUpdatedText)+":")]),t._v(" "),e("span",{staticClass:"time"},[t._v(t._s(t.lastUpdated))])]):t._e()])}),[],!1,null,null,null);e.default=c.exports}}]);

1
assets/js/17.58f730d3.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{664:function(t,e,n){"use strict";n.d(e,"d",(function(){return r})),n.d(e,"a",(function(){return a})),n.d(e,"f",(function(){return s})),n.d(e,"b",(function(){return c})),n.d(e,"e",(function(){return l})),n.d(e,"h",(function(){return p})),n.d(e,"i",(function(){return d})),n.d(e,"c",(function(){return f})),n.d(e,"g",(function(){return h}));n(391);const r=/#.*$/,i=/\.(md|html)$/,a=/\/$/,s=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(r,"").replace(i,"")}function u(t){return s.test(t)}function c(t){if(u(t))return t;const e=t.match(r),n=e?e[0]:"",i=o(t);return a.test(i)?t:i+".html"+n}function l(t,e){const n=t.hash,i=function(t){const e=t.match(r);if(e)return e[0]}(e);if(i&&n!==i)return!1;return o(t.path)===o(e)}function p(t,e,n){if(u(e))return{type:"external",path:e};n&&(e=function(t,e,n){const r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return e+t;const i=e.split("/");n&&i[i.length-1]||i.pop();const a=t.replace(/^\//,"").split("/");for(let t=0;t<a.length;t++){const e=a[t];".."===e?i.pop():"."!==e&&i.push(e)}""!==i[0]&&i.unshift("");return i.join("/")}(e,n));const r=o(e);for(let e=0;e<t.length;e++)if(o(t[e].regularPath)===r)return Object.assign({},t[e],{type:"page",path:c(t[e].path)});return console.error(`[vuepress] No matching page found for sidebar item "${e}"`),{}}function d(t,e,n,r){const{pages:i,themeConfig:a}=n,s=r&&a.locales&&a.locales[r]||a;if("auto"===(t.frontmatter.sidebar||s.sidebar||a.sidebar))return function(t){const e=f(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map(e=>({type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}))}]}(t);const o=s.sidebar||a.sidebar;if(o){const{base:t,config:n}=function(t,e){if(Array.isArray(e))return{base:"/",config:e};for(const r in e)if(0===(n=t,/(\.html|\/)$/.test(n)?n:n+"/").indexOf(encodeURI(r)))return{base:r,config:e[r]};var n;return{}}(e,o);return n?n.map(e=>function t(e,n,r,i=1){if("string"==typeof e)return p(n,e,r);if(Array.isArray(e))return Object.assign(p(n,e[0],r),{title:e[1]});{i>3&&console.error("[vuepress] detected a too deep nested sidebar group.");const a=e.children||[];return 0===a.length&&e.path?Object.assign(p(n,e.path,r),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,children:a.map(e=>t(e,n,r,i+1)),collapsable:!1!==e.collapsable}}}(e,i,t)):[]}return[]}function f(t){let e;return(t=t.map(t=>Object.assign({},t))).forEach(t=>{2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)}),t.filter(t=>2===t.level)}function h(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},666:function(t,e,n){},674:function(t,e,n){"use strict";n(666)},677:function(t,e,n){"use strict";n.r(e);var r=n(664);function i(t,e,n,r,i){const a={props:{to:e,activeClass:"",exactActiveClass:""},attrs:{title:n},class:{active:r,"sidebar-link":!0}};return i>2&&(a.style={"padding-left":i+"rem"}),t("RouterLink",a,n)}function a(t,e,n,s,o,u=1){return!e||u>o?null:t("ul",{class:"sidebar-sub-headers"},e.map(e=>{const c=Object(r.e)(s,n+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[i(t,n+"#"+e.slug,e.title,c,e.level-1),a(t,e.children,n,s,o,u+1)])}))}var s={functional:!0,props:["item","sidebarDepth"],render(t,{parent:{$page:e,$site:n,$route:s,$themeConfig:o,$themeLocaleConfig:u},props:{item:c,sidebarDepth:l}}){const p=Object(r.e)(s,c.path),d="auto"===c.type?p||c.children.some(t=>Object(r.e)(s,c.basePath+"#"+t.slug)):p,f="external"===c.type?function(t,e,n){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[n,t("OutboundLink")])}(t,c.path,c.title||c.path):i(t,c.path,c.title||c.path,d),h=[e.frontmatter.sidebarDepth,l,u.sidebarDepth,o.sidebarDepth,1].find(t=>void 0!==t),b=u.displayAllHeaders||o.displayAllHeaders;if("auto"===c.type)return[f,a(t,c.children,c.basePath,s,h)];if((d||b)&&c.headers&&!r.d.test(c.path)){return[f,a(t,Object(r.c)(c.headers),c.path,s,h)]}return f}},o=(n(674),n(84)),u=Object(o.a)(s,void 0,void 0,!1,null,null,null);e.default=u.exports}}]);

1
assets/js/18.26c46c49.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{707:function(t,a,c){},721:function(t,a,c){"use strict";c(707)},731:function(t,a,c){"use strict";c.r(a);var o={name:"ChatBox",props:["myChats"],data(){return{chat:this.myChats,multiline:""}}},s=(c(721),c(84)),n=Object(s.a)(o,(function(){var t=this,a=t._self._c;return a("div",{staticClass:"doc-chat-container"},[a("div",{staticClass:"doc-chat-content"},t._l(t.chat,(function(c){return a("div",t._b({},"div",c,!1),[0===c.type?a("div",{staticClass:"doc-chat-row"},[a("div",{staticClass:"doc-chat-box"},[t._v(t._s(c.content))]),t._v(" "),a("img",{staticClass:"doc-chat-avatar",attrs:{src:"https://zhamao.xin/images/customer_avatar.png",alt:""}})]):1===c.type?a("div",{staticClass:"doc-chat-row doc-chat-row-robot"},[a("img",{staticClass:"doc-chat-avatar",attrs:{src:"https://docs-v1.zhamao.xin/logo.png",alt:""}}),t._v(" "),a("div",{staticClass:"doc-chat-box doc-chat-box-robot"},t._l(c.content.split("\n"),(function(o,s){return a("span",[t._v(t._s(o)),s!==c.content.length-1?a("br"):t._e()])})),0)]):2===c.type?a("div",{staticClass:"doc-chat-row doc-chat-banner"},[t._v("\n "+t._s(c.content)+"\n ")]):3===c.type?a("div",{staticClass:"doc-chat-row doc-chat-row-robot"},[a("img",{staticClass:"doc-chat-avatar",attrs:{src:"https://docs-v1.zhamao.xin/logo.png",alt:""}}),t._v(" "),a("div",{staticClass:"doc-chat-box doc-chat-box-robot"},[a("img",{attrs:{src:c.content,alt:""}})])]):4===c.type?a("div",{staticClass:"doc-chat-row doc-chat-row-robot"},[a("img",{staticClass:"doc-chat-avatar",attrs:{src:"https://docs-v1.zhamao.xin/logo.png",alt:""}}),t._v(" "),a("div",{staticClass:"doc-chat-box doc-chat-box-robot"},[a("div",{staticClass:"doc-chat-box-quote"},[t._v(t._s(c.quote))]),t._v(" "),t._l(c.content.split("\n"),(function(o,s){return a("span",[t._v(t._s(o)),s!==c.content.length-1?a("br"):t._e()])}))],2)]):t._e()])})),0)])}),[],!1,null,"76085dc2",null);a.default=n.exports}}]);

1
assets/js/19.ee0bfd3b.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{672:function(e,t,r){},687:function(e,t,r){"use strict";r(672)},694:function(e,t,r){"use strict";r.r(t);r(392);var a={data:()=>({headersList:[]}),methods:{arrayToTree(e,t){return e.reduce((r,a)=>a.parent===t?(a.items=this.arrayToTree(e,a.id),r.concat(a)):r,[])}},computed:{hasHeaders(){return!!this.headersData},headersData(){return this.$page.headers},pageAnchorConfig(){return this.$page.frontmatter.pageAnchor||this.$themeConfig.pageAnchor||{anchorDepth:2,isDisabled:!1}},isCollapsePageAnchor(){return this.$store.state.global.isCollapsePageAnchor},filterHeadersByLevel2(){const{headers:e}=this.$page;let t;return t=e.filter(e=>2===e.level),t.forEach(e=>{e.items=[]}),t},filterHeadersByLevel(){if(1===this.pageAnchorConfig.anchorDepth)return this.filterHeadersByLevel2;const{headers:e}=this.$page;let t=e;return t.forEach((e,r)=>{e.id=r+1,2===e.level?e.parent=0:0!==r&&(2===t[r-1].level?e.parent=t[r-1].id:3===t[r-1].level&&(e.parent=t[r-1].parent))}),this.arrayToTree(t,0)}}},s=(r(687),r(84)),n=Object(s.a)(a,(function(){var e=this,t=e._self._c;return e.hasHeaders?t("div",{class:["page-anchor",{"collapse-page-anchor":e.isCollapsePageAnchor}]},[t("a-space",{staticStyle:{width:"100%"},attrs:{direction:"vertical",size:"large"}},[t("a-anchor",{staticClass:"page-anchor-offset"},[e._l(e.filterHeadersByLevel,(function(r,a){return[0!==r.items.length?t("a-anchor-link",{key:a,attrs:{href:"#"+r.slug,title:r.title}},[e._l(r.items,(function(r,a){return[3===r.level?t("a-anchor-link",{key:a,attrs:{href:"#"+r.slug,title:r.title}}):e._e()]}))],2):t("a-anchor-link",{key:a,attrs:{href:"#"+r.slug,title:r.title}})]}))],2)],1)],1):e._e()}),[],!1,null,null,null);t.default=n.exports}}]);

1
assets/js/2.4c04991c.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/20.bb3578b8.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{669:function(t,a,e){},682:function(t,a,e){"use strict";e(669)},691:function(t,a,e){"use strict";e.r(a);var s={name:"Promo",methods:{gotoLink(){window.open(this.data.link)},popupInfo(){this.$info({title:this.data.msgTitle||"Message Title",content:this.data.msgText||"Put your text here.",okText:this.data.msgOkText||"Ok",maskClosable:!0})}},computed:{data(){return this.$themeConfig.ads}}},o=(e(682),e(84)),i=Object(o.a)(s,(function(){var t=this,a=t._self._c;return t.data?a("div",[a("div",{staticClass:"promo"},[1===t.data.style?a("div",{attrs:{id:"promo_1"},on:{click:t.gotoLink}},[a("img",{attrs:{src:t.data.image}}),t._v(" "),a("span",{attrs:{title:t.data.text}},[t._v(t._s(t.data.text||"No text"))])]):2===t.data.style?a("div",{attrs:{id:"promo_2"}},[a("a-carousel",{attrs:{autoplay:"",autoplaySpeed:t.data.speed||3e3}},t._l(t.data.items,(function(t,e){return a("div",{key:e},[a("a",{attrs:{href:t.link,target:"_blank",rel:"noopener noreferrer"}},[a("img",{attrs:{src:t.image,title:t.text}})])])})),0)],1):a("div",{attrs:{id:"promo_3"}},[a("div",{staticClass:"promo_title"},[t._v(t._s(t.data.title||"Sponsor"))]),t._v(" "),a("a-button",{attrs:{type:"primary",ghost:""},on:{click:t.popupInfo}},[t._v(t._s(t.data.btnText||"Become a Sponsor"))])],1)]),t._v(" "),a("a-divider",{attrs:{dashed:"",id:"reset-margin"}})],1):t._e()}),[],!1,null,null,null);a.default=i.exports}}]);

1
assets/js/21.e66f7fe5.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{704:function(t,s,a){},718:function(t,s,a){"use strict";a(704)},728:function(t,s,a){"use strict";a.r(s);var e={name:"SidebarCollapse",data:()=>({}),methods:{}},i=(a(718),a(84)),l=Object(i.a)(e,(function(){var t=this._self._c;return t("a-button",{staticClass:"collapse-sidebar-btn",attrs:{shape:"circle",size:"small"},on:{click:this.collapseSidebar}},[this.isCollapseSidebar?t("a-icon",{attrs:{type:"right"}}):t("a-icon",{attrs:{type:"left"}})],1)}),[],!1,null,null,null);s.default=l.exports}}]);

1
assets/js/22.cba8ca48.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{665:function(t,e,o){},673:function(t,e,o){"use strict";o(665)},676:function(t,e,o){"use strict";o.r(e);var r={name:"ThemeSwitch",data:()=>({isDarkMode:!1}),methods:{getSchemeStorage(t){if("undefined"==typeof localStorage)return;let e=localStorage.getItem(t);return"light"===e||"dark"!==e},setSchemeStorage:t=>!0===t?"dark":"light",switchScheme(){var t;if(this.isDarkMode=!this.isDarkMode,"undefined"==typeof localStorage)return;localStorage.setItem("antdocs-color-scheme",this.setSchemeStorage(this.isDarkMode));const e=null===(t=window)||void 0===t?void 0:t.document.querySelector("html");null==e||e.classList.toggle("dark",this.isDarkMode)}},mounted(){var t;this.isDarkMode=!this.getSchemeStorage("antdocs-color-scheme");const e=null===(t=window)||void 0===t?void 0:t.document.querySelector("html");null==e||e.classList.toggle("dark",this.isDarkMode)}},i=(o(673),o(84)),l=Object(i.a)(r,(function(){var t=this,e=t._self._c;return e("div",{staticClass:"theme-switch",on:{click:function(e){return t.switchScheme()}}},[e("a-tooltip",{attrs:{placement:"bottom"}},[e("template",{slot:"title"},[e("span",[t._v(t._s(t.isDarkMode?"切换亮色模式":"切换暗黑模式"))])]),t._v(" "),t.isDarkMode?e("a",{staticStyle:{"margin-top":"2px"}},[e("i",{staticClass:"anticon"},[e("svg",{attrs:{width:"20",height:"20",viewBox:"0 0 48 48",fill:"none",xmlns:"http://www.w3.org/2000/svg"}},[e("rect",{attrs:{width:"48",height:"48",fill:"white","fill-opacity":"0.01"}}),t._v(" "),e("path",{attrs:{d:"M28.0527 4.41085C22.5828 5.83695 18.5455 10.8106 18.5455 16.7273C18.5455 23.7564 24.2436 29.4545 31.2727 29.4545C37.1894 29.4545 42.1631 25.4172 43.5891 19.9473C43.8585 21.256 44 22.6115 44 24C44 35.0457 35.0457 44 24 44C12.9543 44 4 35.0457 4 24C4 12.9543 12.9543 4 24 4C25.3885 4 26.744 4.14149 28.0527 4.41085Z",fill:"none",stroke:"currentColor","stroke-width":"4","stroke-linejoin":"round"}})])])]):e("a",{staticStyle:{"margin-top":"2px"}},[e("i",{staticClass:"anticon"},[e("svg",{attrs:{width:"20",height:"20",viewBox:"0 0 48 48",fill:"none",xmlns:"http://www.w3.org/2000/svg"}},[e("rect",{attrs:{width:"48",height:"48",fill:"white","fill-opacity":"0.01"}}),t._v(" "),e("path",{attrs:{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M24 3V6.15V3Z",fill:"#333"}}),t._v(" "),e("path",{attrs:{d:"M24 3V6.15",stroke:"#333","stroke-width":"4","stroke-linecap":"round","stroke-linejoin":"round"}}),t._v(" "),e("path",{attrs:{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M38.8492 9.15076L36.6219 11.3781L38.8492 9.15076Z",fill:"#333"}}),t._v(" "),e("path",{attrs:{d:"M38.8492 9.15076L36.6219 11.3781",stroke:"#333","stroke-width":"4","stroke-linecap":"round","stroke-linejoin":"round"}}),t._v(" "),e("path",{attrs:{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M45 24H41.85H45Z",fill:"#333"}}),t._v(" "),e("path",{attrs:{d:"M45 24H41.85",stroke:"#333","stroke-width":"4","stroke-linecap":"round","stroke-linejoin":"round"}}),t._v(" "),e("path",{attrs:{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M38.8492 38.8492L36.6219 36.6219L38.8492 38.8492Z",fill:"#333"}}),t._v(" "),e("path",{attrs:{d:"M38.8492 38.8492L36.6219 36.6219",stroke:"#333","stroke-width":"4","stroke-linecap":"round","stroke-linejoin":"round"}}),t._v(" "),e("path",{attrs:{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M24 45V41.85V45Z",fill:"#333"}}),t._v(" "),e("path",{attrs:{d:"M24 45V41.85",stroke:"#333","stroke-width":"4","stroke-linecap":"round","stroke-linejoin":"round"}}),t._v(" "),e("path",{attrs:{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M9.15076 38.8492L11.3781 36.6219L9.15076 38.8492Z",fill:"#333"}}),t._v(" "),e("path",{attrs:{d:"M9.15076 38.8492L11.3781 36.6219",stroke:"#333","stroke-width":"4","stroke-linecap":"round","stroke-linejoin":"round"}}),t._v(" "),e("path",{attrs:{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M3 24H6.15H3Z",fill:"#333"}}),t._v(" "),e("path",{attrs:{d:"M3 24H6.15",stroke:"#333","stroke-width":"4","stroke-linecap":"round","stroke-linejoin":"round"}}),t._v(" "),e("path",{attrs:{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M9.15076 9.15076L11.3781 11.3781L9.15076 9.15076Z",fill:"#333"}}),t._v(" "),e("path",{attrs:{d:"M9.15076 9.15076L11.3781 11.3781",stroke:"#333","stroke-width":"4","stroke-linecap":"round","stroke-linejoin":"round"}}),t._v(" "),e("path",{attrs:{d:"M24 36C30.6274 36 36 30.6274 36 24C36 17.3726 30.6274 12 24 12C17.3726 12 12 17.3726 12 24C12 30.6274 17.3726 36 24 36Z",fill:"none",stroke:"#333","stroke-width":"4","stroke-linejoin":"round"}})])])])],2)],1)}),[],!1,null,null,null);e.default=l.exports}}]);

1
assets/js/23.cb49f41c.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{734:function(a,s,t){"use strict";t.r(s);var r=t(84),e=Object(r.a)({},(function(){var a=this,s=a._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[s("h1",{attrs:{id:"快速上手"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#快速上手"}},[a._v("#")]),a._v(" 快速上手")]),a._v(" "),s("h2",{attrs:{id:"安装框架和环境"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#安装框架和环境"}},[a._v("#")]),a._v(" 安装框架和环境")]),a._v(" "),s("p",[a._v("此命令可一键以模板安装框架!(仅限 Linux 和 macOS")]),a._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[a._v("bash")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("<")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("(")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-fsSL")]),a._v(" https://zhamao.xin/v3.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v(")")]),a._v("\n")])]),a._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[a._v("1")]),s("br")])]),s("h2",{attrs:{id:"运行框架"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#运行框架"}},[a._v("#")]),a._v(" 运行框架")]),a._v(" "),s("div",{staticClass:"language-bash line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("cd")]),a._v(" zhamao-v3/\n./zhamao server\n")])]),a._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[a._v("1")]),s("br"),s("span",{staticClass:"line-number"},[a._v("2")]),s("br")])]),s("h2",{attrs:{id:"效果图"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#效果图"}},[a._v("#")]),a._v(" 效果图")]),a._v(" "),s("p",[s("img",{attrs:{src:"https://img.zhamao.xin/framework/framework-demo.png",alt:"index_demo"}})])])}),[],!1,null,null,null);s.default=e.exports}}]);

1
assets/js/24.d95b175a.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{739:function(t,s,i){"use strict";i.r(s);var e=i(84),n=Object(e.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"进阶"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#进阶"}},[this._v("#")]),this._v(" 进阶")]),this._v(" "),t("p",[this._v("在本章,下面的部分将详细说明一些具体的案例和自定义框架的操作。")]),this._v(" "),t("blockquote",[t("p",[this._v("更多进阶教程敬请期待....(或者你可以选择提 Issue 到框架 GitHub有需求就写入文档")])])])}),[],!1,null,null,null);s.default=n.exports}}]);

1
assets/js/25.b0d69869.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/26.8e7089c0.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/27.333a53a1.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{737:function(t,s,n){"use strict";n.r(s);var r=n(84),a=Object(r.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"组件"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#组件"}},[this._v("#")]),this._v(" 组件")]),this._v(" "),t("p",[this._v("这里列举了所有框架内可使用的组件。")])])}),[],!1,null,null,null);s.default=a.exports}}]);

1
assets/js/28.df4b871c.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/29.5427ad45.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/3.07fc018e.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/30.7cb7445a.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/31.5c4bb546.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/32.7fc05474.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/33.9684a4f8.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{744:function(s,e,a){"use strict";a.r(e);var t=a(84),v=Object(t.a)({},(function(){var s=this,e=s._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[e("h1",{attrs:{id:"框架调试-热更新和重载"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#框架调试-热更新和重载"}},[s._v("#")]),s._v(" 框架调试 - 热更新和重载")]),s._v(" "),e("div",{staticClass:"custom-block danger"},[e("p",{staticClass:"custom-block-title"},[s._v("WARNING")]),s._v(" "),e("p",[s._v("目前此功能还在开发中,暂不可用。")])]),s._v(" "),e("p",[s._v("框架使用了 Workerman、Swoole、Choir 等驱动作为底层协议和进程管理模型,在使用了 Worker 进程模式启动框架后,你可以使用 Worker 进程的重载功能来更新你的代码。")]),s._v(" "),e("p",[s._v("首先,如果你不了解框架的进程结构,请先了解 "),e("a",{attrs:{href:"/advanced/multi-process"}},[s._v("进阶开发 - 框架的多进程")]),s._v("。")]),s._v(" "),e("p",[s._v("开发者在使用框架开发相应的插件时,经常需要重新载入插件的代码。热更新和重载就是为了在不停止主进程的情况下在 Worker 进程内重新加载代码,以达到代码更新的作用。\n你在插件目录开发的插件代码一般为 "),e("code",[s._v("plugins/xxx/")]),s._v(" 目录下的代码,均可使用重载功能实现热更新。")]),s._v(" "),e("div",{staticClass:"custom-block warning"},[e("p",{staticClass:"custom-block-title"},[s._v("注意")]),s._v(" "),e("ul",[e("li",[s._v("Linux、macOS 环境使用 Workerman、Swoole 驱动默认配置情况均可使用重载。")]),s._v(" "),e("li",[s._v("Swoole 驱动模式下使用 SWOOLE_BASE 模式,且未设置 Worker 数量时不可使用重载。")]),s._v(" "),e("li",[s._v("Workerman 驱动模式下除 Windows 外均可使用重载。")])])]),s._v(" "),e("p",[s._v("使用重载的方式很简单,在另一个终端内进入框架的工作目录,并执行命令:")]),s._v(" "),e("div",{staticClass:"language-bash line-numbers-mode"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[s._v("./zhamao server:reload\n")])]),s._v(" "),e("div",{staticClass:"line-numbers-wrapper"},[e("span",{staticClass:"line-number"},[s._v("1")]),e("br")])]),e("p",[s._v("或者你也可以在代码中调用 "),e("code",[s._v("\\ZM\\Framework::getInstance()->reload()")]),s._v(" 进行重载。")]),s._v(" "),e("p",[s._v("如果你不想手动调用重载命令或代码,你也可以在启动框架时使用 "),e("code",[s._v("--watch")]),s._v(" 参数来监听 plugins 目录文件变化。")]),s._v(" "),e("p",[s._v("在使用 "),e("code",[s._v("--watch")]),s._v(" 启动热更新功能后,框架将每 3 秒比较一次文件变化(不包含插件内的 vendor 第三方库目录)。涉及更新到 "),e("code",[s._v(".php")]),s._v(" 文件的,将会自动重载一次。\n重载后所有插件都会按照正常启动流程执行一次例如执行 "),e("code",[s._v("@Init")]),s._v(" 注解等。")])])}),[],!1,null,null,null);e.default=v.exports}}]);

1
assets/js/34.83e32a28.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/35.95d03df6.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/36.80aace42.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/37.1eaed2ee.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/38.75fa7a1c.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/39.117f5802.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/4.6623271b.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{705:function(t,e,n){},719:function(t,e,n){"use strict";n(705)},733:function(t,e,n){"use strict";n.r(e);var i={functional:!0,props:{type:{type:String,default:"tip"},text:String,vertical:{type:String,default:"top"}},render:(t,{props:e,slots:n})=>t("span",{class:["badge",e.type],style:{verticalAlign:e.vertical}},e.text||n().default)},p=(n(719),n(84)),l=Object(p.a)(i,void 0,void 0,!1,null,"4ee01066",null);e.default=l.exports}}]);

1
assets/js/40.57eba153.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/41.89c4a7c8.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/42.d8f92f99.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/43.5ee83631.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/44.c09b5b0c.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/45.bd850606.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[45],{757:function(t,a,v){"use strict";v.r(a);var _=v(84),s=Object(_.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"入门"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#入门"}},[t._v("#")]),t._v(" 入门")]),t._v(" "),a("h2",{attrs:{id:"事件是什么"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#事件是什么"}},[t._v("#")]),t._v(" 事件是什么")]),t._v(" "),a("p",[t._v("简单来说,事件是一个底层的 Event Loop 收到消息后调用对应的方法的一个模型,比如给机器人发送消息后框架会调用你定义的方法来执行你的业务代码。")]),t._v(" "),a("h2",{attrs:{id:"属性和注解是什么"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#属性和注解是什么"}},[t._v("#")]),t._v(" 属性和注解是什么")]),t._v(" "),a("p",[t._v("属性Attribute是 PHP 8 最大的新变化之一,是 PHP 官方支持的、内置的注解实现,允许我们通过编程方式获取对应的元数据,可以大大方便我们对某一类代码进行处理。")]),t._v(" "),a("p",[t._v("而注解Annotation则是在 PHP 尚未支持属性的时代,用来代替的社区实现方案,通过解析 PHPDoc 注释来实现自己的注解机制。")]),t._v(" "),a("p",[t._v("炸毛框架同时支持注解和属性,在文档当中,有时会混用两者的字眼,在大多数情况下都可以安全地交换使用,例如 "),a("code",[t._v("#[BotEvent]")]),t._v(" 和 "),a("code",[t._v("@BotEvent")]),t._v(" 的行为是完全一致的。")]),t._v(" "),a("h2",{attrs:{id:"注解和事件的关系"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#注解和事件的关系"}},[t._v("#")]),t._v(" 注解和事件的关系")]),t._v(" "),a("p",[t._v("在炸毛框架中,注解是事件分发的一个重要角色,但注解本身并非事件,更恰当地说,注解代表了事件。")]),t._v(" "),a("p",[t._v("无论是机器人开发过程中场景的 "),a("code",[t._v("#[BotCommand]")]),t._v(" 或是 HTTP 服务的路由 "),a("code",[t._v("#[RequestMapping]")]),t._v(" 都是注解代表事件的例子。")]),t._v(" "),a("h2",{attrs:{id:"阻断事件分发"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#阻断事件分发"}},[t._v("#")]),t._v(" 阻断事件分发")]),t._v(" "),a("p",[t._v("在炸毛框架中,事件由一个统一的事件分发器进行分发,你可以在任意事件中阻断所有后续的分发。")]),t._v(" "),a("p",[t._v("(待考)")])])}),[],!1,null,null,null);a.default=s.exports}}]);

1
assets/js/46.732b1cef.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/47.2a872d0d.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[47],{756:function(t,s,n){"use strict";n.r(s);var r=n(84),a=Object(r.a)({},(function(){var t=this._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("h1",{attrs:{id:"扩展事件分发器"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#扩展事件分发器"}},[this._v("#")]),this._v(" 扩展事件分发器")]),this._v(" "),t("p",[this._v("TODO")])])}),[],!1,null,null,null);s.default=a.exports}}]);

1
assets/js/48.959e18f4.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[48],{759:function(t,v,_){"use strict";_.r(v);var r=_(84),e=Object(r.a)({},(function(){var t=this,v=t._self._c;return v("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[v("h1",{attrs:{id:"框架事件"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#框架事件"}},[t._v("#")]),t._v(" 框架事件")]),t._v(" "),v("aside",[t._v("\n🛰 此页面下的所有注解命名空间为 `ZM\\Annotation\\Framework`\n")]),t._v(" "),v("h2",{attrs:{id:"bindevent"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#bindevent"}},[t._v("#")]),t._v(" BindEvent")]),t._v(" "),v("p",[t._v("相对底层的事件绑定,支持绑定所有透过框架分发的事件。")]),t._v(" "),v("table",[v("thead",[v("tr",[v("th",[t._v("参数名称")]),t._v(" "),v("th",[t._v("允许值")]),t._v(" "),v("th",[t._v("用途")]),t._v(" "),v("th",[t._v("默认")])])]),t._v(" "),v("tbody",[v("tr",[v("td",[t._v("event_class")]),t._v(" "),v("td",[t._v("string")]),t._v(" "),v("td",[t._v("时间名")]),t._v(" "),v("td",[t._v("必填")])]),t._v(" "),v("tr",[v("td",[t._v("level")]),t._v(" "),v("td",[t._v("int")]),t._v(" "),v("td",[t._v("事件优先级(越大越先执行)")]),t._v(" "),v("td",[t._v("800")])])])]),t._v(" "),v("h2",{attrs:{id:"init"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#init"}},[t._v("#")]),t._v(" Init")]),t._v(" "),v("p",[t._v("在 Worker 进程初始化时触发,用于进行 Worker 初始化。")]),t._v(" "),v("table",[v("thead",[v("tr",[v("th",[t._v("参数名称")]),t._v(" "),v("th",[t._v("允许值")]),t._v(" "),v("th",[t._v("用途")]),t._v(" "),v("th",[t._v("默认")])])]),t._v(" "),v("tbody",[v("tr",[v("td",[t._v("worker")]),t._v(" "),v("td",[t._v("int 由 0 至 (最大Worker数-1)")]),t._v(" "),v("td",[t._v("限定执行的 Worker 进程,-1 为在所有 Worker 执行")]),t._v(" "),v("td",[t._v("0")])])])]),t._v(" "),v("h2",{attrs:{id:"setup"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#setup"}},[t._v("#")]),t._v(" Setup")]),t._v(" "),v("p",[t._v("在框架初始化时触发,在主进程执行,不可使用协程相关功能。")]),t._v(" "),v("p",[t._v("可用于改变所有进程的设置,相关更改会随着进程创建应用到所有 Worker 和 Manager 进程。")]),t._v(" "),v("p",[v("em",[t._v("没有参数")])])])}),[],!1,null,null,null);v.default=e.exports}}]);

1
assets/js/49.a9bb32f7.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[49],{760:function(t,_,v){"use strict";v.r(_);var r=v(84),a=Object(r.a)({},(function(){var t=this,_=t._self._c;return _("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[_("h1",{attrs:{id:"路由事件"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#路由事件"}},[t._v("#")]),t._v(" 路由事件")]),t._v(" "),_("aside",[t._v("\n🛰 此页面下的所有注解命名空间为 `ZM\\Annotation\\Http`\n")]),t._v(" "),_("h2",{attrs:{id:"controller"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#controller"}},[t._v("#")]),t._v(" Controller")]),t._v(" "),_("p",[t._v("对同一类下的路由进行修饰,只可在类上使用。")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v("参数名称")]),t._v(" "),_("th",[t._v("允许值")]),t._v(" "),_("th",[t._v("用途")]),t._v(" "),_("th",[t._v("默认")])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v("prefix")]),t._v(" "),_("td",[t._v("string")]),t._v(" "),_("td",[t._v("路由前缀,应用到类下的所有路由")]),t._v(" "),_("td",[t._v("必填")])])])]),t._v(" "),_("h2",{attrs:{id:"route"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#route"}},[t._v("#")]),t._v(" Route")]),t._v(" "),_("p",[t._v("路由事件,当对应的路由收到请求时触发。")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v("参数名称")]),t._v(" "),_("th",[t._v("允许值")]),t._v(" "),_("th",[t._v("用途")]),t._v(" "),_("th",[t._v("默认")])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v("route")]),t._v(" "),_("td",[t._v("string")]),t._v(" "),_("td",[t._v("路由")]),t._v(" "),_("td",[t._v("必填")])]),t._v(" "),_("tr",[_("td",[t._v("name")]),t._v(" "),_("td",[t._v("string")]),t._v(" "),_("td",[t._v("路由名称")]),t._v(" "),_("td",[t._v("“”")])]),t._v(" "),_("tr",[_("td",[t._v("request_method")]),t._v(" "),_("td",[t._v("array"),_("string")],1),t._v(" "),_("td",[t._v("允许的请求方法")]),t._v(" "),_("td",[t._v("[GET, POST]")])]),t._v(" "),_("tr",[_("td",[t._v("params")]),t._v(" "),_("td",[t._v("array<string, string>")]),t._v(" "),_("td",[t._v("路由参数")]),t._v(" "),_("td",[t._v("[]")])])])])])}),[],!1,null,null,null);_.default=a.exports}}]);

1
assets/js/5.073233e8.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{706:function(t,e,s){},720:function(t,e,s){"use strict";s(706)},729:function(t,e,s){"use strict";s.r(e);const n=["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."];var o={methods:{getMsg:()=>n[Math.floor(Math.random()*n.length)]}},i=(s(720),s(84)),h=Object(i.a)(o,(function(){var t=this._self._c;return t("div",{staticClass:"theme-container"},[t("div",{staticClass:"theme-antdocs-content page-404"},[t("h1",[this._v("404")]),this._v(" "),t("blockquote",[this._v(this._s(this.getMsg()))]),this._v(" "),t("RouterLink",{attrs:{to:"/"}},[this._v("\n Take me home.\n ")])],1)])}),[],!1,null,null,null);e.default=h.exports}}]);

1
assets/js/50.ca90a854.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[50],{762:function(t,v,_){"use strict";_.r(v);var a=_(84),e=Object(a.a)({},(function(){var t=this,v=t._self._c;return v("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[v("h1",{attrs:{id:"中间件事件"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#中间件事件"}},[t._v("#")]),t._v(" 中间件事件")]),t._v(" "),v("aside",[t._v("\n🛰 此页面下的所有注解命名空间为 `ZM\\Annotation\\Middleware`\n")]),t._v(" "),v("h2",{attrs:{id:"middleware"}},[v("a",{staticClass:"header-anchor",attrs:{href:"#middleware"}},[t._v("#")]),t._v(" Middleware")]),t._v(" "),v("p",[t._v("当绑定了此中间件的方法被触发时触发。")]),t._v(" "),v("table",[v("thead",[v("tr",[v("th",[t._v("参数名称")]),t._v(" "),v("th",[t._v("允许值")]),t._v(" "),v("th",[t._v("用途")]),t._v(" "),v("th",[t._v("默认")])])]),t._v(" "),v("tbody",[v("tr",[v("td",[t._v("name")]),t._v(" "),v("td",[t._v("string")]),t._v(" "),v("td",[t._v("中间件名称")]),t._v(" "),v("td",[t._v("必填")])]),t._v(" "),v("tr",[v("td",[t._v("params")]),t._v(" "),v("td",[t._v("array"),v("mixed")],1),t._v(" "),v("td",[t._v("中间件参数")]),t._v(" "),v("td",[t._v("[]")])])])]),t._v(" "),v("blockquote",[v("p",[t._v("关于中间件的具体用法,请参见【再来链接】")])])])}),[],!1,null,null,null);v.default=e.exports}}]);

1
assets/js/51.79142530.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[51],{761:function(v,_,t){"use strict";t.r(_);var e=t(84),o=Object(e.a)({},(function(){var v=this,_=v._self._c;return _("ContentSlotsDistributor",{attrs:{"slot-key":v.$parent.slotKey}},[_("h1",{attrs:{id:"介绍"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#介绍"}},[v._v("#")]),v._v(" 介绍")]),v._v(" "),_("blockquote",[_("p",[v._v("编写文档需要较大精力,你也可以参与到本文档的建设中来,比如找错字,增加或更正内容,每页文档可直接点击右上方铅笔图标直接跳转至 GitHub 进行编辑,编辑后自动 Fork 并生成 Pull Request以此来贡献此文档")])]),v._v(" "),_("p",[v._v("炸毛框架主要面向聊天机器人OneBot 标准)和 API 服务的开发。")]),v._v(" "),_("p",[v._v("框架使用 PHP 编写,无需安装任何额外扩展即可运行在任意主流平台,支持包括 Swoole 和 Workerman 在内的多种驱动,同时支持所有在 OneBot 标准内的通信方式并支持使用注解Annotation和属性Attribute注册绑定各种事件同时引入了依赖注入容器让开发更为便捷。")]),v._v(" "),_("p",[v._v("框架内置了对于 WebSocket 和 HTTP 的服务端和客户端支持,并针对聊天机器人消息处理进行优化扩展,提供常用会话机制和内部调用机制,让代码更为灵活。")]),v._v(" "),_("h2",{attrs:{id:"环境要求"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#环境要求"}},[v._v("#")]),v._v(" 环境要求")]),v._v(" "),_("p",[v._v("虽然我们已经大力简化了运行框架的要求,但仍然存在少量的必要项:")]),v._v(" "),_("ul",[_("li",[v._v("PHP 8.0 或以上版本(使用命令 "),_("code",[v._v("php -v")]),v._v(" 检查)")]),v._v(" "),_("li",[v._v("Tokenizer 扩展(使用命令 "),_("code",[v._v("php -m | grep tokenizer")]),v._v(" 检查)")]),v._v(" "),_("li",[v._v("PDO 扩展(使用命令 "),_("code",[v._v("php -m | grep pdo")]),v._v(" 检查)")]),v._v(" "),_("li",[v._v("Composer 工具(使用命令 "),_("code",[v._v("composer")]),v._v(" 检查)")])]),v._v(" "),_("p",[v._v("框架推荐使用 PHP 8.1 及以上版本,或安装 Swoole 后 使用 Swoole 驱动,以使用协程等特性,同时提升框架性能。")]),v._v(" "),_("h2",{attrs:{id:"框架特色"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#框架特色"}},[v._v("#")]),v._v(" 框架特色")]),v._v(" "),_("ul",[_("li",[v._v("支持MySQL数据库连接池自带查询缓存提高多查询时的效率")]),v._v(" "),_("li",[v._v("WebSocket 服务器、HTTP 服务器兼容运行,一个框架多个用处")]),v._v(" "),_("li",[v._v("支持命令、自然语言处理等多种插件形式")]),v._v(" "),_("li",[v._v("支持多个机器人账号负载均衡")]),v._v(" "),_("li",[v._v("完善的插件系统,可以随意加载和编写独立的插件")]),v._v(" "),_("li",[v._v("灵活的注释和注解注册事件方式,支持 PHP 原生注解,提示更为友好")]),v._v(" "),_("li",[v._v("如果你不想安装 PHP 环境,可以使用静态编译的 PHP")])])])}),[],!1,null,null,null);_.default=o.exports}}]);

1
assets/js/52.fe63ad16.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/53.ed84845a.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/54.3ab7e492.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/55.9028e407.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/56.8173f798.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[56],{767:function(a,s,t){"use strict";t.r(s);var e=t(84),n=Object(e.a)({},(function(){var a=this,s=a._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[s("h1",{attrs:{id:"目录结构"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#目录结构"}},[a._v("#")]),a._v(" 目录结构")]),a._v(" "),s("h2",{attrs:{id:"用户目录"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#用户目录"}},[a._v("#")]),a._v(" 用户目录")]),a._v(" "),s("h3",{attrs:{id:"config-目录"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#config-目录"}},[a._v("#")]),a._v(" config 目录")]),a._v(" "),s("p",[s("code",[a._v("config")]),a._v(" 目录包含框架、应用的所有配置文件。最好把这些文件都浏览一遍,并熟悉所有可用的选项。")]),a._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("config/\n├── global.php # 全局配置文件\n├── container.php # 容器配置文件\n└── motd.txt # 框架启动时展示的文字信息\n")])]),a._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[a._v("1")]),s("br"),s("span",{staticClass:"line-number"},[a._v("2")]),s("br"),s("span",{staticClass:"line-number"},[a._v("3")]),s("br"),s("span",{staticClass:"line-number"},[a._v("4")]),s("br")])]),s("h3",{attrs:{id:"vendor-目录"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#vendor-目录"}},[a._v("#")]),a._v(" vendor 目录")]),a._v(" "),s("p",[s("code",[a._v("vendor")]),a._v(" 目录包含你通过 Composer 安装的所有依赖,此目录为自动生成,无需操作。")]),a._v(" "),s("h3",{attrs:{id:"plugins-目录"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#plugins-目录"}},[a._v("#")]),a._v(" plugins 目录")]),a._v(" "),s("p",[s("code",[a._v("plugins")]),a._v(" 目录包含你编写或加载到源代码模式的插件,里面的插件都会被框架自动扫描并解析,你可以在其中利用注解来注册事件绑定并进行相应处理。")]),a._v(" "),s("p",[a._v("比如你通过 "),s("code",[a._v("./zhamao plugin:make")]),a._v(" 新建了一个名字叫 "),s("code",[a._v("test-app")]),a._v(" 的插件,并且设置为单文件模式("),s("code",[a._v("file")]),a._v("),那么这个插件内包含的文件及结构为:")]),a._v(" "),s("div",{staticClass:"language- line-numbers-mode"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[a._v("plugins/\n└── test-app/\n ├── main.php # 你的插件源代码文件\n └── composer.json # 插件元信息(如名称、版本等)\n")])]),a._v(" "),s("div",{staticClass:"line-numbers-wrapper"},[s("span",{staticClass:"line-number"},[a._v("1")]),s("br"),s("span",{staticClass:"line-number"},[a._v("2")]),s("br"),s("span",{staticClass:"line-number"},[a._v("3")]),s("br"),s("span",{staticClass:"line-number"},[a._v("4")]),s("br")])]),s("h3",{attrs:{id:"zm-data-目录"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#zm-data-目录"}},[a._v("#")]),a._v(" zm_data 目录")]),a._v(" "),s("p",[s("code",[a._v("zm_data")]),a._v(" 目录存放了框架运行时持久化保存的数据,例如 KV 数据库、驱动日志等内容。")])])}),[],!1,null,null,null);s.default=n.exports}}]);

1
assets/js/57.2166b068.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/58.7c52b6bf.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/59.e9965a7b.js Normal file
View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[59],{769:function(t,s,e){"use strict";e.r(s);var l=e(84),a=Object(l.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"插件市场"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#插件市场"}},[t._v("#")]),t._v(" 插件市场")]),t._v(" "),s("p",[t._v("这里列出了官方及社区使用炸毛框架编写的插件。")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("提示")]),t._v(" "),s("p",[t._v("这里也可以分享你的插件,点击 "),s("a",{attrs:{href:"https://github.com/zhamao-robot/zhamao-framework/edit/main/docs/.vuepress/components/plugin_list.js",target:"_blank",rel:"noopener noreferrer"}},[t._v("这里"),s("OutboundLink")],1),t._v(",提交 PR 即可添加!")]),t._v(" "),s("p",[t._v("如果对这里的插件有疑问,请到插件对应的 GitHub 仓库发起 Issue 提问。")])]),t._v(" "),s("details",{staticClass:"custom-block details"},[s("summary",[t._v("插件发布要求")]),t._v(" "),s("hr"),t._v(" "),s("ul",[s("li",[t._v("如果发布插件,要准备一张展示的图片。如果没有图片可展示,可填入 "),s("code",[t._v("null")]),t._v(" 使用默认图片。")]),t._v(" "),s("li",[t._v("图片链接只能来源自 GitHub 图床、炸毛图床、Gitee 图床。")]),t._v(" "),s("li",[t._v("发布的插件必须是炸毛框架 3.0 的插件。")]),t._v(" "),s("li",[t._v("插件必须写明依赖关系,包括依赖的最低框架版本,且应理论上兼容框架最新版本。")]),t._v(" "),s("li",[t._v("发布具有主动群发消息功能、涉及违法犯罪的功能将严格禁止。")])])]),t._v(" "),s("plugin-list")],1)}),[],!1,null,null,null);s.default=a.exports}}]);

1
assets/js/60.f277436c.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/61.3712f8fe.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/8.899a0731.js Normal file

File diff suppressed because one or more lines are too long

1
assets/js/9.e2e8da12.js Normal file

File diff suppressed because one or more lines are too long

313
assets/js/app.cf958133.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

45
components/index.html Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

200
components/store/mysql.html Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,122 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.5"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Zhamao Framework: src/ZM/Container/AliasDefinitionSource.php 文件参考</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen-awesome.css" rel="stylesheet" type="text/css"/>
<link href="doxygen-awesome-sidebar-only.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">Zhamao Framework<span id="projectnumber">&#160;3.2.4</span>
</div>
<div id="projectbrief">A high-performance chatbot + web framework</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- 制作者 Doxygen 1.9.5 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','搜索');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('_alias_definition_source_8php.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">载入中...</div>
<div class="SRStatus" id="Searching">搜索中...</div>
<div class="SRStatus" id="NoMatches">未找到</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#nested-classes">结构体</a> &#124;
<a href="#namespaces">命名空间</a> </div>
<div class="headertitle"><div class="title">AliasDefinitionSource.php 文件参考</div></div>
</div><!--header-->
<div class="contents">
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
结构体</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_z_m_1_1_container_1_1_alias_definition_source.html">AliasDefinitionSource</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>
命名空间</h2></td></tr>
<tr class="memitem:namespace_z_m_1_1_container"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespace_z_m_1_1_container.html">ZM\Container</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_14547c19cd47bd2555adf353e72448ce.html">ZM</a></li><li class="navelem"><a class="el" href="dir_f6ad96415bb57c22495c79713b99d64d.html">Container</a></li><li class="navelem"><a class="el" href="_alias_definition_source_8php.html">AliasDefinitionSource.php</a></li>
<li class="footer">制作者 <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.5 </li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,4 @@
var _alias_definition_source_8php =
[
[ "AliasDefinitionSource", "class_z_m_1_1_container_1_1_alias_definition_source.html", "class_z_m_1_1_container_1_1_alias_definition_source" ]
];

View File

@ -0,0 +1,122 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.5"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Zhamao Framework: src/ZM/Annotation/AnnotationBase.php 文件参考</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen-awesome.css" rel="stylesheet" type="text/css"/>
<link href="doxygen-awesome-sidebar-only.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">Zhamao Framework<span id="projectnumber">&#160;3.2.4</span>
</div>
<div id="projectbrief">A high-performance chatbot + web framework</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- 制作者 Doxygen 1.9.5 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','搜索');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('_annotation_base_8php.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">载入中...</div>
<div class="SRStatus" id="Searching">搜索中...</div>
<div class="SRStatus" id="NoMatches">未找到</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#nested-classes">结构体</a> &#124;
<a href="#namespaces">命名空间</a> </div>
<div class="headertitle"><div class="title">AnnotationBase.php 文件参考</div></div>
</div><!--header-->
<div class="contents">
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
结构体</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_z_m_1_1_annotation_1_1_annotation_base.html">AnnotationBase</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>
命名空间</h2></td></tr>
<tr class="memitem:namespace_z_m_1_1_annotation"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespace_z_m_1_1_annotation.html">ZM\Annotation</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_14547c19cd47bd2555adf353e72448ce.html">ZM</a></li><li class="navelem"><a class="el" href="dir_544dcf3b4bdb107fceb664b18f0ffd2e.html">Annotation</a></li><li class="navelem"><a class="el" href="_annotation_base_8php.html">AnnotationBase.php</a></li>
<li class="footer">制作者 <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.5 </li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,4 @@
var _annotation_base_8php =
[
[ "AnnotationBase", "class_z_m_1_1_annotation_1_1_annotation_base.html", "class_z_m_1_1_annotation_1_1_annotation_base" ]
];

View File

@ -0,0 +1,122 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.5"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Zhamao Framework: src/ZM/Annotation/AnnotationHandler.php 文件参考</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen-awesome.css" rel="stylesheet" type="text/css"/>
<link href="doxygen-awesome-sidebar-only.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">Zhamao Framework<span id="projectnumber">&#160;3.2.4</span>
</div>
<div id="projectbrief">A high-performance chatbot + web framework</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- 制作者 Doxygen 1.9.5 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','搜索');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('_annotation_handler_8php.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">载入中...</div>
<div class="SRStatus" id="Searching">搜索中...</div>
<div class="SRStatus" id="NoMatches">未找到</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#nested-classes">结构体</a> &#124;
<a href="#namespaces">命名空间</a> </div>
<div class="headertitle"><div class="title">AnnotationHandler.php 文件参考</div></div>
</div><!--header-->
<div class="contents">
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
结构体</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_z_m_1_1_annotation_1_1_annotation_handler.html">AnnotationHandler</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>
命名空间</h2></td></tr>
<tr class="memitem:namespace_z_m_1_1_annotation"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespace_z_m_1_1_annotation.html">ZM\Annotation</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_14547c19cd47bd2555adf353e72448ce.html">ZM</a></li><li class="navelem"><a class="el" href="dir_544dcf3b4bdb107fceb664b18f0ffd2e.html">Annotation</a></li><li class="navelem"><a class="el" href="_annotation_handler_8php.html">AnnotationHandler.php</a></li>
<li class="footer">制作者 <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.5 </li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,4 @@
var _annotation_handler_8php =
[
[ "AnnotationHandler", "class_z_m_1_1_annotation_1_1_annotation_handler.html", "class_z_m_1_1_annotation_1_1_annotation_handler" ]
];

View File

@ -0,0 +1,122 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.5"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Zhamao Framework: src/ZM/Annotation/AnnotationMap.php 文件参考</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen-awesome.css" rel="stylesheet" type="text/css"/>
<link href="doxygen-awesome-sidebar-only.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">Zhamao Framework<span id="projectnumber">&#160;3.2.4</span>
</div>
<div id="projectbrief">A high-performance chatbot + web framework</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- 制作者 Doxygen 1.9.5 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','搜索');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('_annotation_map_8php.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">载入中...</div>
<div class="SRStatus" id="Searching">搜索中...</div>
<div class="SRStatus" id="NoMatches">未找到</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#nested-classes">结构体</a> &#124;
<a href="#namespaces">命名空间</a> </div>
<div class="headertitle"><div class="title">AnnotationMap.php 文件参考</div></div>
</div><!--header-->
<div class="contents">
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
结构体</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_z_m_1_1_annotation_1_1_annotation_map.html">AnnotationMap</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>
命名空间</h2></td></tr>
<tr class="memitem:namespace_z_m_1_1_annotation"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespace_z_m_1_1_annotation.html">ZM\Annotation</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_14547c19cd47bd2555adf353e72448ce.html">ZM</a></li><li class="navelem"><a class="el" href="dir_544dcf3b4bdb107fceb664b18f0ffd2e.html">Annotation</a></li><li class="navelem"><a class="el" href="_annotation_map_8php.html">AnnotationMap.php</a></li>
<li class="footer">制作者 <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.5 </li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,4 @@
var _annotation_map_8php =
[
[ "AnnotationMap", "class_z_m_1_1_annotation_1_1_annotation_map.html", null ]
];

View File

@ -0,0 +1,122 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.5"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Zhamao Framework: src/ZM/Annotation/AnnotationParser.php 文件参考</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen-awesome.css" rel="stylesheet" type="text/css"/>
<link href="doxygen-awesome-sidebar-only.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">Zhamao Framework<span id="projectnumber">&#160;3.2.4</span>
</div>
<div id="projectbrief">A high-performance chatbot + web framework</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- 制作者 Doxygen 1.9.5 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','搜索');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('_annotation_parser_8php.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">载入中...</div>
<div class="SRStatus" id="Searching">搜索中...</div>
<div class="SRStatus" id="NoMatches">未找到</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#nested-classes">结构体</a> &#124;
<a href="#namespaces">命名空间</a> </div>
<div class="headertitle"><div class="title">AnnotationParser.php 文件参考</div></div>
</div><!--header-->
<div class="contents">
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
结构体</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_z_m_1_1_annotation_1_1_annotation_parser.html">AnnotationParser</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>
命名空间</h2></td></tr>
<tr class="memitem:namespace_z_m_1_1_annotation"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespace_z_m_1_1_annotation.html">ZM\Annotation</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_14547c19cd47bd2555adf353e72448ce.html">ZM</a></li><li class="navelem"><a class="el" href="dir_544dcf3b4bdb107fceb664b18f0ffd2e.html">Annotation</a></li><li class="navelem"><a class="el" href="_annotation_parser_8php.html">AnnotationParser.php</a></li>
<li class="footer">制作者 <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.5 </li>
</ul>
</div>
</body>
</html>

View File

@ -0,0 +1,4 @@
var _annotation_parser_8php =
[
[ "AnnotationParser", "class_z_m_1_1_annotation_1_1_annotation_parser.html", "class_z_m_1_1_annotation_1_1_annotation_parser" ]
];

122
doxy/_bind_event_8php.html Normal file
View File

@ -0,0 +1,122 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.5"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Zhamao Framework: src/ZM/Annotation/Framework/BindEvent.php 文件参考</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen-awesome.css" rel="stylesheet" type="text/css"/>
<link href="doxygen-awesome-sidebar-only.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">Zhamao Framework<span id="projectnumber">&#160;3.2.4</span>
</div>
<div id="projectbrief">A high-performance chatbot + web framework</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- 制作者 Doxygen 1.9.5 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','搜索');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('_bind_event_8php.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">载入中...</div>
<div class="SRStatus" id="Searching">搜索中...</div>
<div class="SRStatus" id="NoMatches">未找到</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#nested-classes">结构体</a> &#124;
<a href="#namespaces">命名空间</a> </div>
<div class="headertitle"><div class="title">BindEvent.php 文件参考</div></div>
</div><!--header-->
<div class="contents">
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
结构体</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="class_z_m_1_1_annotation_1_1_framework_1_1_bind_event.html">BindEvent</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>
命名空间</h2></td></tr>
<tr class="memitem:namespace_z_m_1_1_annotation_1_1_framework"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespace_z_m_1_1_annotation_1_1_framework.html">ZM\Annotation\Framework</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_14547c19cd47bd2555adf353e72448ce.html">ZM</a></li><li class="navelem"><a class="el" href="dir_544dcf3b4bdb107fceb664b18f0ffd2e.html">Annotation</a></li><li class="navelem"><a class="el" href="dir_bae76be4ff8fcce1b000766c7c879b0d.html">Framework</a></li><li class="navelem"><a class="el" href="_bind_event_8php.html">BindEvent.php</a></li>
<li class="footer">制作者 <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.5 </li>
</ul>
</div>
</body>
</html>

4
doxy/_bind_event_8php.js Normal file
View File

@ -0,0 +1,4 @@
var _bind_event_8php =
[
[ "BindEvent", "class_z_m_1_1_annotation_1_1_framework_1_1_bind_event.html", "class_z_m_1_1_annotation_1_1_framework_1_1_bind_event" ]
];

View File

@ -0,0 +1,122 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.5"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Zhamao Framework: src/ZM/Bootstrap/Bootstrapper.php 文件参考</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen-awesome.css" rel="stylesheet" type="text/css"/>
<link href="doxygen-awesome-sidebar-only.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">Zhamao Framework<span id="projectnumber">&#160;3.2.4</span>
</div>
<div id="projectbrief">A high-performance chatbot + web framework</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- 制作者 Doxygen 1.9.5 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','搜索');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('_bootstrapper_8php.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">载入中...</div>
<div class="SRStatus" id="Searching">搜索中...</div>
<div class="SRStatus" id="NoMatches">未找到</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#nested-classes">结构体</a> &#124;
<a href="#namespaces">命名空间</a> </div>
<div class="headertitle"><div class="title">Bootstrapper.php 文件参考</div></div>
</div><!--header-->
<div class="contents">
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
结构体</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">interface &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="interface_z_m_1_1_bootstrap_1_1_bootstrapper.html">Bootstrapper</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>
命名空间</h2></td></tr>
<tr class="memitem:namespace_z_m_1_1_bootstrap"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespace_z_m_1_1_bootstrap.html">ZM\Bootstrap</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_14547c19cd47bd2555adf353e72448ce.html">ZM</a></li><li class="navelem"><a class="el" href="dir_32e6acc04f4b8c095cf1d40ede347ca3.html">Bootstrap</a></li><li class="navelem"><a class="el" href="_bootstrapper_8php.html">Bootstrapper.php</a></li>
<li class="footer">制作者 <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.5 </li>
</ul>
</div>
</body>
</html>

Some files were not shown because too many files have changed in this diff Show More