php 网格化管理模式特点模式和列表模式怎么做的

php.ini 详解
php5.2 的 php.ini 中文版;;;;;;;;;;;;;;;; 简介 ;;;;;;;;;;;;;;;;; 本文并非是对英文版 php.ini 的简单翻译,而是参考了众多资料以后,结合自己的理解,增加了许多内容,; 包括在原有 php.ini 基础上增加了一些实用模块的配置说明,同时对文件内容的安排进行了调整。; 由于作者不喜欢 no-free 的玩意儿,所以删除了除 MySQL 和 PostgreSQL 以外的其他数据库模块配置选项。;;;;;;;;;;;;;;;;;;; 关于php.;;;;;;;;;;;;;;;;;;; 这个文件必须命名为'php.ini'并放置在httpd.conf中的PHPIniDir指令指定的目录中。; 最新版本的php.ini可以在下面两个位置查看:; http://cvs.php.net/viewvc.cgi/php-src/php.ini-recommended?view=co; http://cvs.php.net/viewvc.cgi/php-src/php.ini-dist?view=co;;;;;;;;;;;;;; 语法 ;;;;;;;;;;;;;;; 该文件的语法非常简单。空白字符和以分号开始的行被简单地忽略。; 章节标题(例如: [php])也被简单地忽略,即使将来它们可能有某种意义。;; 设置指令的格式如下:; directive = value; 指令名(directive)是大小写敏感的!所以"foo=bar"不同于"FOO=bar"。; 值(value)可以是:; 1. 用引号界定的字符串(如:"foo"); 2. 一个数字(整数或浮点数,如:0, 1, 34, -1, 33.55); 3. 一个PHP常量(如:E_ALL, M_PI); 4. 一个INI常量(On, Off, none); 5. 一个表达式(如:E_ALL & ~E_NOTICE);; INI文件中的表达式仅使用:位运算符、逻辑非、圆括号:; | 位或; & 位与; ~ 位非; ! 逻辑非;; 布尔标志用 On 表示打开,用 Off 表示关闭。;; 一个空字符串可以用在等号后不写任何东西表示,或者用 none 关键字:; foo = 将foo设为空字符串; foo = 将foo设为空字符串; foo ="none"; 将foo设为字符串'none';; 如果你在指令值中使用动态扩展(PHP扩展或Zend扩展)中的常量,; 那么你只能在加载这些动态扩展的指令行之后使用这些常量。;;;;;;;;;;;;;;;;;;;; httpd.;;;;;;;;;;;;;;;;;;;; 还可以在httpd.conf中覆盖php.ini的值,以进行更灵活的配置:; php_设置非bool型的指令,将value设为none则清除先前的设定; php_flag name on|仅用于设置bool型的指令;; PHP常量(如E_ALL)仅能在php.ini中使用,在httpd.conf中必须使用相应的掩码值。; 带"SYS"标志的指令只能在httpd.conf中的全局配置部分使用,; 带"ini"标志的指令不能在httpd.conf中使用,它们仅能用于php.ini中。;==========================================================================================;;=====================================配置指令详解========================================;==========================================================================================; 以下每个指令的设定值都与 PHP-5.2 内建的默认值相同。; 也就是说,如果'php.ini'不存在,或者你删掉了某些行,默认值与之相同。;;;;;;;;;;;;;;;; A;;;;;;;;;;;;;;;[Apache]; 仅在将PHP作为Apache模块时才有效。engine = On; 是否启用PHP解析引擎。; 可以在httpd.conf中基于目录或者虚拟主机来打开或者关闭PHP解析引擎。last_modified = Off; 是否在Last-Modified应答头中放置该PHP脚本的最后修改时间。xbithack = Off; 是否不管文件结尾是什么,都作为PHP可执行位组来解析。child_terminate = Off; PHP脚本在请求结束后是否允许使用apache_child_terminate()函数终止子进程。; 该指令仅在UNIX平台上将PHP安装为Apache1.3的模块时可用。其他情况下皆不存在。;;;;;;;;;;;;;;;;; PHP核心 ;;;;;;;;;;;;;;;;;[PHP-Core-DateTime]; 前四个配置选项目前仅用于date_sunrise()和date_sunset()函数。date.default_latitude = 31.7667; 默认纬度date.default_longitude = 35.2333; 默认经度date.sunrise_zenith = 90.583333; 默认日出天顶date.sunset_zenith = 90.583333; 默认日落天顶date.timezone =; 未设定TZ环境变量时用于所有日期和时间函数的默认时区。; 中国大陆应当使用"PRC"; 应用时区的优先顺序为:; 1. 用date_default_timezone_set()函数设定的时区(如果设定了的话); 2. TZ 环境变量(如果非空的话); 3. 该指令的值(如果设定了的话); 4. PHP自己推测(如果操作系统支持); 5. 如果以上都不成功,则使用 UTC[PHP-Core-Assert]assert.active = On; 是否启用assert()断言评估assert.bail = Off; 是否在发生失败断言时中止脚本的执行assert.callback =; 发生失败断言时执行的回调函数assert.quiet_eval = Off; 是否使用安静评估(不显示任何错误信息,相当于error_reporting=0)。; 若关闭则在评估断言表达式的时候使用当前的error_reporting指令值。assert.warning = On; 是否对每个失败断言都发出警告[PHP-Core-SafeMode]; 安全模式是为了解决共享服务器的安全问题而设立的。; 但试图在PHP层解决这个问题在结构上是不合理的,; 正确的做法应当是修改web服务器层和操作系统层。; 因此在PHP6中废除了安全模式,并打算使用open_basedir指令取代之。safe_mode = Off;SYS; 是否启用安全模式。; 打开时,PHP将检查当前脚本的拥有者是否和被操作的文件的拥有者相同,; 相同则允许操作,不同则拒绝操作。safe_mode_gid = Off;SYS; 在安全模式下,默认在访问文件时会做UID比较检查。; 但有些情况下严格的UID检查反而是不适合的,宽松的GID检查已经足够。; 如果你想将其放宽到仅做GID比较,可以打开这个参数。safe_mode_allowed_env_vars ="PHP_";SYS; 在安全模式下,用户仅可以更改的环境变量的前缀列表(逗号分隔)。; 允许用户设置某些环境变量,可能会导致潜在的安全漏洞。; 注意: 如果这一参数值为空,PHP将允许用户更改任意环境变量!safe_mode_protected_env_vars ="LD_LIBRARY_PATH";SYS; 在安全模式下,用户不能更改的环境变量列表(逗号分隔)。; 这些变量即使在safe_mode_allowed_env_vars指令设置为允许的情况下也会得到保护。safe_mode_exec_dir ="/usr/local/php/bin";SYS; 在安全模式下,只有该目录下的可执行程序才允许被执行系统程序的函数执行。; 这些函数是:system, escapeshellarg, escapeshellcmd, exec, passthru,; proc_close, proc_get_status, proc_nice, proc_open, proc_terminate, shell_execsafe_mode_include_dir =;SYS; 在安全模式下,该组目录和其子目录下的文件被包含时,将跳过UID/GID检查。; 换句话说,如果此处的值为空,任何UID/GID不符合的文件都不允许被包含。; 这里设置的目录必须已经存在于include_path指令中或者用完整路径来包含。; 多个目录之间用冒号(Win下为分号)隔开。; 指定的限制实际上是一个前缀,而非一个目录名,; 也就是说"/dir/incl"将允许访问"/dir/include"和"/dir/incls"; 如果您希望将访问控制在一个指定的目录,那么请在结尾加上斜线。sql.safe_mode = Off;SYS; 是否使用SQL安全模式。; 如果打开,指定默认值的数据库连接函数将会使用这些默认值代替支持的参数。; 对于每个不同数据库的连接函数,其默认值请参考相应的手册页面。[PHP-Core-Safe]allow_url_fopen = On;ini; 是否允许打开远程文件allow_url_include = Off;SYS; 是否允许include/require远程文件。disable_classes =;ini; 该指令接受一个用逗号分隔的类名列表,以禁用特定的类。disable_functions =;ini; 该指令接受一个用逗号分隔的函数名列表,以禁用特定的函数。enable_dl = On;SYS; 是否允许使用dl()函数。dl()函数仅在将PHP作为apache模块安装时才有效。; 禁用dl()函数主要是出于安全考虑,因为它可以绕过open_basedir指令的限制。; 在安全模式下始终禁用dl()函数,而不管此处如何设置。expose_php = On;ini; 是否暴露PHP被安装在服务器上的事实(在http头中加上其签名)。; 它不会有安全上的直接威胁,但它使得客户端知道服务器上安装了PHP。open_basedir =;SYS; 将PHP允许操作的所有文件(包括文件自身)都限制在此组目录列表下。error_prepend_string = ;""; 用于错误信息前输出的字符串error_append_string = ;""; 用于错误信息后输出的字符串xmlrpc_errors = Offxmlrpc_error_number = 0; 尚无文档[PHP-Core-Logging]define_syslog_variables = Off; 是否定义各种系统日志变量,如:$LOG_PID, $LOG_CRON 等等。; 关掉它以提高效率的好主意。; 你可以在运行时调用define_syslog_variables()函数来定义这些变量。error_log =; 将错误日志记录到哪个文件中。该文件必须对Web服务器用户可写。; syslog 表示记录到系统日志中(NT下的事件日志, Unix下的syslog(3)); 如果此处未设置任何值,则错误将被记录到Web服务器的错误日志中。log_errors = Off; 是否在日志文件里记录错误,具体在哪里记录取决于error_log指令。; 强烈建议你在最终发布的web站点时使用日志记录错误而不是直接输出,; 这样可以让你既知道那里出了问题,又不会暴露敏感信息。log_errors_max_len = 1024; 设置错误日志中附加的与错误信息相关联的错误源的最大长度。; 这里设置的值对显示的和记录的错误以及$php_errormsg都有效。; 设为 0 可以允许无限长度。ignore_repeated_errors = Off; 记录错误日志时是否忽略重复的错误信息。; 错误信息必须出现在同一文件的同一行才被被视为重复。ignore_repeated_source = Off; 是否在忽略重复的错误信息时忽略重复的错误源。[PHP-Core-Mail]; 要使邮件函数可用,PHP必须在编译时能够访问sendmail程序。; 如果使用其它的邮件程序,如qmail或postfix,确保使用了相应的sendmail包装。; PHP首先会在系统的PATH环境变量中搜索sendmail,接着按以下顺序搜索:; /usr/bin:/usr/sbin:/usr/etc:/etc:/usr/ucblib:/usr/lib; 强烈建议在PATH中能够找到sendmail。; 另外,编译PHP的用户必须能够访问sendmail程序。SMTP ="localhost"; mail()函数中用来发送邮件的SMTP服务器的主机名称或者IP地址。仅用于win32。smtp_port = 25; SMTP服务器的端口号。仅用于win32。sendmail_from =; 发送邮件时使用的"From:"头中的邮件地址。仅用于win32; 该选项还同时设置了"Return-Path:"头。sendmail_path ="-t -i";SYS; 仅用于unix,也可支持参数(默认的是'sendmail -t -i'); sendmail程序的路径,通常为"/usr/sbin/sendmail或/usr/lib/sendmail"。; configure脚本会尝试找到该程序并设定为默认值,但是如果失败的话,可以在这里设定。; 不使用sendmail的系统应将此指令设定为sendmail替代程序(如果有的话)。; 例如,Qmail用户通常可以设为"/var/qmail/bin/sendmail"或"/var/qmail/bin/qmail-inject"。; qmail-inject 不需要任何选项就能正确处理邮件。mail.force_extra_parameters =; 作为额外的参数传递给sendmail库的强制指定的参数附加值。; 这些参数总是会替换掉mail()的第5个参数,即使在安全模式下也是如此。[PHP-Core-ResourceLimit]default_socket_timeout = 60; 默认socket超时(秒)max_execution_time = 30; 每个脚本最大允许执行时间(秒),0 表示没有限制。; 这个参数有助于阻止劣质脚本无休止的占用服务器资源。; 该指令仅影响脚本本身的运行时间,任何其它花费在脚本运行之外的时间,; 如用system()/sleep()函数的使用、数据库查询、文件上传等,都不包括在内。; 在安全模式下,你不能用ini_set()在运行时改变这个设置。memory_limit = 16M; 一个脚本所能够申请到的最大内存字节数(可以使用K和M作为单位)。; 这有助于防止劣质脚本消耗完服务器上的所有内存。; 要能够使用该指令必须在编译时使用"--enable-memory-limit"配置选项。; 如果要取消内存限制,则必须将其设为 -1 。; 设置了该指令后,memory_get_usage()函数将变为可用。max_input_time = -1; 每个脚本解析输入数据(POST, GET, upload)的最大允许时间(秒)。; -1 表示不限制。post_max_size = 8M; 允许的POST数据最大字节长度。此设定也影响到文件上传。; 如果POST数据超出限制,那么___FCKpd___0POST和___FCKpd___0FILES将会为空。; 要上传大文件,该值必须大于upload_max_filesize指令的值。; 如果启用了内存限制,那么该值应当小于memory_limit指令的值。realpath_cache_size = 16K;SYS; 指定PHP使用的realpath(规范化的绝对路径名)缓冲区大小。; 在PHP打开大量文件的系统上应当增大该值以提高性能。realpath_cache_ttl = 120;SYS; realpath缓冲区中信息的有效期(秒)。; 对文件很少变动的系统,可以增大该值以提高性能。[PHP-Core-FileUpLoad]file_uploads = On;SYS; 是否允许HTTP文件上传。; 参见upload_max_filesize, upload_tmp_dir, post_max_size指令upload_max_filesize = 2M; 允许上传的文件的最大尺寸。upload_tmp_dir =;SYS; 文件上传时存放文件的临时目录(必须是PHP进程用户可写的目录)。; 如果未指定则PHP使用系统默认的临时目录。[PHP-Core-MagicQuotes]; PHP6将取消魔术引号,相当于下列指令全部为 Offmagic_quotes_gpc = On; 是否对输入的GET/POST/Cookie数据使用自动字符串转义( '" NULL )。; 这里的设置将自动影响___FCKpd___0GEST___FCKpd___0POST___FCKpd___0COOKIE 数组的值。; 若将本指令与magic_quotes_sybase指令同时打开,则仅将单引号(')转义为(''),; 其它特殊字符将不被转义,即(" NULL )将保持原样!!; 建议关闭此特性,并使用自定义的过滤函数。magic_quotes_runtime = Off; 是否对运行时从外部资源产生的数据使用自动字符串转义( '" NULL )。; 若打开本指令,则大多数函数从外部资源(数据库,文本文件等)返回数据都将被转义。; 例如:用SQL查询得到的数据,用exec()函数得到的数据,等等; 若将本指令与magic_quotes_sybase指令同时打开,则仅将单引号(')转义为(''),; 其它特殊字符将不被转义,即(" NULL )将保持原样!!; 建议关闭此特性,并视具体情况使用自定义的过滤函数。magic_quotes_sybase = Off; 是否采用Sybase形式的自动字符串转义(用 '' 表示 ')[PHP-Core-HighLight]highlight.bg ="#FFFFFF"<ment ="#FF8000"highlight.default ="#0000BB"highlight.html ="#000000"highlight.keyword ="#007700"highlight.string ="#DD0000"; 语法高亮模式的色彩(通常用于显示 .phps 文件)。; 只要能被接受的东西就能正常工作。[PHP-Core-Langue]short_open_tag = On; 是否允许使用"&? ?>"短标识。否则必须使用"&?php ?>"长标识。; 除非你的php程序仅在受控环境下运行,且只供自己使用,否则请不要使用短标记。; 如果要和XML结合使用PHP,可以选择关闭此选项以方便直接嵌入"&?xml ... ?>",; 不然你必须用PHP来输出:&? echo '&?xml version="1.0"'; ?>; 本指令也会影响到缩写形式"&?=",它和"&? echo"等价,要使用它也必须打开短标记。asp_tags = Off; 是否允许ASP风格的标记"&% %>",这也会影响到缩写形式"&%="。; PHP6中将删除此指令arg_separator.output ="&"; PHP所产生的URL中用来分隔参数的分隔符。; 另外还可以用"&"或","等等。arg_separator.input ="&"; PHP解析URL中的变量时使用的分隔符列表。; 字符串中的每一个字符都会被当作分割符。; 另外还可以用",&"等等。allow_call_time_pass_reference = On; 是否强迫在函数调用时按引用传递参数(每次使用此特性都会收到一条警告)。; php反对这种做法,并在将来的版本里不再支持,因为它影响到了代码的整洁。; 鼓励的方法是在函数声明里明确指定哪些参数按引用传递。; 我们鼓励你关闭这一选项,以保证你的脚本在将来版本的语言里仍能正常工作。auto_globals_jit = On; 是否仅在使用到___FCKpd___0SERVER和___FCKpd___0ENV变量时才创建(而不是在脚本一启动时就自动创建)。; 如果并未在脚本中使用这两个数组,打开该指令将会获得性能上的提升。; 要想该指令生效,必须关闭register_globals和register_long_arrays指令。auto_prepend_file =auto_append_file =; 指定在主文件之前/后自动解析的文件名。为空表示禁用该特性。; 该文件就像调用了include()函数被包含进来一样,因此会使用include_path指令的值。; 注意:如果脚本通过exit()终止,那么自动后缀将不会发生。variables_order ="EGPCS"; PHP注册 Environment, GET, POST, Cookie, Server 变量的顺序。; 分别用 E, G, P, C, S 表示,按从左到右注册,新值覆盖旧值。; 举例说,设为"GP"将会导致用POST变量覆盖同名的GET变量,; 并完全忽略 Environment, Cookie, Server 变量。; 推荐使用"GPC"或"GPCS",并使用getenv()函数访问环境变量。register_globals = Off; 是否将 E, G, P, C, S 变量注册为全局变量。; 打开该指令可能会导致严重的安全问题,除非你的脚本经过非常仔细的检查。; 推荐使用预定义的超全局变量:___FCKpd___0ENV,___FCKpd___0GET,___FCKpd___0POST,___FCKpd___0COOKIE,___FCKpd___0SERVER; 该指令受variables_order指令的影响。; PHP6中已经删除此指令。register_argc_argv = On; 是否声明$argv和$argc全局变量(包含用GET方法的信息)。; 建议不要使用这两个变量,并关掉该指令以提高性能。register_long_arrays = On; 是否启用旧式的长式数组(HTTP_*_VARS)。; 鼓励使用短式的预定义超全局数组,并关闭该特性以获得更好的性能。; PHP6中已经删除此指令。always_populate_raw_post_data = Off; 是否总是生成$HTTP_RAW_POST_DATA变量(原始POST数据)。; 否则,此变量仅在遇到不能识别的MIME类型的数据时才产生。; 不过,访问原始POST数据的更好方法是 php://input 。; $HTTP_RAW_POST_DATA对于enctype="multipart/form-data"的表单数据不可用。unserialize_callback_func =; 如果解序列化处理器需要实例化一个未定义的类,; 这里指定的回调函数将以该未定义类的名字作为参数被unserialize()调用,; 以免得到不完整的"__PHP_Incomplete_Class"对象。; 如果这里没有指定函数,或指定的函数不包含(或实现)那个未定义的类,将会显示警告信息。; 所以仅在确实需要实现这样的回调函数时才设置该指令。; 若要禁止这个特性,只需置空即可。y2k_compliance = On; 是否强制打开2000年适应(可能在非Y2K适应的浏览器中导致问题)。zend.ze1_compatibility_mode = Off; 是否使用兼容Zend引擎I(PHP 4.x)的模式。; 这将影响对象的复制、构造(无属性的对象会产生FALSE或0)、比较。; 兼容模式下,对象将按值传递,而不是默认的按引用传递。precision = 14; 浮点型数据显示的有效位数。serialize_precision = 100; 将浮点型和双精度型数据序列化存储时的精度(有效位数)。; 默认值能够确保浮点型数据被解序列化程序解码时不会丢失数据。[PHP-Core-OutputControl]; 输出控制函数很有用,特别是在已经输出了信息之后再发送HTTP头的情况下。; 输出控制函数不会作用于header()或setcookie()等函数发送的HTTP头,; 而只会影响类似于echo()函数输出的信息和嵌入在PHP代码之间的信息。implicit_flush = Off; 是否要求PHP输出层在每个输出块之后自动刷新数据。; 这等效于在每个 print()、echo()、HTML块 之后自动调用flush()函数。; 打开这个选项对程序执行的性能有严重的影响,通常只推荐在调试时使用。; 在CLI SAPI的执行模式下,该指令默认为 On 。output_buffering = 0; 输出缓冲区大小(字节)。建议值为。; 输出缓冲允许你甚至在输出正文内容之后再发送HTTP头(包括cookies)。; 其代价是输出层减慢一点点速度。; 设置输出缓冲可以减少写入,有时还能减少网络数据包的发送。; 这个参数的实际收益很大程度上取决于你使用的是什么Web服务器以及什么样的脚本。output_handler =; 将所有脚本的输出重定向到一个输出处理函数。; 比如,重定向到mb_output_handler()函数时,字符编码将被透明地转换为指定的编码。; 一旦你在这里指定了输出处理程序,输出缓冲将被自动打开(output_buffering=4096)。; 注意0: 此处仅能使用PHP内置的函数,自定义函数应在脚本中使用ob_start()指定。; 注意1: 可移植脚本不能依赖该指令,而应使用ob_start()函数明确指定输出处理函数。;
使用这个指令可能会导致某些你不熟悉的脚本出错。; 注意2: 你不能同时使用"mb_output_handler"和"ob_iconv_handler"两个输出处理函数。;
你也不能同时使用"ob_gzhandler"输出处理函数和zlib.output_compression指令。; 注意3: 如果使用zlib.output_handler指令开启zlib输出压缩,该指令必须为空。在PHP 中可以使用 ini_set();string ini_set ( string varname, string newvalue )Sets the value of the given configuration option. Returns the old value on success, FALSE on failure. The configuration option will keep this new value during the script's execution, and will be restored at the script's ending.例如可以修改文件上传最大大小。而且只对当前脚本有效
最新教程周点击榜
微信扫一扫当前位置:&>&&>&&>&
Apache中php工作模式的区别(CGI模式、Apache 模块DLL)
发布时间:编辑:
本文介绍下,php在apache的两种工作模式下的区别,即在CGI模式、Apache 模块DLL的不同之处,有需要的朋友参考下。
windows下PHP工作于Apache 2.0.x 之中,有两种方法:
一种是 使用CGI可执行程序,另一种是适用 Apache 模块的DLL。
两种工作方式的安装:
PHP 在 Apache 2.0 中的 CGI 方式
ScriptAlias /php/ &c:/php/&
AddType application/x-httpd-php .php
# 对 PHP 4 用这行
Action application/x-httpd-php &/php/php.exe&
# 对 PHP 5 用这行
Action application/x-httpd-php &/php/php-cgi.exe&
PHP 在 Apache 2.0 中的模块方式
# 对 PHP 4 用这两行:
LoadModule php4_module &c:/php/php42.dll&
# 别忘了从 sapi 目录中把 php4apache2.dll 拷贝出来!
AddType application/x-httpd-php .php
# 对 PHP 5 用这两行:
LoadModule php5_module &c:/php/php5apache2.dll&
AddType application/x-httpd-php .php
# 配置 php.ini 的路径
PHPIniDir &C:/php&
两种工作方式的区别:
在CGI模式下,如果客户机请求一个,Web就调用php.exe去解释这个文件,然后再把解释的结果以网页的形式返回给客户机;
而在模块化(DLL)中,PHP是与Web服务器一起启动并运行的。
所以从某种角度上来说,以apache模块方式安装的 PHP4有着比CGI模式更好的安全性以及更好的执行效率和速度。
一、FastCGI是什么?
  FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail- Over特性等等。
FastCGI的官方站点在http://www..com
FastCGI的工作原理是:
  1、Web Server 启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module);
  2、FastCGI进程管理器自身初始化,启动多个CGI解释器进程 (在任务管理器中可见多个php-cgi.exe)并等待来自Web Server的连接。
  3、当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI和标准输入发送到FastCGI子进程php-cgi.exe。
  4、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在 WebServer中)的下一个连接。 在正常的CGI模式中,php-cgi.exe在此便退出了。
  在上述情况中,你可以想象 CGI通常有多慢。每一个Web请求PHP都必须重新解析php.ini、重新载入全部dll扩展并重初始化全部数据结构。使用FastCGI,所有这些都只在进程启动时发生一次。一个额外的好处是,持续连接(Persistent database connection)可以工作。
二、为什么要使用FastCGI,而不是多线程CGI解释器?
  这可能出于多方面的考虑,例如:
  1、你无论如何也不能在windows平台上稳定的使用多线程CGI解释器,无论是IIS ISAPI方式还是APACHE Module方式,它们总是运行一段时间就崩溃了。奇怪么?但是确实存在这样的情况!
  当然,也有很多时候你能够稳定的使用多线程CGI解释器,但是,你有可能发现网页有时候会出现错误,无论如何也找不到原因,而换用FastCGI方式时这种错误的概率会大大的降低。我也不清楚这是为什么,我想独立地址空间的CGI解释器可能终究比共享地址空间的形式来得稳定一点点。
  2、性能!性能?可能么,难道FastCGI比多线程CGI解释器更快?但有时候确实是这样,只有测试一下你的网站,才能最后下结论。原因嘛,我觉得很难讲,但有资料说在Zend WinEnabler的时代,Zend原来也是建议在Windows平台下使用FastCGI而不是IIS ISAPI或Apache Module,不过现在Zend已经不做这个产品了。
三、不使用FastCGI的理由
  1、多进程比多线程消耗更多的服务器内存,php-cgi.exe解释器每进程消耗7至25兆内存,将这个数字乘以50或100试试。
  2、性能。确实有时候多线程CGI解释器更快,呵呵,而且有时候,它也很稳定。
  3、CGI?听起来就很土,呵呵
四、IIS FastCGI配置方法
  1、首先确定你已正确安装了PHP 4.3.x及更新的版本。早期版本的PHP并未默认加入FastCGI支持,如果你想在早期版本中工作,需要重新编译它。我们假设PHP安装在 c:/php,支持FastFCGI的可执行文件名是php-cgi.exe。
注意:建议在Php.ini中关闭cgi.force_redirect,启用fastcgi.impersonate,启用cgi.rfc2616_header
  2、下载/fastcgi/fastcgi-0.6.zip并将其中的isapi_fcgi.dll解压缩到c:/php目录下(不是必须在此目录,这里只是叙述方便)。
  3、使用regedit.exe建立如下项:
  HKEY_LOCAL_MACHINE:Software/FASTCGI/.php (必需)
  4、在此项下建立如下键值:
  字符串类型:AppPath,值为c:/php/php-cgi.exe (必需)
  字符串类型:BindPath,值为php-fcgi      (必需)
  以下是可选配置键值:
  DWORD类型:StartServers,启动时默认启动的解释器个数,默认值5
  DWORD类型:MaxServers,最大解释器个数,默认25
  DWORD类型:IncrementServers,当解释器不够用时增量个数,默认2
  DWORD类型:Timeout,增量解释器(超出StartServers数目的)存活时间,默认600(秒)
  DWORD类型:ThreadPoolSize,线程池大小,仅IIS下有效,默认10
  DWORD类型:Impersonate,仅IIS有效,如果为1,使用IIS安全标志,为0则关闭此特性。不要关闭它除非你不担心安全问题。默认1
  DWORD类型:MaxPostData,Post数据预读Byte限制,默认0
  DWORD类型:BypassAuth,仅IIS有效,如果为1并且isapi_fcgi.dll被配置为IIS Filter,同时IIS被配置为使用BASIC Authentication,这将强制所有认证请求使用IIS匿名用户。这一选项的目的是允许实现自己的安全机制。默认0
  BINARY类型:CustomVars,附加环境变量值,新行分隔,Null结束
  5、如果是IIS6,添加一个Web服务扩展指向c:/php/isapi_fcgi.dll,并允许。应用程序池中的&最大工作进程数&请保持为1。
  6、添加应用程序扩展映射关系:
&&&&& 1). 在Internet信息服务管理器中,选择网站或应用程序的根目录。
&&&&& 2). 打开目录属性页(右键选择&属性&),再选择&主目录&。
&&&&& 3). 点击&配置&按钮,选择&映射&Tab页。
&&&&& 4). 点击&添加...&,在&可执行文件&设为: c:/php/isapi_fcgi.dll,扩展名设为.php,一定要选择&确认文件是否存在&,然后&确定&保存设置。
&&&&& 5). 再同样添加对.php3或.phtml扩展名的支持(可选)。
&&&&& 6). 保存设定并重新启动IIS。
  7、测试一下,同时请求多个Web页面,然后察看任务管理器中的进程,页面完成后php-cgi.exe进程持续运行并不退出。
五、Apache配置方法
  1、首先确定你已正确安装了PHP 4.3.x及更新的版本。早期版本的PHP并未默认加入FastCGI支持,如果你想在早期版本中工作,需要重新编译它。我们假设PHP安装在 c:/php,支持FastFCGI的可执行文件名是php-cgi.exe。
    注意:建议在Php.ini中打开cgi.force_redirect,关闭fastcgi.impersonate,关闭cgi.rfc2616_headers。
  2、下载/dist/mod_fastcgi-2.4.2-AP20.dll,放到Apache 2.x的Modules目录中。
  3、确定Apache 2.x在CGI方式下可以正常运行PHP。httpd.conf中存在如下几行:
复制代码 代码示例:
 ScriptAlias /php/ &c:/php/&
    Action application/x-httpd-php &/php/php-cgi.exe&
    SetEnv PHPRC &C:/php&
    AddType application/x-httpd-php .php
  4、在httpd.conf中添加:
复制代码 代码示例:
LoadModule fastcgi_module modules/mod_fastcgi-2.4.2-AP20.dll
    # 说明:此处的 -processes 3 表示启动三个 php-cgi.exe 进程,
    # 关于 FastCgiServer 的详细参数请参考 FastCGI 文档。
    FastCgiServer &c:/php/php-cgi.exe& -processes 3
  5、重新启动Apache,测试同上。
六、高级配置
  设想这样一种场景,你的服务器上同时跑Apache 2和IIS 6,两个Web服务器都跑php应用。那么,有如下三种可能:
  A、php使用iis isapi和apache module安装,均为多线程方式运行。这个和FastCGI没有关系。
  B、其中一个服务器使用FastCGI方式,另一个使用多线程方式。这个能运行正常。
  C、两个均使用FastCGI方式,这个往往不正常。一般表现为:
    两个服务器各自启动一些php-cgi.exe进程,然后服务器之一不解释php页面,或者隔一会儿就派生新的php-cgi.exe进程(可怕呀)。
  为什么呢?我想大概是因为上面使用的两个东西(iis isapi和apache module)的作者大概并没有想过要和对方同时使用吧,呵呵。想了想,Apache 2和IIS 6如果可以共用一批php-cgi.exe解释器就好了,既不浪费内存,估计也不会有调度问题了。
  经过研究和测试证明,这个想法是可行的。但是,由于Shane Caraveo并未在ISAPI DLL中提供使用外置FastCGI服务的功能,因此在此场景中只能是由IIS负责启动和管理php-cgi.exe,然后配置Apache去使用这些受 IIS管理的php-cgi.exe进程。
  配置方法:
  1、按上述四中的方法配置IIS FastCGI。
  2、基本按上述五中的方法配置Apache FastCGI,五.4改为在httpd.conf中添加:
复制代码 代码示例:
LoadModule fastcgi_module modules/mod_fastcgi-2.4.2-AP20.dll
    # 使用外部FastCGI服务器,请参考 FastCGI 文档。
    FastCgiExternalServer &c:/php/php-cgi.exe& -socket &php-fcgi&
  注意:-socket参数后的值必须与HKEY_LOCAL_MACHINE:Software/FASTCGI/.php中BindPath的值一致,这样两个FastCGI进程管理器才会使用同一个命名管道连接php-cgi.exe。
  注意:此配置中php-cgi.exe进程只受IIS中的FastCGI进程管理器管理, Apache的繁忙请求并不会使IIS中的FastCGI调度更多的php-cgi.exe进程。因此,在IIS中配置FastCGI时应当使 StartServers值足够大,以避免php解释器数量不足。同样带来的问题是,如果IIS关闭了,那么Apache就会找不到Php解释器了,这个要留心。
问题1:此时的php.ini中cgi.force_redirect、fastcgi.impersonate、cgi.rfc2616_headers应该怎么设定呢?这个留给大家去思考吧&&呵呵
问题2,IIS非常空闲,一段时间后由IIS启动的php-cgi.exe退出了,则apache就解释不了 Php了,怎么办呢?
这时访问iis网站,php-cgi.exe就又起来了。
建议:使用IIS 6的进程池管理,在应用程序池中关掉&空闲超时&,并且,在&应用程序池标识&中将运行账号设定为与Apache服务启动账号一致。
与 Apache中php工作模式的区别(CGI模式、Apache 模块DLL) 有关的文章
本文标题:
本页链接:
12345678910
12345678910

我要回帖

更多关于 网格化管理模式特点 的文章

 

随机推荐