FastCGI程序可以用c++语言来写,使得我们在动态生成一个网站的时候可以更加灵活,除了调用c++库之外,还可以加入平台的API,本来在linux下跑起来的fastCGI程序,没想到移植到Windows平台下还是会出现很多问题,当你抓破脑袋都想不出问题所在的时候,非常打击人的。
刚开始的时候,使用默认的配置安装apache,下一步下一步完成。用fastCGI的库建立的程序,在apache下不能运行。查看error.txt发现,fcgi_mod can't spown progress ....,mod_fcgi 无法运行 C:\Program。FastCGI程序一个很不好的地方就是调试起来真的很困难,没有办法断点什么的,而且错误提示只能看error.txt。这个问题在项目非常紧急的时候浪费了两天时间,最后发现,问题实在可笑。并不是apache 不能运行 C Program(不能运行C程序),而是无法运行 C:\Program !
都是路径惹的祸。apache默认安装目录是在C:\Program Files\Apache2.2\。在Apache的fastCGI模块创建进程的时候,就会传入一个fastcgi程序的路径, 因为“Program Files”中间有个空格,后面的值都被截断了,所以创建一个C:\Pramgram进程。当然失败了。把apache直接安装到C盘目录下,问题解决。
在Windows平台用c++写fastCGI程序需要的fastcgi库可以在www.fastcgi.com官网上找到,下载下来解压,里面有个Makefile.nt文件,就可以用VS 的 Command Prompt找到该路径,然后nmake Makefile.nt编译,编译成功后在Release文件夹会找到 libfcgi.dll 和 libfcgi.dll.manifest文件,加上include文件夹中的头文件,就可以写fastCGI程序了。
解决了一大问题后发现,fastCGI程序运行失败,我就想,估计是libfcgi.dll得放到程序的路径下,或者放在系统Windows\system32\下,这时,因为用VS创建的工程,编译通过,我调试运行一试,无法找到msvcr80d.dll、接着是无法找到msvcp80d.dll之类的。这个是涉及到manifest文件的问题,因为VS 的CRT库有很多个版本,dll需要知道它要调用到哪个版本,这就需要manifest文件,只是经常manifest文件会嵌入到dll中或者程序中,所以有时不需要它,偏偏我编译的fcgi-2.4.0库,编译后的输出,除了一个libfcgi.dll外,还有一个libfcgi.dll.manifest文件。把libfcgi.dll.manifest加入到程序的manifest input.终于可以跑起来了!。
当我一切都做好,把fastcgi网站移植到另外一台机,新装的干净系统。却发现又是恼人的spawn process error,用VS的自带工具depends.exe可以查看fastCGI程序依赖哪些dll,看到了MSVCR80.DLL 和 MSVCP80.DLL的全路径和版本号, 发现所在系统的版本比它低,最后下载最新的运行库,问题解决!
其实在windows Serve 2003管理工具的事件查看器的系统栏能查到程序找不到对应版本的MSVCR80.DLL和MSVCP80.DLL的错误提示。一般程序启动时找不到DLL就会立刻提示错误。偏偏fastCGI只会在apache的error.txt记录下让你难以理解的创建进程失败。
总算成功动态生成网站。