登录 用户中心() [退出] 后台管理 注册
 

热门搜索:
您的位置:首页 >> 程序员下载区 >> 程序员下载区 >> 主题: 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, 00);

    
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()。


总数:3 页次:1/1 首页 尾页  


发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:




Copyright © 2005-2012 CLQ工作室, All Rights Reserved

CLQ工作室 版权所有