Dec
06
Posted (xurenlu) in php性能, php技术 on 12月-6-2007

近来由于业务量急剧增长,业务种类越来越多,RPC混乱问题就凸现出来.
具体表现是:
a1,a2,a3,a4 为一组服务器,为用户提供A服务.
b1,b2,b3为一组服务器,为用户提供B服务.
c1,c2,c3为一组服务器,为用户提供C服务.
最初各服务器各自服务是不太相关的.随着业务拓展,用户提出新的需求,我们需要
在A服务中调用B组服务器的API接口.
….
最后我们发现这样一个现象:
用户请求a1 提供服务.a1发现他需要知道另一些数据,于是调用b2的rpc服务.但是b2
上这个数据又需要c3的RPC.结果c3又需要a2来提供一些数据….
我们的远程调用调来调去,最后把自己调晕了.

于是我开始考虑一种解决方案。
首先当然是:对远程调用加以控制和规范,避免不必要的远程调用。
接着我注意到,我们利用CURL来通过http通道进行远程调用其实是没必要的。我可以在做远程调用时,走FastCGI协议。

说干就干:
第一步:建立一个fastCGI:spawn-php

  1. #!/bin/bash
  2.  
  3. ## ABSOLUTE path to the spawn-fcgi binary
  4. SPAWNFCGI="/home/y/opt/lighttpd/bin/spawn-fcgi"
  5.  
  6. ## ABSOLUTE path to the PHP binary
  7. FCGIPROGRAM="/home/y/opt/php/bin/php-cgi"
  8.  
  9. ## TCP port to which to bind on localhost
  10. FCGIPORT="1026"
  11.  
  12. ## number of PHP children to spawn
  13. PHP_FCGI_CHILDREN=10
  14.  
  15. ## maximum number of requests a single PHP process can serve before it is restarted
  16. PHP_FCGI_MAX_REQUESTS=1000
  17.  
  18. ## IP addresses from which PHP should access server connections
  19. FCGI_WEB_SERVER_ADDRS="127.0.0.1,192.168.2.10"
  20.  
  21. # allowed environment variables, separated by spaces
  22. ALLOWED_ENV="ORACLE_HOME PATH USER"
  23.  
  24. ## if this script is run as root, switch to the following user
  25. USERID=y
  26. GROUPID=y
  27.  
  28. ################## no config below this line
  29.  
  30. if test x$PHP_FCGI_CHILDREN = x; then
  31. PHP_FCGI_CHILDREN=5
  32. fi
  33.  
  34. export PHP_FCGI_MAX_REQUESTS
  35. export FCGI_WEB_SERVER_ADDRS
  36.  
  37. ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_MAX_REQUESTS FCGI_WEB_SERVER_ADDRS"
  38.  
  39. if test x$UID = x0; then
  40. EX="$SPAWNFCGI -p $FCGIPORT -f $FCGIPROGRAM -u $USERID -g $GROUPID -C $PHP_FCGI_CHILDREN"
  41. else
  42. EX="$SPAWNFCGI -p $FCGIPORT -f $FCGIPROGRAM -C $PHP_FCGI_CHILDREN"
  43. fi
  44.  
  45. # copy the allowed environment variables
  46. E=
  47.  
  48. for i in $ALLOWED_ENV; do
  49. E="$E $i=${!i}"
  50. done
  51.  
  52. # clean the environment and set up a new one
  53. env - $E $EX

2.接着我们建立这样的文件:http.txt

  1. for($i=0;$i<100;$i++)
  2. {
  3. echo rand();
  4. echo '....Scene of shooting at Nebraska shopping centre
  5. Eight killed in Nebraska shooting
  6. A gunman opens fire in a shopping centre in the US state of Nebraska, killing at least eight people.
  7. Scene of shooting at Nebraska shopping centre
  8. Eight killed in Nebraska shooting
  9. A gunman opens fire in a shopping centre in the US state of Nebraska, killing at least eight people.
  10. Scene of shooting at Nebraska shopping centre
  11. Eight killed in Nebraska shooting
  12. A gunman opens fire in a shopping centre in the US state of Nebraska, killing at least eight people.
  13. Scene of shooting at Nebraska shopping centre
  14. Eight killed in Nebraska shooting
  15. A gunman opens fire in a shopping centre in the US state of Nebraska, killing at least eight people.
  16. ';
  17. }
  18. print "done!";

这个做为是远程接口。
3.下面比较CURL和fastCGI两种访问remote API的方式:
A:走FastCGI:

  1. include "./mod_fcgi.php";
  2. $fcgi=new mod_fcgi();
  3. $args="127.0.0.1:1026";
  4. $filename="/home/y/www/qps/http.php";
  5. $fcgi->parser_open($args,$filename,$rq_err,$cgi_headers);
  6. print($fcgi->parsed_output);
  7. echo "\n=============\n";

B:走CURL通道:

  1. include "./curl.php";
  2. $curl=& new CURL();
  3. echo $curl->get("http://localhost/qps/http.php");
  4. echo "\n=============\n";

4我们比较FCGI方式和CURL方式的差异:
FCGI方式进行远程调用的QPS:

  1. Total transferred:      249306 bytes
  2. HTML transferred:       244410 bytes
  3. Requests per second:    275.77 [#/sec] (mean)
  4. Time per request:       3.626 [ms] (mean)
  5. Time per request:       3.626 [ms] (mean, across all concurrent requests)
  6. Transfer rate:          2233.76 [Kbytes/sec] received

HTTP通道进行远程调用的QPS:

  1. Total transferred:      2244515 bytes
  2. HTML transferred:       2240015 bytes
  3. Requests per second:    204.18 [#/sec] (mean)
  4. Time per request:       4.898 [ms] (mean)
  5. Time per request:       4.898 [ms] (mean, across all concurrent requests)
  6. Transfer rate:          14911.66 [Kbytes/sec] received

经过多次比较,确认用fastCGI通道时,效率比http方式要高。
但是….这个差别并不大,而且,使用lighttpd的spawn-cgi来充当fastcgi的守护进程,还不是特别稳定。
另外,经过我的测试,只有当远程调用的结果有较多的输出时,FastCGI协议与HTTP协议相比才有优势。在通过网络传输的数据不多的情况下(就是http.php几乎没有输出的情况下),用CURL来调远端调用,反而比FastCGI方式慢(显而易见,mod_fcgi是自行封装的用PHP的socket函数来进行网络操作的class,而Curl是一个编译了的php扩展).
因此,我忙活了半天,最后得出的结论是,目前还不能在公司大规模加以运用。
但是对于小型企业,创业型公司来说,这种效率对比还是很有用的,可以加以挖掘。


Tag:
相关文章


     
    Nov
    28
    Posted (xurenlu) in 未分类 on 11月-28-2007

    FastCGI 伪指令

    FastCgiAccessChecker

    • 缺省 - 目录
    • 语法 - FastCgiAccessChecker 文件名 [-compat]

    FastCgiAccessChecker 伪指令用于将 FastCGI 应用程序定义为每个目录的访问验证器。Apache 访问阶段在用户认证之前,并且是否允许对所请求资源进行访问的决策取决于随此请求提交的 HTTP 头。当访问验证决策存在动态组件(如一天中的时间,或者域计数是否最新)时,基于 FastCGI 的授权程序十分有用。

    如果 FastCGI 应用程序文件名不具备相应的静态或外部服务器定义,则此应用程序将作为动态 FastCGI 应用程序启动。如果文件名不是以斜杠 (/) 开头,则假设此文件名相对于 ServerRoot。

    FastCgiAccessChecker 是在 DirectoryLocation 容器中使用的。

    <Directory htdocs/protected>
    FastCgiAccessChecker fcgi-bin/access-checker
    </Directory>

    Mod_fastcgi 几乎发送所有标准环境变量,这些环境变量通常可用于 CGI/FastCGI 请求处理程序。所有由 FastCGI access-checker 应用程序以成功响应(状态:200)返回的头都将作为环境变量传递给子进程(CGI/FastCGI 调用)。所有以不成功响应返回的头将传递给客户机。遵从 FastCGI 规范的行为可通过使用 “-compat” 选项获得。

    Mod_fastcgi 将环境变量 “FCGI_APACHE_ROLE” 设置成 “ACCESS_CHECKER”,以表明所执行的(Apache 特定的)授权程序阶段。

    不支持从 FastCGI 授权应用程序中定制故障响应。请参阅 ErrorDocument 伪指令以了解替代办法(可处理此文档的 FastCGI 应用程序)。

    FastCgiAccessCheckerAuthoritative

    • 上下文 - 目录
    • 缺省 - FastCgiAccessCheckerAuthoritative On
    • 语法 - FastCgiAccessCheckerAuthoritative On | Off

    如果 FastCGI 应用程序允许访问失败,则将 FastCgiAccessCheckerAuthoritative 伪指令明确设置成 Off,将使访问检查可传递给较低级的模块(如 Configuration 和 module.c 文件中定义的)。

    缺省情况下,不传递控制,并且失败的访问检查将导致一个禁用的回答。在禁用该缺省前,建议您仔细考虑。

    FastCgiAuthenticator

    • 上下文 - 目录
    • 语法 - FastCgiAuthenticator 文件名 [-compat]

    FastCgiAuthenticator 伪指令用于将 FastCGI 应用程序定义为每个目录的认证器。认证器通过将所提供的用户名和密码与已知用户和密码数据库或列表进行匹配,以验证请求者的身份。当用户数据库是在现有的独立程序中进行维护时,或者当它驻留在除 Web 服务器外的其它机器上时,基于 FastCGI 的认证器十分有用。

    如果 FastCGI 应用程序文件名不具备相应的静态或外部服务器定义,则此应用程序将作为动态 FastCGI 应用程序启动。如果文件名不是以斜杠 (/) 开头,则假设此文件名相对于 ServerRoot

    FastCgiAuthenticator 是在 DirectoryLocation 容器中使用的,且它必须包含 AuthType 和 AuthName 伪指令。仅支持“基本”用户认证类型。此类型需要一个 require 或 FastCgiAuthorizer 伪指令才能正常运作。

    <Directory htdocs/protected>
    AuthType Basic
    AuthName ProtectedRealm
    FastCgiAuthenticator fcgi-bin/authenticator
    require valid-user
    </Directory>

    Mod_fastcgi 几乎发送所有标准环境变量,这些环境变量通常可用于 CGI/FastCGI 请求处理程序。所有由 FastCGI 认证应用程序以成功响应(状态:200)返回的头都将作为环境变量传递给子处理程序(CGI/FastCGI 调用)。所有以不成功响应返回的头将传递给客户机。遵从 FastCGI 规范的行为可通过使用 “-compat” 选项获得。

    Mod_fastcgi 将环境变量 “FCGI_APACHE_ROLE” 设置成 “AUTHENTICATOR”,以表明要执行哪个(Apache 特定的)授权程序阶段。

    不支持从 FastCGI 授权应用程序中定制故障响应。请参阅 ErrorDocument 伪指令以获得替代办法(可处理此文档的 FastCGI 应用程序)。

    FastCgiAuthenticatorAuthoritative

    • 上下文 - 目录
    • 缺省 - FastCgiAuthenticatorAuthoritative On
    • 语法 - FastCgiAuthenticatorAuthoritative On | Off

    如果 FastCGI 应用程序认证用户失败,则将 FastCgiAuthenticatorAuthoritative 伪指令明确设置成 Off 将使认证能传递给较低级的模块(如 Configuration 和 modules.c 文件中定义的)。

    此伪指令的常见用法是与受良好保护的 AuthUserFile 结合使用,此 AuthUserFile 中包含一些(与管理相关的)用户。

    缺省情况下,不传递控制,且未知用户将导致产生一个“需要授权”回答。在禁用缺省前,建议您仔细考虑。

    FastCgiAuthorizer

    • 上下文 - 目录
    • 语法 - FastCgiAuthorizer 文件名 [-compat]

    FastCgiAuthorizer 伪指令用于将 FastCGI 应用程序定义为每个目录的授权程序。授权程序将验证是否允许经认证的用户访问请求的资源。当授权决策中存在动态组件(如一天中的时间,或者用户是否已支付其帐单)时,基于 FastCGI 的授权程序十分有用。

    如果 FastCGI 应用程序文件名不具备相应的静态或外部服务器定义,则此应用程序将作为动态 FastCGI 应用程序启动。如果文件名不是以斜杠 (/) 开头的,则假设此文件名相对于 ServerRoot

    FastCgiAuthorizer 是在 DirectoryLocation 容器内使用的,且必须包含 AuthType 和 AuthName 伪指令。此伪指令需要一条认证伪指令,如 FastCgiAuthenticator、AuthUserFile、AuthDBUserFile 或 AuthDBMUserFile 才能正常运作。

    .<Directory htdocs/protected>
    AuthType Basic
    AuthName ProtectedRealm
    AuthDBMUserFile conf/authentication-database
    FastCgiAuthorizer fcgi-bin/authorizer
    </Directory>

    Mod_fastcgi 几乎发送所有标准环境变量,这些环境变量通常可用于 CGI/FastCGI 请求处理程序。所有由 FastCGI 认证应用程序以成功响应(状态:200)返回的头都将作为环境变量传递给子进程(CGI/FastCGI 调用)。所有以不成功响应返回的头将传递给客户机。遵从 FastCGI 规范的行为是通过使用 “-compat” 选项获得的。

    Mod_fastcgi 将环境变量 “FCGI_APACHE_ROLE” 设置成 “AUTHORIZER”,以表明要执行哪个(Apache 特定的)授权程序阶段。

    不支持从 FastCGI 授权应用程序中定制故障响应。请参阅 ErrorDocument 伪指令以获得替代办法(可处理此文档的 FastCGI 应用程序)。

    FastCgiAuthorizerAuthoritative

    • 上下文 - 目录
    • 缺省 - FastCgiAuthorizerAuthoritative On
    • 语法 - FastCgiAuthorizerAuthoritative On | Off

    如果 FastCGI 应用程序认证用户失败,则将 FastCgiAuthenticatorAuthoritative 伪指令明确设置成 Off 将使认证能传递给较低级的模块(如 Configuration 和 modules.c 文件中定义的)。

    此伪指令的常见用法是与受良好保护的 AuthUserFile 结合使用,此 AuthUserFile 中包含一些(与管理相关的)用户。

    缺省情况下,不传递控制,且未知用户将导致产生一个“需要授权”回答。在禁用缺省前,建议您仔细考虑。

    FastCgiConfig

    • 上下文 - 服务器配置
    • 语法 - FastCgiConfig 选项 选项 …

    FastCgiConfig 伪指令定义了所有动态 FastCGI 应用程序的缺省参数。此伪指令不会影响静态或外部应用程序。

    动态应用程序是根据需求而启动的。如果需求很大,则将启动其它应用程序实例。当需求减弱时,将杀死应用程序实例。有许多选项可控制此进程。

    选项可以包含下列任意一项(不区分大小写): appConnTimeout n (0 秒) 等待与 FastCGI 应用程序的连接完成的秒数,或者 0 表明使用阻塞 connect()。如果超时到期,则将导致 SERVER_ERROR。对于非零值,这表示 select() 中用于写入由非阻塞 connect() 返回的文件描述符的时间量。在许多平台上,非阻塞 connect() 很容易产生问题。另见 -idle-timeout;此选项将产生类似的结果,但其方式更为简便。 idle-timeout n (30 秒) 在请求异常终止并且事件记录(错误日志级别)之前,允许 FastCGI 保持不活动的秒数。只有当与 FastCGI 应用程序的连接暂挂时,此不活动定时器才适用。如果请求进入应用程序的请求队列,而此应用程序在此期间没有响应(通过写和刷新),则此请求将异常终止。如果与应用程序的通信已完成,而与客户机的通信尚未完成(响应被高速缓存),则此超时不适用。 autoUpdate 无 此选项使得 mod_fastcgi 在处理每个请求之前,检查磁盘上应用程序的寿命。如果此应用程序的版本更加新,则通知进程管理器,并杀死所有正在运行的此应用程序的实例。最好将这一类型的功能内置到应用程序中(例如,每隔 100 个请求检查磁盘上是否有更新的版本,如果有就退出)。当此选项与 -restart 一起使用时,可能存在一个明显的问题(错误)。 gainValue n (0.5) 一个 0 至 1 间的浮点值,它在当前运行的动态 FastCGI 应用程序的指数衰减连接次数负载因子计算中用作指数。旧值通过 (1 - gainValue) 进行调节的,所以当与当前值(通过 gainValue 调节)比较时,该值越小,其权值就越重。 initial-env 名称[=值] 无 当应用程序的实例产生时,在初始环境中传递的“名称-值”对。要传递来自 Apache 环境的变量,请不要提供 “=”(如果变量实际不在此环境中,则其定义不带值)。要定义不带值的变量,提供不带任何值的 “=”。此选项可重复使用。 init-start-delay n (1 秒) 此应用程序各实例产生之间的最小秒数。此延迟减少了服务器初始化时系统发出的需求。 killInterval n(300 秒) killInterval 确定了进程管理器内动态应用程序实例杀死策略的实现频率。该数值越低,策略就越活跃;相反该数值越高,则策略越不活跃。 listen-queue-depth n (100) 由此应用程序的所有实例共享的 listen() 队列的深度(也称为累积)。深度较大的侦听队列使服务器能在不拒绝请求的情况下,应付瞬时负载波动;它不会增加吞吐量。添加附加应用程序实例会增加吞吐量及执行,这取决于应用程序和主机。 maxClassProcesses n (10) 允许任何一个 FastCGI 应用程序运行的最大动态 FastCGI 应用程序实例数。 maxProcesses n (50) 在任何时候允许运行的最大动态 FastCGI 应用程序实例数。 minProcesses n (5) 任何时候允许运行,且无须由进程管理器(因没有需求)杀死的最小动态 FastCGI 应用程序实例数。 multiThreshhold n (50) 一个 0 至 100 间的整数,用于确定是否终止任一 FastCGI 应用程序实例。如果应用程序当前有多个实例在运行,则此属性用于决定是否终止其中一个实例。如果只保留有一个实例,则替代使用 singleThreshhold。 pass-header header 无 请求环境中传递的 HTTP 请求头的名称。此选项使得头的内容(例如 Authorization)可用于 CGI 环境。 priority n (0) 为应用程序实例指定的进程优先级(使用 setpriority())。 processSlack n(5 秒) 如果当前正在运行的所有动态 FastCGI 应用程序数总和超过了 maxProcesses - processSlack,则进程管理器将调用杀死策略。此操作可通过在不活动的应用程序实例数到达 maxProcesses 之前杀死一些活动最不频繁的应用程序实例,从而改善高负载时的性能。 restart 无 此选项使进程管理器能在发生故障时重新启动动态应用程序(与静态应用程序类似)。 restart-delay n (5 秒) 重新产生此应用程序失败实例之间的最小秒数。此延迟避免了中断应用程序占用过多的系统资源。 singleThreshhold n (0) 一个 0 至 100 间的整数,用于确定是否可终止 FastCGI 应用程序的最后一个实例。如果进程管理器计算出应用程序的负载因子低于指定的阈值,则将终止最后一个实例。指定一个接近 1 的值,以使您的可执行程序以 “idle” 方式长时间运行。如果内存或 CPU 时间是主要因素,则接近 100 的值更为适用。值 为 0 将阻止终止应用程序的最后一个实例;该值也是缺省值。建议不要更改此缺省值(尤其在设置了 -appConnTimeout 的情况下)。 is set). startDelay n(3 秒) 尝试连接到动态 FastCGI 应用程序时,Web 服务器等待的秒数。如果此间隔到期,则将通知进程管理器希望启动应用程序的另一个实例。startDelay 必须小于 appConnTimeout 才有效。 updateInterval n (300 秒) updateInterval 确定了执行统计信息分析,以确定动态 FastCGI 应用程序结果的频率。 FastCgiExternalServer

    • 上下文 - 服务器配置
    • 语法 - FastCgiExternalServer 文件名 -host 主机名端口 [-appConnTimeout n]
      FastCgiExternalServer 文件名 -socket 文件名 [-appConnTimeout n]

    appConnTimeout n (0 秒) 等待到 FastCGI 应用程序的连接完成的秒数,0 表明使用阻塞 connect()。如果此超时到期,则将导致 SERVER_ERROR。对于非零值,这是指 select() 中用于写入由非阻塞 connect() 返回的文件描述符的时间量。在许多平台上,非阻塞 connect() 很容易产生问题。请参阅 -idle-timeout;此选项将产生类似的结果,但其方式更为简便。 idle-timeout n (30 秒) 在请求异常终止,并且事件记录(错误日志级别)之前,允许 FastCGI 应用程序保持不活动的秒数。只有当与 FastCGI 应用程序的连接暂挂时,此不活动定时器才适用。如果请求进入应用程序的请求队列,而此应用程序在此期间没有响应(通过写和刷新),则此请求将异常终止。如果与应用程序的通信已完成,而与客户机的通信尚未完成(响应被高速缓存),则此超时不适用。 flush 无 当从应用程序接收到数据时将其强制写入客户机。缺省情况下,mod_fastcgi 将对数据高速缓存,以快速释放此应用程序。 host 主机名:端口 无 应用程序用于与 Web 服务器通信的主机名或 IP 地址和 TCP 端口号 (1-65535)。-socket 和 -host 选项是互斥的。 Pass-header header 无 请求环境中传递的 HTTP 请求头的名称。此选项使头的内容成为可用,通常头的内容(例如 Authorization)不可用于 CGI 环境。 socket 文件名 无 UNIX:应用程序用于与 Web 服务器通信的 UNIX 域套接字的文件名。此文件名相对于 FastCgiIpcDir。-socket 和 -port 选项是互斥的。 Windows NT:应用程序用于与 Web 服务器通信的管道名。此名称相对于 FastCgiIpcDir。-socket 和 -port 选项是互斥的。 FastCgiIpcDir

    • 上下文 - 服务器配置
    • 缺省 - UNIX - FastCgiIpcDir /tmp/fcgi, Windows NT - FastCgiIpcDir \\.\pipe\ModFastCgi\
    • 语法 - UNIX - FastCgiIpcDir 目录,Windows NT - FastCgiIpcDir 名称

    UNIX:FastCgiIpcDir 伪指令指定了作为 UNIX 套接字文件存储(在外部 FastCGI 应用程序中为查找)位置的目录,该套接字文件用于应用程序和 Web 服务器之间的通信。如果此目录不是以斜杠 (/) 开头的,则假设它相对于 ServerRoot。如果此目录不存在,则假设以相应的许可权创建它。不要指定非本地文件系统中的目录。如果您使用缺省目录(或 /tmp 中的另一个目录),则如果您的系统定期从 /tmp 删除文件,mod_fastcgi 将中断。

    Windows NT:FastCgiIpcDir 伪指令指定了作为命名管道根的名称,该管道用于应用程序和 Web 服务器之间的通信。此名称的格式为 \\.\pipe\管道名。管道名部分可以包含除反斜杠外的任何字符。

    FastCgiIpcDir 伪指令必须在任何 FastCgiServerFastCgiExternalServer 伪指令(它利用 UNIX 套接字)之前。确保此目录对于 Web 服务器来说是可读、可写并可执行(可搜索)的;应该没有人能访问此目录。 FastCgiServer

    • 上下文 - 服务器配置
    • 语法 - FastCgiServer 文件名 选项 选项 …

    FastCgiServer 伪指令定义了作为静态 FastCGI 应用程序的文件名。如果文件名不是以斜杠 (/) 开头的,则假设此文件名相对于 ServerRoot

    缺省情况下,进程管理器会使用下面指定的缺省配置(圆括号中)启动应用程序的一个实例。如果由于某些原因致使静态应用程序实例失效,mod_fastcgi 将产生另一个实例以进行替换,并记录此事件(警告日志级别)。

    选项可为下列之一(不区分大小写): appConnTimeout n (0 秒) 等待到 FastCGI 应用程序的连接完成的秒数,0 表明使用阻塞 connect()。如果此超时到期,则将导致 SERVER_ERROR。对于非零值,这是指 select() 中用于写入由非阻塞 connect() 返回的文件描述符的时间量。在许多平台上,非阻塞 connect() 很容易产生问题。请参阅 idle-timeout, 它将产生类似的结果,但其方式更为简便。 idle-timeout n (30 秒) 在请求异常终止并且事件记录(错误日志级别)之前,允许 FastCGI 保持不活动的秒数。只有当与 FatCGI 应用程序的连接暂挂时,此不活动定时器才适用。如果请求进入应用程序的请求队列,而此应用程序在此期间没有响应(通过写和刷新),则此请求将异常终止。如果与应用程序的通信已完成,而与客户机的通信尚未完成(响应被高速缓存),则此超时不适用。 initial-env 名称[=值] 无] 无 在 FastCGI 应用程序初始环境中传递的“名称-值”对。要传递来自 Apache 环境的变量,请不要提供 “=”(变量实际不在环境中,其定义不带值)。要定义不带值的变量,提供不带值的 “=”。此选项可重复使用。 init-start-delay n(1 秒) 此应用程序各实例产生之间的最小秒数。此延迟减少了服务器初始化时系统发出的需求。 Flush 无 当从应用程序接收到数据时将其强制写入客户机。缺省情况下,mod_fastcgi 将对数据高速缓存,以快速释放此应用程序。 Listen-queue-depth n (100) 此应用程序的所有实例共享的 listen() 队列的深度(也称为累积)。较深的侦听队列使服务器能在不拒绝请求的情况下,应付瞬时负载波动。此选项不会增加吞吐量。添加附加应用程序实例会增加吞吐量及执行,这取决于应用程序和主机。 Pass-header header 无 请求环境中传递的 HTTP 请求头的名称。此选项使得头的内容(例如 Authorization)可用于 CGI 环境。 processes n (1) 服务器初始化时产生的应用程序实例数。 Priority n (0) 为应用程序实例指定的进程优先级(使用 setpriority())。 port n 无 应用程序用于与 Web 服务器通信的 TCP 端口号 (1-65535)。此选项使得能从网络上的其它机器访问此应用程序。-socket 和 -port 选项是互斥的。 Restart-delay n (5 秒) 重新产生此应用程序失败实例之间的最小秒数。此延迟避免了中断应用程序占用过多的系统资源。 Socket 文件名 (gen’d) UNIX:应用程序用于与 Web 服务器通信的 UNIX 域套接字的文件名。此模块在 FastCgiIpcDir 所指定的目录中创建套接字。该选项使得同一机器上的其它应用程序(例如 cgi-fcgi)能够访问此应用程序,或通过外部 FastCGI 应用程序定义 (FastCgiExternalServer) 对此应用程序进行访问。如果 -socket 和 -port 选项都没有指定,则此模块将生成一个 UNIX 域套接字文件名。-socket 和 -port 选项是互斥的。 Windows NT:应用程序应该用于与 Web 服务器通信的管道名。此模块创建了由 FastCgiIpcDir 指定的命名管道根的命名管道。该选项使得同一机器上的其它应用程序(如 cgi-fcgi)也能访问此应用程序,或者能够通过外部 FastCGI 应用程序定义 (FastCgiExternalServer) 对其进行访问。如果 -socket 和 -port 选项都没有指定,则此模块将为命名管道生成一个名称。-socket 和 -port 选项是互斥的。 FastCgiSuexec

    • 上下文 - 服务器配置
    • 缺省 - FastCgiSuexec Off
    • 语法 - FastCgiSuexec On | Off | 文件名

    FastCgiSuexec 伪指令用于启用对 suexec-wrapper 的支持。FastCgiSuexec 要求在 Apache 中启用(对于 CGI)。要使用 Apache 所使用的同一个 suexec-wrapper,将 FastCgiSuexec 设置成 On。要使用不同的 suexec-wrapper,指定 suexec-wrapper 的文件名。如果此文件名不是斜杠 (/) 开头的,则假设此文件名相对于 ServerRoot

    当启用 FastCgiSuexec 时,静态或外部 FastCGI 应用程序定义的位置十分重要。它们从定义它们的虚拟服务器中的 User 和 Group 伪指令继承了它们的用户和组。User 和 Group 伪指令应在 FastCGI 应用程序之前进行定义。此功能不会将 FastCGI 应用程序限制在定义它的虚拟服务器中,允许此应用程序对任何来自同一用户和组的虚拟服务器的请求进行服务。如果接收到的是对 FastCGI 应用程序的请求,而又不存在以此正确用户和组运行的现有匹配定义,则将用正确的用户和组启动此应用程序的动态实例。该操作将导致以不同用户/组运行同一应用程序的多个副本。如果这是问题,请从其它虚拟服务器中排除到此应用程序的导航,或者使用相同的用户和组来配置虚拟服务器。

    请参阅 Apache 文档以获得更多有关 suexec 的信息(确保您已完全理解安全性含义)。


    Tag:
    相关文章


       
      Jul
      26
      Posted (xurenlu) in php性能 on 07月-26-2007

      APC由于能够缓存文件上传进度,因此算是解决了一直以来困挠PHP开发人员的一个老大难,所以我也特别喜欢他了。如果对php实现文件上传进度条有困 难,可以看这里
      不过今天发现,APC宣称的加速功能,其实也是一种缓存,而不是对编译方式,编译过程什么的进行了优化.
      原因是,我把两个程序目录名称对调,结果发现,程序报错了.但是让人郁闷的是,错误提示是在一个已经不存在的文件的109行。后来不管怎么刷新,都是这个结果.后来只好重启web服务器了事.
      看来,APC是把编译好的php文件存放在共享内存中,以后是每过一段特定时间才重新编译一次.对于已经运行的应用,这个将大大节省你的CPU占用(虽然PHP的编译已经非常非常地快了,开启APC缓存后,仍能大副度地加速你的PHP,因为php源文件不需要在每次调用时都要编译了).从原理上说,PHP已经被改造成了Jsp式的静态脚本.只是PHP+APC的组合比Jsp的还要快,因为JSP在运行时会不断检测JSP源文件是否已经被更新,不断检测XML配置文件是否被更新.
      但是,调试期间可能需要重启Apache.
      目前没有在Lighttpd下检测以FastCGI方式运行时加入APC对PHP性能的影响。


      Tag:
      相关文章