操作
想法¶
通用事项¶
- 使用 Ragel 生成解析器
- 将好用的工具拆分为独立的树(spawn-fcgi, fcgi-stat-accel)
- 使用 glib2 作为容器及其他用途(模块、日志记录等?)
- 绝不使用全局变量。绝不!
- 通过将日志文件路径传递给日志线程而非日志指针,允许动态日志文件
让开发者和公司建立联系¶
- http://www.cherokee-project.com/contribute.html - 悬赏任务,让公司出资购买他们想要的功能,并邀请社区编写模块或扩展以赚取报酬,好主意!用户可以提交他们的补丁/模块给开发者,由开发者决定哪些会被实现以及谁赢得奖金。
天使¶
- 应该使用独立的配置文件
- 管理套接字以实现优雅重启
- 插件(例如用于 fcgi 启动)
配置结构¶
- 通用后端
- 旧式配置前端
- Lua 前端
- 线性的请求处理,避免令人困惑的条件块(当然仍然支持条件判断)
- 用于加载/卸载额外配置项的良好接口(例如用于 SQL 虚拟主机)
- 更好的异步配置处理接口(同样用于 SQL 虚拟主机)
选项¶
我们有几种不同的选项结构struct option
- 布尔型 (gboolean)
- 整数型 (gint)
- 字符串 (GString*)
- 数组 (GArray*) - 子选项的有序列表
- 哈希表 (GHashTable*) - 字符串到子选项的映射
对于重写等一些功能,我们目前使用关联数组,现在可以使用 (键, 值) 对的数组,也许可以为此使用特殊语法(如 "abc": "xyz" 用于有序键值对,而非 "abc" => "xyz" 用于哈希表)。
内部选项¶
每个模块都可以定义一个选项列表(通过名称标识,例如“debug.log-something”)。对于每个选项,连接表中有对应的 `gpointer` 条目,模块可以通过索引找到所需的值。
选项的定义包括- 名称
- 类型(与选项相同的值 + 也许是“custom”的值)
- 两个函数:`parse_option` 和 `free_option`(见下文)
- 模块手动注册每个选项,并将返回的索引保存在其插件结构中。
- 模块定义一个选项列表,并使用模块基本索引(来自插件结构)+ 该列表的本地索引。
由于模块拥有除“选项结构”之外的内容可能非常有用,例如保存文件描述符(access.log),因此我们为每个可能的选项注册一个选项特定的解析器。默认是直接使用选项结构中的值。
此解析器返回一个 `gpointer`,如果选项被设置,它将被放置在连接表中的相应位置。
为了实现选项的卸载,还有一个 `free_option` 函数,它应该释放内存。
动作¶
在当前的 Lighttpd 版本中,选项用于控制哪个后端处理请求——这通常取决于加载模块的顺序以及一些只有少数人知道(或知道在哪里可以找到)的其他事项。
我们想用“动作”来取代它:我们明确调用一些函数并知道它们会做什么。
- 设置配置选项
- 执行动作列表
- 如果条件为真则执行子动作
- 调用特殊处理程序(由某个模块提供)
- 调用后端负载均衡器(由某个模块提供)
- ERROR - 内部错误,停止连接处理
- GO_ON - 没有发生特殊情况
- COMEBACK - 稍后返回,记住当前位置
- WAIT_FOR_EVENT - 等待虚拟请求唤醒 (`li_vrequest_joblist_append`),记住当前位置