聊 FastCGI.
版权声明: 允许非商业性转载,但转载时必须标明原作者 fcicq、原始链接 http://www.fcicq.net/wp/?p=741 及本声明。
多线程 FastCGI, 不需要 spawn-fcgi.
http://www.fastcgi.com/devkit/examples/threaded.c
原版是需要自己补充几个地方的.
简单的 patch 一个. 不要问怎么用, 不会的话手改也行, 不就 3 处嘛.
diff -uprBN 2/threaded.c 1/threaded.c
--- 2/threaded.c 2009-06-15 21:00:00.000000000 +0800
+++ 1/threaded.c 2009-06-15 21:00:00.000000000 +0800
@@ -21,6 +21,7 @@ static const char rcsid[] = "$Id: thread
#define THREAD_COUNT 20
static int counts[THREAD_COUNT];
+int sock;
static void *doit(void *a)
{
@@ -29,7 +30,7 @@ static void *doit(void *a)
FCGX_Request request;
char *server_name;
- FCGX_InitRequest(&request, 0, 0);
+ FCGX_InitRequest(&request, sock, 0);
for (;;)
{
@@ -75,6 +76,7 @@ int main(void)
pthread_t id[THREAD_COUNT];
FCGX_Init();
+ sock = FCGX_OpenSocket(":8001", 100);
for (i = 1; i < THREAD_COUNT; i++)
pthread_create(&id[i], NULL, doit, (void*)i);
函数问题参考:
http://www.fastcgi.com/devkit/include/fcgiapp.h
如果需要 (在 FastCGI 层进行) 日志记录, 应该各人有各自的方法, 不再多说.
---
关于 (FastCGI / Web) 多线程内存泄漏问题, 常见的方法是
1 内存池
请求时分配, 请求完立刻收回.
2 线程结束时清理
这里主要指 pthread_cleanup_push()
你可以不用内存池, 但这个函数是跑不掉的, 内存池只是方便大批量处理而已.
测试相关的内存泄漏很简单, 用长链接拖住.
用不给内容的方法也是可以的.
现在有这么多检测的工具帮忙, 这也应该不是什么难题.
---
话说 Lua 很轻量.
lfcgi / magnet.c 都是好东西.
唯一的问题是, lua_State 不是线程安全的. (你要用 mutex 吗? 锁死了.
)
spawn-fcgi 弄出这么多进程来不好看.
---
再说说 spawn-fcgi.
在有 root 权限的情况下可以 chroot, 可以设置 user / group.
php-fpm 也不错, 就是配置稍微麻烦了.
多用户 hosting 可以建起 chroot, 做硬链接的 busybox-static, php, 各类 library.
甚至 /etc/passwd + /usr/bin/passwd & shadow 也可以送进去.
(你说这危险吗?)
监控的问题? Services Supervision.
漏掉了一个有意思的 ruby 应用, God.
---
最顶上的多线程样例有什么用?
线程安全的库可以这样封成 fastcgi ...
lighty 1.5 的 mod_proxy 大概是对的, 不应该把 http / fcgi / ... 模块完全分开.
各类的负载均衡如果直接做进去, 估计是件很令人高兴的事情.
---
感叹一下现在做底层的人真多. gearman 又走对了一步.
---
最后终于大跑题, 同学们原谅偶吧.
友情提示: 请注意文章的时效性与准确性, 作者不对文章的有效性负责.
Tags:
Permalink Bookmark on del.icio.us
Last Modified: June 15, 2009 at 10:52 pm