我打算在嵌入式环境中使用php。我们当前的网络服务器是thttpd。我现在正在考虑两种选择:是将其作为 cgi 运行还是作为 SAPI 模块运行。我知道CGI在安全性方面具有优势。但是,如果我们要使用 php 作为 cgi,则应为每个请求将 php 的实例加载到内存中。
我尝试将其编译为 thttpd 的 SAPI 模块,并且我观察到 thttpd 的内存使用量,特别是 rss,不会随着请求数量的增加而增长。
谁能解释一下thttpd如何加载php?它是否只加载一次,只要 thttpd 正在运行,它就会驻留在内存中?如果是这样,我们可以考虑将其作为CGI的替代方案。
它是否执行多线程,即如果同时有多个http请求? 还是一次处理一个请求?
有没有一个好的文档讨论php作为thttpd模块的行为?
thttpd的经验,但这里有一些提示:
- PHP 引擎是线程安全的,但有些扩展不是,所以通常人们回避在多线程环境中使用它,而是使用单进程 - 单请求方法
- 是的,通常 Web 服务器模块(如 Apache mod_* 的东西)通过保持驻留来工作,但 PHP 的最大障碍是它需要为每个请求解析源文件(如果您使用 include/require,甚至需要多个源文件)。你可以通过使用类似APC的东西来减少这种情况,它缓存文件的解析版本。
- 还有一个叫做FastCGI的协议,你可能想看看 - 它基本上是模块和CGI解决方案之间的交叉 - 它启动了几个进程,每个进程托管CGI问题的单个实例(在这种情况下为PHP)并使用它们来处理请求。实例被回收(即,它们可以一个接一个地处理多个请求)。