首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

7. 数据处理

这一节介绍的参数将影响PHP处理外部变量的方式;外部变量就是通过一些外部源传递给脚本的变量。GET、POST、cookie、操作系统和服务器都可以用于提供外部数据。本节介绍的其他参数能确定PHP的默认字符集、PHP的默认MIME类型,以及外部文件是否会自动增加到PHP所返回输出的前面或后面。

l   arg_separator.output (string)

作用域:PHP_INI_ALL;默认值:&。

PHP能自动生成URL,并使用标准的&符号分隔输入变量。但是,如果需要改变这个约定,就可以使用arg_separator.output指令。

l   arg_separator.input (string)

作用域:PHP_INI_ALL;默认值:&。

&是POST或GET方法用来分隔输入变量的标准字符。虽然在PHP应用程序中改变这个约定的可能性不大,但确实可以使用arg_separator.input指令改变分隔符。

l   variables_order (string)

作用域:PHP_INI_ALL;默认值:Null。

variables_order指令确定ENVIRONMENT、GET、POST、COOLIE和SERVER变量的解析顺序。虽然看起来似乎关系不大,但如果启用了register_globals(不推荐),这些值的顺序会导致不可预料的结果,因为后面的变量会覆盖前面解析的值。

l   register_globals (On, Off)

作用域:PHP_INI_SYSTEM;默认值:Off。

如果你用过PHP 4之前的版本,那么提起这个指令足以让人谈虎色变。在PHP 4.2.0中,默认为禁用这个指令,迫使许多长期使用PHP的用户彻底地重新思考其Web应用程序开发方法(有些情况下还要重新编写应用程序)。这个改变虽然导致了很大的混乱,但最终却是为开发人员着想,可以使应用程序有更好的安全性。如果你是个新手,那么什么是最重要的呢?

在历史上,所有外部变量都自动在全局作用域注册。即所有COOKIE、ENVIRONMENT、GET、POST和SERVER类型的变量都是全局可用的。因为它们是全局可用的,所以也可以在全局范围内修改。虽然这对于有些人来讲非常方便,却带来了安全隐患,因为有些变量本来只能使用cookie来管理,现在通过URL也能进行修改。例如,假设有一个唯一标识用户的会话标识符,要通过一个cookie在页面之间传递。除了这个会话标识符所标识的用户,其他人不应看到最终映射到该用户的数据。该用户可以打开cookie复制会话标识符,并粘贴到URL的后面,如下:

然后这个用户可以将此链接通过电子邮件发送给其他用户。如果没有其他安全限制(比如IP鉴别),第二个用户就可以看到原本机密的数据。禁用register_globals就可以防止这种情况发生。因为尽管这些外部变量保留在全局范围内,但每个变量都必须与其类型一起引用。例如,前面示例中的sessionid变量只能如下使用:

试图使用其他方式(例如GET或POST)修改此参数时,会在全局范围内生成一个相应的新变量($_GET['sessionid']或$_POST['sessionid'])。3.6.3节将全面介绍COOKIE、ENVIRONMENT、GET、POST和SERVER类型的外部变量。虽然禁用register_globals确实是个好办法,但是要保护应用程序,你要记住的并非只是这一点。第21章将详细介绍PHP应用程序的安全性。

l   register_long_arrays (On, Off)

作用域:PHP_INI_SYSTEM;默认值:Off。

这个指令确定是否继续使用已经废弃的语法(如HTTP_*_VARS)来注册各种输入数组(ENVIRONMENT、GET、POST、COOKIE、SYSTEM)。出于对性能的考虑,推荐禁用这个指令。

l   register_argc_argv (On, Off)

作用域:PHP_INI_SYSTEM;默认值:On。

通过GET方法传入变量信息与向可执行文件传递参数类似。许多语言以argc和argv的形式处理这种参数。argc是参数个数,argv是包含参数的索引数组。如果希望声明变量$argc和$argv,并模拟这个功能,请启用register_argc_argv。

l   post_max_size (integer)M

作用域:PHP_INI_SYSTEM;默认值:8M。

在请求之间传递数据的两种方法中,POST更利于传输大量数据,如通过Web表单所传递的内容。但是,出于对安全性和性能的考虑,可能希望对通过这种方法向PHP脚本传递的数据量加一个上限;这可以使用post_max_size来实现。

注解   单引号和双引号在编程领域一直以来就有特殊的作用。因为它们通常都用作字符串分隔符和用于书面语中。编程中需要一种方法来区分这二者,以消除混淆。解决办法很简单:对不用来分隔字符串的所有引号转义,否则将出现不可预知的错误。考虑如下的例子:

           

             哪个引号用来分隔字符串,而哪个引号用来分隔约翰所说的话?PHP不知道,除非对某些引号转义,如下:

            

            对非分隔符的引号转义,这称为启用魔法引号(enabling magic quote)。这个过程可以自动完成,即启用指令magic_quotes_gpc(本节将介绍),也可以使用函数addslashes()和stripslashes()手动完成。推荐使用后者,因为这样你能完全控制应用程序。但是有时你的应用程序可能希望对引号自动转义,就需要相应地启用这种行为。

            在这方面,确定PHP行为的三个参数是:magic_quotes_gpc、magic_quotes_runtime和magic_quotes_sybase。

l   magic_quotes_gpc (On, Off)

作用域:PHP_INI_SYSTEM;默认值:On。

这个参数确定是否对GET、POST和cookie方法传输的数据启用魔法引号。启用时,所有单引号、双引号、反斜线和空字符都使用反斜线自动转义。

l   magic_quotes_runtime (On, Off)

作用域:PHP_INI_ALL;默认值:Off。

启用此参数时,所有来自外部资源(如数据库或文本文件)的数据中的引号都会自动转义(使用反斜线)。

l   magic_quotes_sybase (On, Off)

作用域:PHP_INI_ALL;默认值:Off。

此参数只在启用magic_quotes_runtime时有效。如果启用了magic_quotes_sybase,所有来自外部资源的数据都将使用一个单引号而不是反斜线进行转义。如果数据来自Sybase数据库,这就非常有用,因为Sybase数据库的转义字符不是反斜线,而是非传统的单引号。

l   auto_prepend_file (string)

作用域:PHP_INI_SYSTEM;默认值:Null。

在PHP脚本执行前,要创建页眉模板或导入代码库,通常使用include()或require()函数来完成。可以在auto_prepend_file指令中指定文件名和相应的路径,自动完成此过程,在脚本中预先导入这些函数。

l   auto_append_file (string)

作用域:PHP_INI_SYSTEM;默认值:Null。

在PHP脚本执行后自动插入页脚模板时,通常使用include()或require()函数来完成。可以在auto_append_file指令中指定文件名和相应的路径,自动完成此过程,在脚本中预先导入这些函数。

l   default_mimetype (string)

作用域:PHP_INI_ALL;默认值:SAPI_DEFAULT_MIMETYPE。

MIME类型为划分因特网文件类型提供了一种标准方法。通过PHP应用程序可以提供任何文件类型,其中最常见的是text/html。但是,如果以其他方式使用PHP,如使用WML(无线标记语言,Wireless Markup Language)应用程序的内容生成器,就需要相应地改变MIME类型。为此,可以修改default_mimetype指令。

l   default_charset (string)

作用域:PHP_INI_ALL;默认值:SAPI_DEFAULT_CHARSET。

从版本4.0b4起,PHP会在Content-type首部中输出字符编码方式。默认情况下是iso-8859-1,它支持英语、西班牙语、德语、意大利语和葡萄牙语等语言。但是,如果应用程序要支持日语、中文或希伯来语等语言,就要相应地修改default_charset指令,更新字符集设置。

l   always_populate_raw_post_data (On, Off)

作用域:PHP_INI_PERDIR;默认值:On。

启用always_populate_raw_post_data指令时,会使PHP为变量$HTTP_RAW_POST_DATA赋一个串,其中包含以POST方法传递的名/值对,即使表单变量没有相应的值。例如,假设启用了此指令,而且和创建了一个包含两个文本字段的表单。一个字段是用户名,另一个字段是用户的电子邮件地址。在表单动作中,只执行一条命令:

如果两个字段都不填,点击提交按钮,将得到如下输出:

如果填写两个字段,再点击提交按钮,将得到如下输出:

8. 路径和目录

本节将介绍确定PHP默认路径设置的指令。这些路径用于导入函数库和扩展包,以及确定用户Web目录和Web文档根目录。

l   include_path (string)

作用域:PHP_INI_ALL;默认值:PHP_INCLUDE_PATH。

此参数指定的路径是include()、require()和fopen_with_path()等函数使用的基本路径。可以指定多个目录,各目录之间用分号分隔,如下面的例子所示:

默认情况下,此参数设置为环境变量PHP_INCLUDE_PATH所定义的路径。

注意,在Windows下,以上使用斜线的地方要使用反斜线,路径前要加驱动器盘符。例如:

l   doc_root (string)

作用域:PHP_INI_SYSTEM;默认值:Null。

此参数确定提供所有PHP脚本的默认位置。此参数非空时才会使用。

l   user_dir (string)

作用域:PHP_INI_SYSTEM;默认值:Null。

user_dir指令指定在使用/~username约定打开文件时,PHP所使用的绝对目录。例如,当user_dir设置为/home/users时,如果用户试图打开文件~/gilmore/collections/books.txt,PHP就知道绝对路径是/home/users/gilmore/collections/books.txt。

l   extension_dir (string)

作用域:PHP_INI_SYSTEM;默认值:PHP_EXTENSION_DIR。

extension_dir指令告诉PHP可加载的扩展包(模块)的位置。在默认情况下,其值为./,这表示可加载扩展包与所执行脚本位于相同的位置。在Windows环境下,如果没有设置extension_dir,则默认为C:\PHP-INSTALLATION-DIRECTORY\ext\。在UNIX环境下,此目录的位置取决于几个因素,不过一般来说,很可能是PHP-INSTALLATION-DIRECTORY/lib/php/extensions/no-debug-zts- RELEASE-BUILD-DATE/。

l   enable_dl (On, Off)

作用域:PHP_INI_SYSTEM;默认值:On。

enable_dl()函数允许用户在运行时加载PHP扩展包;即在脚本执行期间加载。

9. 文件上传

PHP支持通过POST方法上传和管理文本文件及二进制文件。有3个指令支持这个功能,本节将分别介绍。

提示   PHP的文件上传功能将在第15章介绍。

l   file_uploads (On, Off)

作用域:PHP_INI_SYSTEM;默认值:On。

file_uploads指令确定是否启用PHP的文件上传功能。

l   upload_tmp_dir (string)

作用域:PHP_INI_SYSTEM;默认值:Null。

每一次文件上传到服务器时,大多数操作系统都将其放在临时目录中。可以通过upload_tmp_dir指令指定文件上传所用的目录。

l   upload_max_filesize (integer)M

作用域:PHP_INI_SYSTEM;默认值:2M。

upload_max_filesize指令设置PHP上传机制所处理的文件大小上限,以MB为单位。

10. fopen包装器

这部分介绍5个指令,这些指令与访问和处理远程文件有关。

l   allow_url_fopen (On, Off)

作用域:PHP_INI_ALL;默认值:On。

启用allow_url_fopen使得PHP可以将远程文件看作是本地文件。启用时,如果远程服务器上的文件有正确的权限,PHP脚本能够访问和修改这些文件。

l   from (string)

作用域:PHP_INI_ALL;默认值:Null。

from指令在名字上可能会有些误导,实际上它确定的是用于完成FTP连接的匿名用户密码,而不是标识。因此,如果from的值为:

那么,在进行鉴别时,要将用户名anonymous和密码jason@example.com传递给服务器。

l   user_agent (string)

作用域:PHP_INI_ALL;默认值:Null。

PHP总会随所处理的输出发送一个内容首部,其中包含一个用户代理属性。user_agent指令将确定这个属性的值。

l   default_socket_timeout (integer)

作用域:PHP_INI_ALL;默认值:60。

该指令确定基于套接字的流的超时值,以秒为单位。

l   auto_detect_line_endings (On, Off)

作用域:PHP_INI_ALL;默认值:Off。

有一个问题一直令开发人员很头疼,这就是行结束符(EOL),因为不同操作系统使用了不同的语法。启用auto_detect_line_endings将确定fgets()和file()读取的数据使用的是Macintosh、MS-DOS还是UNIX的文件约定。

11. 动态扩展

动态扩展部分只包含一个指令:extension。

l   extension (string)

作用域:PHP_INI_ALL;默认值:Null。

extension指令用来动态加载某个模块。在Win32操作系统下,模块可能如下加载:

在UNIX下,可以如下加载:

记住,在两种操作系统上,如果只是增加这样一行,或者取消这样一行的注释,并不一定能启用相关的扩展包。还需要确保在操作系统中安装了适当的软件。例如,为启用Java支持,还需要安装JDK。

12. 模块设置

这部分介绍的指令将影响PHP与各种操作系统功能和非默认扩展包(如Java和各种数据库服务器)之间的交互行为。本部分只介绍部分指令,后面章节中还将出现更多的有关内容。

13. syslog

可以使用操作系统的日志工具来记录PHP的运行时信息和错误。有一个指令可以用来调整此行为,如下定义。

l   define_syslog_variables (On, Off)

作用域:PHP_INI_ALL;默认值:Off。

这个指令指定是否自动定义syslog变量,如$LOG_PID和$LOG_CRON。出于对性能的考虑,推荐禁用此指令。

14. Mail

PHP的mail()函数为通过PHP脚本发送电子邮件提供了一个很方便的途径。有4个指令来确定PHP的这种行为。

l   SMTP (string)

作用域:PHP_INI_ALL;默认值:localhost。

SMTP指令只应用于Win32操作系统,这个指令确定了发送邮件时PHP所要用的SMTP服务器的DNS名或IP地址。Linux/UNIX用户要用sendmail_path指令来配置PHP的邮件特性。

l   smtp_port (int)

作用域:PHP_INI_ALL;默认值:25。

smtp_port指令只应用于Win32操作系统,指定了PHP通过服务器(由SMTP指令指定)发送邮件时所用的端口。

l   sendmail_from (string)

作用域:PHP_INI_ALL;默认值:Null。

sendmail_from指令只应用于Win32操作系统,指定了PHP开始发送电子邮件时所用的发送者标识。

l   sendmail_path (string)

作用域:PHP_INI_SYSTEM;默认值:DEFAULT_SENDMAIL_PATH。

sendmail_path指令只应用于UNIX操作系统,主要用来向sendmail守护进程传递附加选项。不过,如果sendmail安装在非标准目录中,sendmail_path也可以用来确定sendmail的位置。

15. Java

PHP可以通过其Java扩展包来实例化Java类。在这方面,以下4个指令确定了PHP的这种行为。注意,通过Java servlet API将PHP作为一个Java servlet运行也是可以的,但这不在本书讨论范围内。更多信息请参考PHP手册。

l   java.class.path (string)

作用域:PHP_INI_ALL;默认值:Null。

java.class.path目录指定Java类存储的位置。

l   java.home (string)

作用域:PHP_INI_ALL;默认值:Null。

java.home指令指定JDK二进制文件目录的位置。

l   java.library (string)

作用域:PHP_INI_ALL;默认值:JAVALIB。

java.library指令指定Java虚拟机(JVM)的位置。

l   java.library.path (string)

作用域:PHP_INI_ALL;默认值:Null。

java.library.path指令指定PHP的Java扩展包的位置。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论