不怕大家笑话,以前我一直不明白为啥会有 spawn-fcgi 这个东西。因为以前都是用 PHP 啊,PHP 本身就是可以并发处理多个请求的 fastcgi server 啊,要 spawn-fcgi 干啥用呢?更有意思的是有人用 spawn-fcgi 启动多个 php-cgi ,然后这个 php-cgi 再启动多个子进程,不知道有什么好处。
前几天,我读了一下代码,还是没太明白这个东西存在的必要性,于是就用我们 SYSOP 的方法研究了一下 spawn-fcgi:
fakefcgi.sh脚本文件
#!/bin/sh
ls -l /proc/self/fd/ >/var/log/$$.txt
sleep 600s
执行
spawn-fcgi -p 3333 -F 5 -- ./fakefcgi.sh
得到结果
spawn-fcgi: child spawned successfully: PID: 16868
spawn-fcgi: child spawned successfully: PID: 16871
spawn-fcgi: child spawned successfully: PID: 16872
spawn-fcgi: child spawned successfully: PID: 16873
spawn-fcgi: child spawned successfully: PID: 16874
执行pstree发现spawn-fcgi没在运行,各个fakefcgi.sh都直接隶属于init。看来是个daemonizer。
再看日志文件:
# cat *.txt
总用量 0
lrwx------ 1 root root 64 10月 22 14:07 0 -> socket:[281459]
l-wx------ 1 root root 64 10月 22 14:07 1 -> /var/log/16868.txt
lrwx------ 1 root root 64 10月 22 14:07 2 -> /dev/null
lr-x------ 1 root root 64 10月 22 14:07 3 -> /proc/16869/fd
总用量 0
lrwx------ 1 root root 64 10月 22 14:07 0 -> socket:[281459]
l-wx------ 1 root root 64 10月 22 14:07 1 -> /var/log/16871.txt
lrwx------ 1 root root 64 10月 22 14:07 2 -> /dev/null
lr-x------ 1 root root 64 10月 22 14:07 3 -> /proc/16875/fd
总用量 0
lrwx------ 1 root root 64 10月 22 14:07 0 -> socket:[281459]
l-wx------ 1 root root 64 10月 22 14:07 1 -> /var/log/16872.txt
lrwx------ 1 root root 64 10月 22 14:07 2 -> /dev/null
lr-x------ 1 root root 64 10月 22 14:07 3 -> /proc/16877/fd
总用量 0
lrwx------ 1 root root 64 10月 22 14:07 0 -> socket:[281459]
l-wx------ 1 root root 64 10月 22 14:07 1 -> /var/log/16873.txt
lrwx------ 1 root root 64 10月 22 14:07 2 -> /dev/null
lr-x------ 1 root root 64 10月 22 14:07 3 -> /proc/16876/fd
总用量 0
lrwx------ 1 root root 64 10月 22 14:07 0 -> socket:[281459]
l-wx------ 1 root root 64 10月 22 14:07 1 -> /var/log/16874.txt
lrwx------ 1 root root 64 10月 22 14:07 2 -> /dev/null
lr-x------ 1 root root 64 10月 22 14:07 3 -> /proc/16878/fd
执行
# netstat -ane|grep 281459
其中 281459 是前面的 socket 号码。得到的结果是:
tcp 0 0 0.0.0.0:3333 0.0.0.0:* LISTEN 0 281459
现在明白了,原来spawn-fcgi只是让多个单循环的 fastcgi server 监听在同一socket上而已。直接调用 libfcgi 库,主程序里只有一个 fastcgi 处理循环,这样开发出来的 fastcgi server 就需要 spawn-fcgi 配合,要不然就无法处理并发的请求。