如何spawn多个外部程序并且accept同一个socket

缘起

学习fastcgi的时候,多个fcgi进程的启动和管理是个无法回避的问题;有一个叫做spawn-fcgi的程序,可以启动多个php-cgi进程,并且同时accept同一个socket,因为spawn-fcgi和php-cgi是两个项目中的程序,那么他们是如何配合的如此默契的呢?

资料: http://redmine.lighttpd.net/projects/spawn-fcgi    其中主要是: http://redmine.lighttpd.net/projects/spawn-fcgi/repository/entry/trunk/src/spawn-fcgi.c

 

分析

从代码来看,spawn-fcgi负责lisent一个socket,然后开始fork指定数量的子进程,每个子进程中先把socket的fd复制到FCGI使用的fd(似乎是约定好的一个fd),然后就把后续的事情通过exec交给外部的进程(如:php-cgi)了

下面看一下PHP中fastcgi的相关逻辑, 文件 sapi/cgi/fastcgi.c 中的 int fcgi_init(void);函数体现了如何识别是否fastcgi的逻辑,大致意思为: 如果标准输入为一个socket(不是fileno),则认为是fastcgi,代码片段如下:

 

注意其中 getpeername(…)的使用,如果 errno == ENOTCONN 才可能认为是fastcgi,那么,如果刚好该socket处于连接状态不就不能视为fastcgi环境了吗?  或许吧

 

通过fcgi-kit来学习fastcgi

工具下载地址: http://www.fastcgi.com/dist/fcgi.tar.gz

工具使用文档:  http://www.fastcgi.com/devkit/doc/fcgi-devel-kit.htm

命令:

 

命令: 连接一个真是存在的fcgi server

这里只写了两个环境变量,不过,也至少要有这两个:

windows 下使用nginx心得

1. 如果使用fastcgi,则没有一个好的fastcgi进程管理程序,lighttpd中有一个Spawn-Fcgi.exe http://en.wlmp-project.net/

2. 当nginx放在windows上,而fastcgi进程在linux上时,需要注意一个问题,root目录可能不对,如下:

如果nginx是在D: 盘的话,则fastcgi看到的$document_root 为: d:/home/phpor/www ,而且会认为是一个相对目录,这样,自然是找不到要执行的文件的,可修改如下:

3. nginx 天生是不支持cgi的,所以想配个cgi也不成的

4. nginx 放在windows上仅仅学习而用

 

再见了msn

如果你再安装msn,安装完毕登录时,会要求你更新,更新后的是skype,skype整合了msn: http://skype.tom.com/

 

微软的outlook配置hotmail邮箱的时候还需要一个单独的OutlookConnector.exe需要安装,下载地址: http://download.microsoft.com/download/0/0/D/00DF5174-E7FB-4F70-B843-83CBDE509491/OutlookConnector.exe

而且,该地址还被墙了,或者说,微软的很多东西都被墙了,晕

 

 

Ubuntu 使用心得

优点:

有一个不错的软件仓库,“不错”说的是很方便安装/更新软件,而不是里面的软件“不错”

 

缺点:

1.  没有一个好使的exchange日历的客户端(可能和exchange的server端的配置也有些关系)

2. 公司的打印机需要专门的客户端软件,而这个专门的软件也只有windows版本的

3. 没有一个好使的截屏-编辑软件,像QQ的ctrl+alt+A

4. 没有一个好使的QQ软件

5. 邮件客户端真的很土,大名鼎鼎的thunderbird也不过如此,体验不是一般的差

6. 没有一个好使的可视化的svn客户端软件

7. 没有一个好使的中文输入法,像sougo那样的

8. ubuntu的字体其实并不好看,图形界面远没有windows看着舒服

9. 没有一个自动更新强制的软件(在线更新的那种),不要让我自己找图片

10.  。。。

 

感悟:

一个好的操作系统,不仅要稳定、高效,更重要的是他需要有很多好用的周边软件

 

svn merge

从主干到分支:

svn merge ^/path/from/root/to/trunk ./branch

等价于:

svn merge https://svn.xxx.xxx/path/from/root/trunk  ./branch

(因为 ./branch 是一个版本控制的目录,可以从中获取到svn的url地址,使用该版本库的根目录替换 ^ 就得到所等价的命令了

从branch到主干:

svn merge –integrate ^/path/to/branch ./trunk