登录 用户中心() [退出] 后台管理 注册 |
热门搜索: |
您的位置:首页 >> 程序员下载区 >> 程序员下载区 >> 主题: apache 2.2.11/php-5.2.9-Win32 的 fastcgi 解决方案(顺便解决了内存占用太多的问题) |
标题 | apache 2.2.11/php-5.2.9-Win32 的 fastcgi 解决方案(顺便解决了内存占用太多的问题) |
clq |
浏览(2913)
2009-03-11 15:12:22 发表
编辑
关键字: apache 2.2.11 + php-5.2.9-Win32 的 fastcgi 解决方案(顺便解决了内存占用太多的问题) 原来是用 isapi 的方式简单的做了一个配置.结果很快连接数就吃不消息了,因为默认的连接数不够用 -- 我们"单位"首页每日访问量 20000. -- 现象是响应连接非常慢,而且导致同一台机器上的 tomcat 也连接不上! 于是加大的连接参数,但内存用量急升到 1.5 G 多! 速度是正常了,但总是不优化,心里那个不服. 听说 fastcgi 方式会比较好,试了一个还不好配置.最后终于弄好了,效果是非常的理想 :) 方法如下: fastcgi 其实目前看到的有两种,一个是常说的 FastCGI 另一个是 fcgid 其中后者是国人优化后的版本,与前者兼容. 实际使用中 FastCGI 并不算太好,而且听说与 php5 不兼容,我最终使用的是 fcgid . 前者的配置方法是先使 php 的 cgi 方式先能用: # cgi 运行 php ScriptAlias /php/ "D:/Apache2.2/php-5.2.9-Win32/" Action application/x-httpd-php "/php/php-cgi.exe" SetEnv PHPRC "D:/Apache2.2/php-5.2.9-Win32" AddType application/x-httpd-php .php 然后装载 http://www.fastcgi.com/dist/ 处理得到的一个 dll # fastcgi 运行 php LoadModule fastcgi_module modules/mod_fastcgi-2.4.6-AP22.dll FastCgiServer "D:/Apache2.2/php-5.2.9-Win32/php-cgi.exe" -processes 3 实际上 FastCgiServer 这行在我的环境中用不上, google 上有网友说是 php5 的原因. 总之这样配置出来的东西还行,但不是很快. 实际我用的是 http://fastcgi.coremail.cn/download.htm 处的版本 http://www.apachelounge.com/download/ 上的文件也是这个的,不同的 apache 2 版本还有不同的文件,下载时要注意看一下虽然看不大懂的英文说明 :) 然后按照 http://fastcgi.coremail.cn/configuration.htm#PHP-Windows 处理和说明配置即可.我用的是 LoadModule fcgid_module modules/mod_fcgid.so DefaultInitEnv PHPRC "c:/php/" DefaultInitEnv PATH "c:/php;C:/WINDOWS/system32;C:/WINDOWS;C:/WINDOWS/System32/Wbem;" DefaultInitEnv SystemRoot "C:/Windows" DefaultInitEnv SystemDrive "C:" DefaultInitEnv TEMP "C:/WINDOWS/TEMP" DefaultInitEnv TMP "C:/WINDOWS/TEMP" DefaultInitEnv windir "C:/WINDOWS" AddHandler fcgid-script .php FCGIWrapper "c:/php/php.exe" .php # You need mod_fcgid version >= 2.1 to support arguments in FCGIWrapper, if you want # FCGIWrapper "/usr/local/bin/php -c /etc/" .php Options ExecCGI allow from all 几种方法效果有何不同我就没试过了.因为现在已经很满意了 :) 要感谢一个我们公司有这么多的首页访问量,要不我还以为一个公司嘛,默认配置能用就 ok 了 :) 也没想到配置出来的机器会有这么大的性能差异. 另外目前这个文件是用 vs2008 编译的,所以要先安装 "Microsoft Visual C++ 2008 Redistributable Package (x86)" http://www.microsoft.com/downloads/details.aspx?FamilyID=9B2DA534-3E03-4391-8A4D-074B9F2BC1BF&displaylang=en |
clq |
2009-3-11 15:23:59 发表
编辑
附件[暂不开放下载] 附一个我的配置文件. httpd.conf |
beehive |
2009-4-10 16:17:37 发表
编辑
正遇见这个问题。先学习之。 |
clq |
2010-4-18 14:33:01 发表
编辑
http://blog.csdn.net/wwwsq/archive/2008/05/22/2468007.aspx -------------------------------------------------- FastCGI的并发处理 收藏我还没找到异步处理的方式。如果有异步的实现方式,那就可以单线程异步处理多个并发请求了。不 过我在FastCGI的sample里面找到了多线程的方式,多线程的方式封装一下应该也可以达到异步的效果的。比如,doit()线程把FCGX_Request request 丢给另一个线程A处理,然后doit()线程阻塞的等待线程A的返回结果。那么线程A实际上就可以采取异步的方式来处理请求了。 以 下是FastCGI的sample里面的多线程实现: /*
* threaded.c -- A simple multi-threaded FastCGI application. */ #ifndef lint static const char rcsid[] = "$Id: threaded.c,v 1.9 2001/11/20 03:23:21 robs Exp $"; #endif /* not lint */ #include "fcgi_config.h" #include <pthread.h> #include <sys/types.h> #ifdef HAVE_UNISTD_H #include <unistd.h> #endif #include "fcgiapp.h" #define THREAD_COUNT 20 static int counts[THREAD_COUNT]; static void *doit(void *a) { int rc, i, thread_id = (int)a; pid_t pid = getpid(); FCGX_Request request; char *server_name; FCGX_InitRequest(&request, 0, 0); for (;;) { static pthread_mutex_t accept_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t counts_mutex = PTHREAD_MUTEX_INITIALIZER; /* Some platforms require accept() serialization, some don't.. */ pthread_mutex_lock(&accept_mutex); rc = FCGX_Accept_r(&request); pthread_mutex_unlock(&accept_mutex); if (rc < 0) break; server_name = FCGX_GetParam("SERVER_NAME", request.envp); FCGX_FPrintF(request.out, "Content-type: text/html " " " "<title>FastCGI Hello! (multi-threaded C, fcgiapp library)</title>" "<h1>FastCGI Hello! (multi-threaded C, fcgiapp library)</h1>" "Thread %d, Process %ld<p>" "Request counts for %d threads running on host <i>%s</i><p><code>", thread_id, pid, THREAD_COUNT, server_name ? server_name : "?"); sleep(2); pthread_mutex_lock(&counts_mutex); ++counts[thread_id]; for (i = 0; i < THREAD_COUNT; i++) FCGX_FPrintF(request.out, "%5d " , counts[i]); pthread_mutex_unlock(&counts_mutex); FCGX_Finish_r(&request); } return NULL; } int main(void) { int i; pthread_t id[THREAD_COUNT]; FCGX_Init(); for (i = 1; i < THREAD_COUNT; i++) pthread_create(&id[i], NULL, doit, (void*)i); doit(0); return 0; } 另外,FCGX_Accept_r()可以在FCGX_Finish_r()之前连续accept多个 request,这应该也代表着一种异步的方法。不过需要构造多个request对象给FCGX_Accept_r()。 |
Copyright © 2005-2012 CLQ工作室, All Rights Reserved CLQ工作室 版权所有 |