php中文完整教程
收集:TTXS(Fcbu.Com)
来源:互联网
时间:2006-06-25
目录:
I. 入门指引
1. 简介
2. 简明教程
3. 安装
4. 运行时配置
II. 语言参考
5. 基本语法
6. 类型
7. 变量
8. 常量
9. 表达式
10. 运算符
11. 流程控制
12. 函数
13. 类与对象
14. Classes and Objects (PHP 5)
15. 引用的解释
III. 安全
16. 安全
IV. 特点
17. 用 PHP 进行 HTTP 认证
18. Cookies
19. Dealing with XForms
20. 文件上传处理
21. 使用远程文件
22. 连接处理
23. 数据库永久连接
24. 安全模式
25. PHP 的命令行模式
章 1. 简介
目录
PHP 是什么?
PHP 能做什么?
PHP 是什么?
PHP(“PHP: Hypertext Preprocessor”,超文本预处理器的字母缩写)是一种被广泛应用的开放源代码的多用途脚本语言,它可嵌入到 HTML中,尤其适合 WEB 开发。
以上是一个简单的回答,不过这是什么意思呢?请看如下例子:
例子 1-1. 一个介绍性的范例
<html>
<head>
<title>Example</title>
</head>
<body>
<?php
echo "Hi, I';m a PHP script!";
?>
</body>
</html>
请注意这个范例和其它用 C 或 Perl 语言写的脚本之间的区别――与用大量的命令来编写程序以输出 HTML 不同的是,我们用 PHP 编写了一个 HTML 脚本,其中嵌入了一些代码来做一些事情(例如,在本例中我们输出了一些文本)。PHP 代码被特殊的起始符和结束符包含,使得您可以进出“PHP 模式”。
和客户端的 JavaScript 不同的是,PHP 代码是运行在服务端的。如果您在您的服务器上建立了如上例类似的代码,则在运行该脚本后,客户端就能接收到其结果,但他们无法得知其背后的代码是如何运作的。您甚至可以将 WEB 服务器设置成让 PHP 来处理所有的 HTML 文件,这么一来,用户就无法得知服务端到底做了什么。
使用 PHP 的一大好处是它对于初学者来说及其的简单,同时也给专业的程序员提供了各种高级的特性。当您看到 PHP 长长的特性列表时,请不要害怕。您可以很快的入门,只需几个小时您就可以自己写一些简单的脚本。
尽管 PHP 的开发是以服务端脚本为目的地,但事实上其功能远不局限与此。请继续读后面的章节,在“PHP 能做什么?”一节中您将获得更多的信息。
PHP 能做什么?
PHP 能做任何事。PHP 主要是用于服务端的脚本程序,因此您可以用 PHP 来完成任何其它的 CGI 程序能够完成的工作,例如收集表单数据,生成动态网页,或者发送/接收 Cookies。但 PHP 的功能远不局限于此。
PHP 脚本主要用于以下三个领域。
服务端脚本。这是 PHP 最传统,也是最主要的目标领域。开展这项工作您需要具备以下三点:PHP 解析器(CGI 或者服务器模块)、WEB 服务器和 WEB 浏览器。您需要在运行 WEB 服务器时,安装并配置 PHP,然后,可以用 WEB 浏览器来访问 PHP 程序的输出,即浏览服务端的 PHP 页面。请查阅“安装”一章以获取更多信息。
命令行脚本。您可以编写一段 PHP 脚本,并且不需要任何服务器或者浏览器来运行它。通过这种方式,您仅仅只需要 PHP 解析器来执行。这种用法对于依赖 cron(Unix 或者 Linux 环境)或者 Task Scheduler(Windows 环境)的日常运行的脚本来说是理想的选择。这些脚本也可以用来处理简单的文本。请参阅“PHP 的命令行模式”以获取更多信息。
编写客户端的 GUI 应用程序。对于基于窗口式的应用程序来说,PHP 或许不是一种最好的语言,但是如果您非常精通 PHP,并且希望在您的客户端应用程序中使用 PHP 的一些高级特性,您可以利用 PHP-GTK 来编写这些程序。用这种方法,您还可以编写跨平台的应用程序。PHP-GTK 是 PHP 的一个扩展,在通常发布的 PHP 包中并不包含它。如果您对 PHP-GTK 感兴趣,请访问其网站以获取更多信息。
PHP 能够用在所有的主流操作系统上,包括 Linux、Unix 的各种变种(包括 HP-UX、Solaris 和 OpenBSD)、Microsoft Windows、Mac OS X、RISC OS 等。今天,PHP已经支持了大多数的 WEB 服务器,包括 Apache、Microsoft Internet Information Server(IIS)、Personal Web Server(PWS)、Netscape 以及 iPlant server、Oreilly Website Pro Server、Caudium、Xitami、OmniHTTPd 等。对于大多数的服务器,PHP 提供了一个模块;还有一些 PHP 支持 CGI 标准,使得 PHP 能够作为 CGI 处理器来工作。
综上所述,使用 PHP,您可以自由地选择操作系统和 WEB 服务器。同时,您还可以在开发时选择使用面对过程和面对对象,或者两者混和的方式来开发。尽管 PHP 目前的版本还没有支持 OOP 所有的标准,但很多代码仓库和大型的应用程序(包括 PEAR 库)仅使用 OOP 代码来开发。
使用 PHP,您并不局限于输出 HTML。PHP 还能被用来动态输出图像、PDF 文件甚至 Flash 动画(使用 libswf 和 Ming)。您还能够非常简便的输出文本,例如 XHTML 以及任何其它形式的 XML 文件。PHP 能够自动生成这些文件,在服务端开辟出一块动态内容的缓存,可以直接把它们打印出来,或者将它们存储到文件系统中。
PHP 最强大最显著的特性之一,是它支持很大范围的数据库。您会发现利用 PHP 编写数据库支持的网页简单得难以置信。目前,PHP 支持如下数据库:
Adabas D Ingres Oracle (OCI7 and OCI8)
dBase InterBase Ovrimos
Empress FrontBase PostgreSQL
FilePro (read-only) mSQL Solid
Hyperwave Direct MS-SQL Sybase
IBM DB2 MySQL Velocis
Informix ODBC Unix dbm
我们同时还有一个 DBX 扩展库使得您可以自由的使用该扩展库支持的任何数据库。另外,PHP 还支持 ODBC,即 Open Database Connection Standard(开放数据库连接标准),因此您可以连接任何其它支持该世界标准的数据库。
PHP 还支持利用诸如 LDAP、IMAP、SNMP、NNTP、POP3、HTTP、COM(Windows 环境)等不计其数的协议的服务。您还可以开放原始网络端口,使得任何其它的协议能够协同工作。PHP 支持和所有 WEB 开发语言之间的 WDDX 复杂数据交换。关于相互连接,PHP 已经支持了对 Java 对象的即时连接,并且可以将他们自由的用作 PHP 对象。您甚至可以用我们的 CORBA 扩展库来访问远程对象。
PHP 具有极其有效的文本处理特性,支持从 POSIX 扩展或者 Perl 正则表达式到 XML 文档解析。为了解析和访问 XML 文档,我们支持了 SAX 和 DOM 标准。您可以使用我们的 XSLT 扩展库来转换 XML 文档。
如果您将 PHP 用于电子商务领域,您会发现其 Cybercash payment、CyberMUT、VeriSign Payflow Pro 以及 CCVS 函数对于您的在线交易程序来所是非常有用的。
另外,我们还有很多其它有趣的扩展库。例如 mnoGoSearch 搜索引擎函数、IRC 网关函数、多种压缩工具(gzip、bz2)、日历转换、翻译……
由于在这里我们无法列出 PHP 所有的特性和可提供的便利,请您参阅“安装”以及“函数参考”等有关章节以获取关于这里提到的扩展库更多的信息。
章 2. 简明教程
目录
我需要些什么?
您的第一个 PHP 页面
实用的脚本
处理表单
在新版本的 PHP 中使用旧的 PHP 代码
下一步做什么?
本章我们将给出关于 PHP 的简明教程。虽然 PHP 的功能并不局限于生成动态的 WEB 页面,但本章的内容仅涉及于此。请查阅题为“PHP 能做什么?”一节以获取更多信息。
使用了 PHP 的 WEB 页面将被和通常的 HTML 页面一样处理,您可以用建立 HTML 页面的通常方法来建立和编辑它们。
我需要些什么?
在本教程中,我们假设您的服务器已经安装并运行了 PHP,所有以 .php 结尾的文件都将由 PHP 来处理。在大部分的服务器上,这是 PHP 的默认扩展名,不过,也请询问您的服务器管理员以确认。如果您的服务器支持 PHP,则您不需要做任何事情。您只用建立您的 .php 文件,并把他们放置到您的 WEB 目录中,服务器将神奇的自动为您解析这些文件。您不用编译任何东西,也不用安装任何其它的工具,您仅仅只需把这些使用了 PHP 的文件想象成简单的 HTML 文件,其中只不过多了一种新的标识符,在这里您可以做各种各样的事情。大多数的 WEB 主机都提供 PHP 的支持,如果您的主机不支持,您可以阅读“PHP 链接”一节中的资源来查找支持 PHP 的 WEB 主机。
我们假设您希望在本地机器开发以节约宝贵的带宽。在这种情况下,您需要安装一个诸如 Apache 的 WEB 服务器,当然还有 PHP。您可能还希望安装一个数据库,例如 MySQL。您可以单独安装它们,当然简单的方法是获取一个预先配置的安装包,用这个安装包,您只用点击几下鼠标,就可以自动的安装所有这些系统。在任何操作系统下建立有 PHP 支持的 WEB 服务器都十分简单,包括 Linux 和 Windiws。在 Linux 下,您会发现 rpmfind 和 PBone 能够在获取 RPM 时为您提供帮助。
您的第一个 PHP 页面
在您的 WEB 服务器根目录(DOCUMENT_ROOT)下建立一个文件名为 hello.php,然后完成如下内容:
例子 2-1. 我们的第一个 PHP 脚本: hello.php
<html>
<head>
<title>PHP Tes</title>
</head>
<body>
<?php echo "<p>Hello World</p>"; ?>
</body>
</html>
在浏览器的地址栏里输入 URL 访问这个文件,在结尾加上“/hello.php”。如果您在本地开发,那么这个 URL 一般是 http://http://www.zjjv.com///books.php 找到有关 PHP 的书籍的列表。
我们需要介绍的第二个原理,是对 strpos() 函数的调用。strpos() 是 PHP 的一个内建函数,其功能是在一个字符串中搜索另外一个字符串。例如我们现在需要在 $_SERVER["HTTP_USER_AGENT">(即所谓的 haystack) 变量中寻找 "MSIE"。如果在这个 haystack 中该字符串(即所谓的 needle)被找到,则函数返回 needle 在 haystack 中相对开头的位置;如果没有,则返回 FALSE。如果该函数没有返回 FALSE,则 if 会将条件判断为 TRUE 并运行其大括号 {} 内的代码;否则,则不运行这些代码。您可以自己尝试利用if、else以及其它的函数,例如 strtoupper() 和 strlen(),来建立类似的脚本。在本手册中,相关的页面也包含有范例。如果您对如何使用函数不是很确定,您可以阅读手册中有关“如何阅读函数定义”和“PHP 函数”的有关函数。
以下我们进一步显示如何进出 PHP 模式,甚至是在一个 PHP 代码块的中间:
例子 2-5. 混和 HTML 和 PHP 模式
<?php
if (strpos($_SERVER["HTTP_USER_AGENT">, "MSIE") !== false) {
?>
<h3>strpos must have returned non-false</h3>
<center><b>You are using Internet Explorer</b></center>
<?php
} else {
?>
<h3>strpos must have returned false</h3>
<center><b>You are not using Internet Explorer</b></center>
<?php
}
?>
该脚本的输出可能是:
<h3>strpos must have returned no-false</h3>
<center><b>You are using Internet Explorer</b></center>
和以上我们用一个 PHP 的 echo 语句来输出不同的是,我们跳出了 PHP 模式来直接写 HTML 代码。这里很值得注意的一点是,对于这两种情况而言,脚本的逻辑效率是相同的。在判断了 strpos() 函数的返回值是 TRUE 或是 FALSE,也就是判断了字符串 MSIE 是否被找到之后,最终只有一个 HTML 块被发送给浏览者。
处理表单
PHP 一个很有用的特点体现在它处理 PHP 表单的方式。您需要理解的非常重要的原理,是表单的任何元素都在您的 PHP 脚本中自动生效。请参阅本手册“PHP 之外的变量”以获取关于在 PHP 中使用表单的详细信息及范例。以下是 HTML 表单的范例:
例子 2-6. 一个简单的 HTML表单
<form action="action.php" method="POST">
Your name: <input type="text" name="name" />
Your age: <input type="text" name="age" />
<input type="submit">
</form>
该表单中并没有什么特殊的地方,其中没有使用任何特殊的标识符。当用户填写了该表单并点击了提交按钮,页面 action.php 将被调用。在该文件中,您可以加入如下内容:
例子 2-7. 打印来自表单的数据
Hi <?php echo $_POST["name">; ?>.
You are <?php echo $_POST["age">; ?> years old.
该脚本的输出可能是:
Hi Joe.
You are 22 years old.
该脚本进行的工作应该已经很明显了,这儿并没有其它更复杂的内容。PHP 将自动为您设置 $_POST["name"> 和 $_POST["age"> 变量。在这之前我们使用了自动全局变量 $_SERVER,现在我们引入了自动全局变量 $_POST,它包含了所有的 POST 数据。请注意我们的表单提交数据的方法(method)。如果我们能使用了 GET 方法,那么表单中的信息将被储存到自动全局变量 $_GET 中。如果您并不关心请求数据的来源,您也可以用自动全局变量 $_REQUEST,它包含了所有 GET、POST、COOKIE 和 FILE 的数据。请参阅 import_request_variables() 函数。
在新版本的 PHP 中使用旧的 PHP 代码
现在,PHP 已经发展成为一种流行的脚本语言,您可以在很多公共的资源里找到您可以在您自己的脚本中重新利用的代码。PHP 语言的开发者为向下兼容性下了很多功夫,因此在新版本的 PHP 下,老版本的代码应该可以在不作任何改动的情况下(理想地)运行。不过实际上,我们还是必须对老的代码做一些改动。
有可能影响到老版本的代码的最重要的两点改动分别是:
取消了旧的 $HTTP_*_VARS 数组(在函数或者方法中他们原本是全局变量)。PHP 4.1.0 版本引入了如下自动全局数组变量: $_GET、$_POST、 $_COOKIE、$_SERVER、 $_FILE、$_ENV、$_REQUEST 以及 $_SESSION。 老的 $HTTP_*_VARS 数组,诸如 $HTTP_POST_VARS 等,从 PHP 3 就已经开始使用,它们仍然存在。 在 PHP 5.0.0 中,长的 PHP 预定义数组可以通过设置 register_long_arrays 来屏蔽。
外部变量不再默认得被注册为全局变量。也就是说,从 PHP 4.2.0 版本开始,$php.ini; 中的设置选项 register_globals 默认值变成了 off。我们建议您用以上提到的自动全局数组变量来访问这些值。但可能老的脚本、书籍以及教程都可能建立在该设置为 on 的基础上。如果该选项被设置为 on,则您便可以在 URL http://http://www.zjjv.com///foo.php?id=42 中直接使用变量 $id。但不管被设置为 on 还是 off,$_GET[';id';> 一直有效。
如果您希望了解关于这些改动的细节,请参阅“预定义变量”一节以及其中的超链接。
下一步做什么?
用您现在掌握的知识,您应该能够理解本手册中的大部分内容以及其中各式各样的脚本范例。在 php.net 网站的连接区 http://http://www.zjjv.com///links.php 您能购获得其它更多的范例。
请查阅 PHP Conference 资料网站 http://http://www.zjjv.com/// 及 http://http://www.zjjv.com/// 以观看更多幻灯片,这些幻灯片展示了许多 PHP 其它的功能。
后退 起点 前进
在新版本的 PHP 中使用旧的 PHP 代码 上一级 安装
章 3. 安装
目录
安装前的准备
在 Unix/HP-UX 系统上安装
Unix/Linux 安装
Unix/Mac OS X installs
在 Unix/OpenBSD 系统上安装
Unix/Solaris 安装
在 Unix 系统上安装
Windows 系统下的安装
Servers-CGI/命令行
Apache 服务器 1.x 版本
Apache 服务器 2.x 版本
Caudium 服务器
fhttpd 服务器
IIS/PWS 服务器
Servers-Netscape, iPlanet and SunONE
OmniHTTPd 服务器
Sambar 服务器
Xitami 服务器
其它 web 服务器
问题?
安装前的准备
安装前,首先您需要了解您需要 PHP 做什么。您可以在三个领域使用 PHP,正如 PHP 能做什么? 一节中所描述的:
服务器端脚本运行
命令行脚本运行
客户端图形界面(GUI)程序
首先且最普遍的情况,您需要三样东西:PHP 自己,一个 Web 服务器和一个 Web 浏览器。您可能已经安装了 Web 浏览器,根据您安装操作系统的不同,您或许也已经安装好了 Web 服务器(例如,Linux 下的 Apache 或 Windows 下的 IIS)。或许您从某个公司租了些网站空间,如果是这样,您无须任何设置,便可以写 PHP 脚本,上传到您租的服务器空间中,并从浏览器中看到运行结果。
如果您需要自己设置服务器,您有两种将 PHP 连接到 Web 服务器的方法。对于大多数 Web 服务器 PHP 都有相应的模块接口(也叫做 SAPI)。这些服务器包括 Apache, 微软 Internet Information Server,Netscape 和 iPlanet 服务器。许多其它的服务器支持 ISAPI――微软模块接口(例如 OmniHTTPd 服务器)。如果 PHP 不支持作为您的 Web 服务器的模块,您总是能够将 PHP 作为 CGI 处理器使用的。这意味着您可以设置您的 Web 服务器使用命令行可执行文件 PHP(在 Windows 下是 php.exe)处理所有该服务器上的 PHP 文件请求。
如果您也对 PHP 命令行脚本感兴趣(例如,写一个脚本在离线的情况下自动生成一些图片,或者根据一些传递的命令行参数处理文本文件),您就需要命令行脚本运行功能。更多信息,请参考 撰写 PHP 命令行程序 一节。如果是这样的话,您不需要服务器和浏览器。
您也可以使用 PHP 的 PHP-GTK 扩展撰写客户端图形界面(GUI)程序。这与编写网页的方法有很大不同,因为您不输出任何 HTML,而是使用它们管理窗口和对象。更多关于 PHP-GTK 的信息,请 访问该扩展的网站。PHP-GTK 没有包含在官方 PHP 发布包中。
从这里开始往后,本节都将讲解如何在 Unix 和 Windows 下的 Web 服务器中使用模块和CGI方式安装 PHP。
下载 PHP,源代码和二进制发布包可以在 http://http://www.zjjv.com/// 找到。我们建议您选择最靠近您地理位置的 镜像服务器 下载发布包。
在 Unix/HP-UX 系统上安装
本章节的内容和提示仅限于将 PHP 安装到 HP-UX 系统上。(此文章是由 paul_mckay at clearwater-it dot co dot 编写的)。
注: 本文涉及的技巧适用于 PHP 4.0.4 and Apache 1.3.9.
安装 PHP 你需要一个 gzip,你可以从如下地址得到该软件的二进制版本的发行包 http://http://www.zjjv.com//.uk/ftp/hpux/Gnu/gzip-1.2.4a/gzip-1.2.4a-sd-10.20.depot.Z,下载后解压缩,并且使用 swinstall 安装。
安装 PHP 你需要 gcc,你可以从如下地址得到该软件的二进制版本的发行包 http://http://www.zjjv.com//.uk/ftp/hpux/Gnu/binutils-2.9.1/binutils-2.9.1-sd-10.20.depot.gz,解压缩这个文件,使用 swinstall 安装 binutils。
安装 PHP 你需要 bison,你可以从如下地址得到该软件的二进制版本的发行包 http://http://www.zjjv.com//.uk/ftp/hpux/Gnu/bison-1.28/bison-1.28-sd-10.20.depot.gz,安装方式同上。
安装 PHP 你需要 flex,你需要从 http://http://www.zjjv.com// 的镜像站点下载一个该软件的源代码。它被放置于一个 非 gnu 目录的 ftp 服务器上。下载这个文件,并且使用 gunzip 解压缩,然后执行 tar -xvf。进入新创建的 flex 目录并运行 ./configure,再执行 make 以及 make install。
如果这里出现了错误,很可能是由于 gcc 等工具不在路径中,应将其添加到环境变量 PATH 中。
下载 PHP 和 apache 的源代码。
下载后对他们分别执行 gunzip 和 tar -xvf。在开始编译他们之前我们需要修改一些文件。
首先 configure 文件需要被修改,因为它似乎忘记自己是在 hpux 系统下了,有更好的方法解决此问题,但最省事的是在配置脚本的第 47286 行加入 lt_target=hpux10.20。
其次是修改 Apache GuessOS 文件。在文件 apache_1.3.9/src/helpers 的第 89 行,将参数 echo "hp${HPUXMACH}-hpux${HPUXVER}"; exit 0 替换为 echo "hp${HPUXMACH}-hp-hpux${HPUXVER}"; exit 0。
你不能把 PHP 作为共享对象方式安装到 HP-UX 因此你必须把他编译成为一个静态方式,参照 Apache 站点的指导就可以完成。
这样就完成了 PHP 和 Apache 的 安装编译,然而你的 Apache 将仍然不能启动,你必须为 Apache 配置一个新的用户名,例如 www 或 apache。然后修改你的 apache 配置文件 conf/httpd.conf 的 252 和 253 行,由原来的
User nobody
Group nogroup
替换为类似如下的内容
User www
Group sys
这是因为在 hp-ux 系统下, apache 不能作为 nobody 用户运行。按照上面的方式配置 Apache 和 PHP 就应该可以正常工作了。
Unix/Linux 安装
本节包含了在 Linux 发行版上安装 PHP 的说明和提示。
使用包
许多 Linux 发行版有某种类型的包安装系统,比如说 RPM。 这能够建立一个标准的配置,但当你需要一些不同特性(比如说安全服务器、不同的数据库驱动)时,你就需要安装 PHP 和 Web 服务器。如果你不熟悉怎样安装和编译你自己的软件,那么你可以去寻找,看是否有人已经制作了一个含有你所需要的 PHP 特性的包。
Unix/Mac OS X installs
This section contains notes and hints specific to installing PHP on Mac OS X Server.
Using Packages
There are a few pre-packaged and pre-compiled versions of PHP for Mac OS X. This can help in setting up a standard configuration, but if you need to have a different set of features (such as a secure server, or a different database driver), you may need to build PHP and/or your web server yourself. If you are unfamiliar with building and compiling your own software, it';s worth checking whether somebody has already built a packaged version of PHP with the features you need.
Compiling for OS X server
There are two slightly different versions of Mac OS X, client and server. The following is for OS X Server.
Mac OS X server install.
Get the latest distributions of Apache and PHP.
Untar them, and run the configure program on Apache like so. ./configure --exec-prefix=/usr \
--localstatedir=/var \
--mandir=/usr/share/man \
--libexecdir=/System/Library/Apache/Modules \
--iconsdir=/System/Library/Apache/Icons \
--includedir=/System/Library/Frameworks/Apache.framework/Versions/1.3/Headers \
--enable-shared=max \
--enable-module=most \
--target=apache
If you want the compiler to do some optimization., you may also want to add this line: setenv OPTIM=-O2
Next, go to the PHP 4 source directory and configure it. ./configure --prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var \
--mandir=/usr/share/man \
--with-xml \
--with-apache=/src/apache_1.3.12
If you have any other additions (MySQL, GD, etc.), be sure to add them here. For the --with-apache string, put in the path to your apache source directory, for example /src/apache_1.3.12.
Type make and make install. This will add a directory to your Apache source directory under src/modules/php4.
Now, reconfigure Apache to build in PHP 4. ./configure --exec-prefix=/usr \
--localstatedir=/var \
--mandir=/usr/share/man \
--libexecdir=/System/Library/Apache/Modules \
--iconsdir=/System/Library/Apache/Icons \
--includedir=/System/Library/Frameworks/Apache.framework/Versions/1.3/Headers \
--enable-shared=max \
--enable-module=most \
--target=apache \
--activate-module=src/modules/php4/libphp4.a
You may get a message telling you that libmodphp4.a is out of date. If so, go to the src/modules/php4 directory inside your apache source directory and run this command: ranlib libmodphp4.a. Then go back to the root of the apache source directory and run the above configure command again. That';ll bring the link table up to date. Run make and make install again.
Copy and rename the php.ini-dist file to your bin directory from your PHP 4 source directory: cp php.ini-dist /usr/local/bin/php.ini or (if your don';t have a local directory) cp php.ini-dist /usr/bin/php.ini.
Compiling for MacOS X client
Those tips are graciously provided by Marc Liyanage.
The PHP module for the Apache web server included in Mac OS X. This version includes support for the MySQL and PostgreSQL databases.
NOTE: Be careful when you do this, you could screw up your Apache web server!
Do this to install:
Open a terminal window.
Type wget http://http://www.zjjv.com///downloads.php 获得,此程序将安装 PHP 的 CGI 版本,并且自动配置好 IIS,PWS 和 Xitami 三种 Web 服务器。
注: 此外注意,尽管 InstallShield installer 是一种使 PHP 运行起来的简单方法,但是有很多限制,例如不支持自动设置扩展库。只有下载 zip 压缩包才包含了所有支持的扩展库。
安装好你选用的 HTTP 服务器并且确定工作正常。
运行可执行的安装程序并按照安装向导的提示进行安装。安装程序支持两种安装方法 - 标准,尽量提供最佳默认参数,高级,在安装过程中提问。
安装向导收集足够的信息来配置 php.ini 文件并且配置 Web 服务器来使用 PHP。在 NT Workstation 下的 IIS 和 PWS 中,会列出服务器上所有节点的脚本映射,你可以在这些节点中选择哪些加入 PHP 的脚本映射。
一旦安装结束,安装程序会提示是否需要重新启动系统。重启动服务器或者开始使用 PHP。
警告
注意,这样安装的 PHP 并不安全。如果你想要更安全的安装 PHP,最好手工进行,并且小心地配置每个选项。自动进行的安装程序只是提供一个可以马上使用的 PHP,并不意味着可以用在在线的服务器上。
手工安装步骤
本安装指南帮你手工安装和配置 PHP 到你的 Windows Webserver。本指南的原始版本由 Bob Silva 编译,位于 http://http://www.zjjv.com///php/win32install.html。你需要从 http://http://www.zjjv.com///downloads.php 下载一个包含可执行版本的 zip 包。
PHP 4 的 Windows 版有三种方式 - CGI 可执行程序(php.exe),CLI 可执行程序(sapi/php.exe) 和其它一些 SAPI 模块:
php4apache.dll - Apache 1.3.x 模块
php4apache2.dll - Apache 2.0.x 模块
php4isapi.dll - ISAPI 兼容服务器的 ISAPI 模块,例如 IIS 4.0/PWS 4.0 或更新版本
php4nsapi.dll - Netscape/iPlanet 模块
最后一种是 PHP 4 新提供的方式,提供了显著的性能增长以及一些新功能。还有一个 CLI 版本在PHP 的命令行模式一章中有进一步说明。
警告
SAPI 模块在 4.1 版中有了显著的增强,但是,在一些老系统中,你也许会遇到可能的服务器错误或者其他的模块例如 ASP 失败。
DCOM and MDAC requirements: 如果你选择了其中一个 SAPI 模块并且是在 Windows 95 下使用,要确认从微软的 DCOM 页面下载安装了 DCOM 更新。如果使用 Windows 9x/NT4,需要下载最新版本的 Microsoft Data Access Components (MDAC),位于 http://http://www.zjjv.com///data/。
不论何种 Web 服务器,都需要先进行以下步骤:
将 PHP 压缩包释放到你选择的目录中。c:\ 就不错。压缩包会被释放到一个类似 php-4.3.1-Win32 的新目录中,该目录最好被改名为 php。为方便以及版本无关起见,以下步骤中假定 PHP 位于 c:\php 中。可以选择其它的路径但最好不要用中间有空格的路径(例如:C:\Program Files\PHP 就不太好),如果这样做有些 Web 服务器会崩溃。解压缩后的 PHP 目录结构看上去像这样:
c:\php
|
--cli
| |
| |-php.exe -- CLI 可执行程序 - 仅用于命令行脚本
|
|
--dlls -- 支持扩展库的 dll --> Windows 系统目录
| |
| |-expat.dll
| |
| |-fdftk.dll
| |
| |-...
|
--extensions -- PHP 扩展库的 dll
| |
| |-php_bz2.dll
| |
| |-php_cpdf.dll
| |
| |-..
|
--mibs -- SNMP 的支持文件
|
|
--openssl -- Openssl 的支持文件
|
|
--pdf-related -- PDF 的支持文件
|
|
--sapi -- SAPI dlls
| |
| |-php4apache.dll
| |
| |-php4apache2.dll
| |
| |-php4isapi.dll
| |
| |-..
|
|-install.txt
|
|-..
|
|-php.exe -- CGI 可执行程序
|
|-..
|
|-php.ini-dist
|
|-php.ini-recommended
|
|-php4ts.dll -- 主 dll --> Windows 系统目录
|
|-...
CGI 程序 - C:/php/php.exe -,CLI 程序 - c:\php\cli\php.exe -,和 SAPI 模块 - c:\php\sapi\*.dll - 依赖于主 dll c:\php\php4ts.dll。必须确认此 dll 可以被 PHP 找到。寻找此 dll 的顺序如下:
调用 php.exe 的目录。如果是用 SAPI 模块则为 webserver 调用 dll 的目录(例如 php4apache.dll)。
Windows 路径环境变量 PATH 中的任何目录。
最好是无论使用何种接口(CGI 或者 SAPI)都确保 php4ts.dll 可用,因此必须将此文件放到 Windows 路径中。最好的位置是 Windows 的 system 目录:
c:\windows\system for Windows 9x/ME
c:\winnt\system32 for Windows NT/2000 或者 c:\winnt40\system32 for Windows NT/2000 服务器版
c:\windows\system32 for Windows XP
如果计划在 c:\php\sapi 目录下使用 SAPI 模块而不想把 dll 文件拷贝到 Windows 的 system 目录,则可以将 php4ts.dll 拷贝到 sapi 目录下:c:\php\sapi。
下一步是设定有效的 PHP 配置文件,php.ini。压缩包中包括两个 ini 文件,php.ini-dist 和 php.ini-recommended。建议使用 php.ini-recommended,因为此文件对默认设置作了性能和安全上的优化。仔细阅读此文件中的说明并研究 ini 设置 一章来亲自人工设定每个项目。如果要达到最佳的安全效果,则最好用这个文件,尽管 PHP 在默认的 ini 文件下也工作的很好。将选择的 ini 文件拷贝到 PHP 能够找到的目录下并改名为 php.ini。PHP 默认在 Windows 目录下搜索 php.ini:
在 Windows 9x/ME/XP 下将选择的 ini 文件拷贝到 %WINDIR%,通常为 c:\windows。
在 Windows NT/2000 下将选择的 ini 文件拷贝到 %WINDIR% 或 %SYSTEMROOT% 下,通常为 c:\winnt 或 c:\winnt40 对应于服务器版本。
如果在 Windows NT,2000 或 XP 中使用了 NTFS,确保运行 webserver 的用户名对 php.ini 有读取的权限(例如使其对 Everyone 可读)。
以下步骤为可选项。
编辑 php.ini 文件。如果计划用 OmniHTTPd,不要进行下一步。将 doc_root 指向 webserver 的 document_root。例如:
doc_root = c:\inetpub // for IIS/PWS
doc_root = c:\apache\htdocs // for Apache
选择在 PHP 启动时需要加载的扩展库。如何设定以及那些已经内置请阅读 Windows 扩展一章。注意在新安装之后建议先确定 PHP 在没有任何扩展时运行正常然后再在 php.ini 中加载任何扩展库。
在 PWS 和 IIS 下,可以设定 browscap 配置其指向 c:\windows\system\inetsrv\browscap.ini(Windows 9x/Me)或 c:\winnt\system32\inetsrv\browscap.ini(Windows NT/2000)或 c:\windows\system32\inetsrv\browscap.ini(Windows XP)。
按照这些指示已经完成了 Windows 下设定 PHP 的基本步骤。下一步是选择 webserver 并使其运行 PHP。对于以下 webserver 有安装指南:
.. Windows 服务器系列,Personal Web server (PWS) 3 和 4 或更新版;Internet Information Server (IIS) 3 和 4 或更新版。
.. Apache 服务器。Apache 1.3.x 和 Apache 2.x。
.. Netscape/iPlanet 服务器。
.. OmniHTTPd 服务器。
.. Oreilly Website Pro 服务器。
.. Sambar 服务器。
.. Xitami 服务器。
编译源程序
开始之前,很值得回答一下这个问题:“为什么在 Windows 下编译这么难?”两个原因:
Windows 下还没有愿意免费共享代码的开发人员群体。直接结果就是没有足够的投资去建立支持这种开发方式的体系。大体上,尽量做到的可用资源都是从 UNIX 下的工具来的。不要奇怪这种传统不时会出现。
下面几乎所有的说明都是“看过就忘”的类型。所以坐稳当并且尽可能忠实地按照说明来做。
需求
要编译 PHP 你需要 Microsoft 开发环境。推荐使用 Microsoft Visuaul C 6.0。要释放下载的文件还需要一个解压缩工具(例如:Winzip)。如果你还没有解压缩的工具,可以从 InfoZip 免费下载一个。
在开始之前,你需要下载...
PHP 站点中 http://http://www.zjjv.com///extra/win32build.zip 的 win32 编译工具。
PHP 使用的 DNS 解析器的源代码:http://http://www.zjjv.com///extra/bindlib_w32.zip。用这个替代 win32build.zip 中的 resolv.lib。
如果你计划把 PHP 编译成 Apache 的静态模块那你还需要 Apache 源程序。
最后,你还需要 PHP 4 的源代码。你可以通过匿名 CVS 得到最新的开发版本,一个快照或者最新发行版本的源程序的打包文件。
放到一起
下载了所有的包后需要将他们解压缩到适当的位置。
建立一个工作目录作为解压缩后存放所有文件的地方,例如:c:\work。
在你的工作目录(c:\work)下新建一个目录 win32build 并将 win32build.zip 解压缩到其中。
在你的工作目录(c:\work)下新建一个目录 bindlib_w32 并将 bindlib_w32.zip 解压缩到其中。
将下载的 PHP 源程序解压缩到工作目录(c:\work)中。
经过这些步骤后你的目录结构应该如下:
--c:\work
| |
| --bindlib_w32
| | |
| | --arpa
| | |
| | --conf
| | |
| | --...
| |
| --php-4.x.x
| | |
| | --build
| | |
| | --...
| | |
| | --win32
| | |
| | --...
| |
| --win32build
| | |
| | --bin
| | |
| | --include
| | |
| | --lib
新建一个目录 c:\usr\local\lib。将 c:\work\win32build\bin 中的 bison.simple 拷贝到 c:\usr\local\lib中去。
注: Cygwin 用户应该忽略最后一步。正确安装的 Cygwin 环境已经提供了 bison.simple 和 bison.exe 文件。
配置 MVC
下一步是配置 MVC 来准备编译。运行 Microsoft Visual C ,在菜单中选择 Tools => Options。在对话框中,选择 directories 标签。依次将下拉框改为 Executables,Includes 和 Library files。将其修改为:
Executable files: c:\work\win32build\bin, Cygwin 用户:cygwin\bin
Include files: c:\work\win32build\include
Library files: c:\work\win32build\lib
Build resolv.lib
必须编译 resolv.lib 库。自己决定是需要调试信息(bindlib - Win32 Debug)还是不需要(bindlib - Win32 Release)。编译适当的配置:
图形界面用户,运行 VC ,选择 File => Open Workspace,找到 c:\work\bindlib_w32 目录并选择 bindlib.dsw 文件。 菜单并选择 bindlib。接着选择 Build => Set Active Configuration 菜单并选择需要的配置。最后选择 Build => Rebuild All。
命令行用户,确认你要么注册了 C 环境变量,要么运行了 vcvars.bat,然后运行下面任意一个:
msdev bindlib.dsp /MAKE "bindlib - Win32 Debug"
msdev bindlib.dsp /MAKE "bindlib - Win32 Release"
到这一步,你应该得到一个 resolv.lib 在你的 c:\work\bindlib_w32\Debug 或者 Release 目录下。拷贝此文件到 c:\work\win32build\lib 目录下并且覆盖同名的文件。
编译
对于初学者最好的上手方法是编译 CGI 版本。
图形界面用户,运行 VC ,选择 File => Open Workspace 菜单并选择 c:\work\php-4.x.x\win32\php4ts.dsw。接着选择 Build => Set Active Configuration 菜单并选择想要的配置,要么 php4ts - Win32 Debug_TS 或者是 php4ts - Win32 Release_TS。最后选择 Build => Rebuild All。
命令行用户,确认你要么注册了 C 环境变量,要么运行了 vcvars.bat,然后在 c:\work\php-4.x.x\win32 目录下运行下面任意一个命令:
msdev php4ts.dsp /MAKE "php4ts - Win32 Debug_TS"
msdev php4ts.dsp /MAKE "php4ts - Win32 Release_TS"
到这一步,你应该得到一个可用的 php.exe 在你的 c:\work\php-4.x.x.\Debug_TS 或者 Release_TS 目录下。
有可能通过编辑 main/config.win32.h 文件对编译做少量的定制。例如你可以改变默认的 php.ini 文件,内置的扩展库,以及扩展库的位置。
下一步你可能想要编译 CLI 版本,这是设计用于 PHP 的命令行方式。步骤和编译 CGI 版本相同,只除了要选择 php4ts_cli - Win32 Debug_TS 或者 php4ts_cli - Win32 Release_TS 工程文件。在成功编译之后你会在 Release_TS\cli\ 或者 Debug_TS\cli\ 目录下发现 php.exe 文件。
注: 如果你想使用 PEAR 或者舒适的命令行安装程序,就非要用 CLI-SAPI。有关 PEAR 和安装程序的更多信息见 PEAR 网站文档。
要编译 SAPI 模块(php4isapi.dll)来将 PHP 和 Microsoft IIS 集成起来,将激活的配置设为 php4isapi-whatever-config 并编译所需要的 dll。
Windows 扩展库的安装
在安装好 PHP 和 Webserver 之后,你可能想安装一些扩展库以增加功能。你可以通过编辑 php.ini 来选择哪些扩展库在 PHP 启动时被加载。你也可以在程序中用 dl() 函数动态加载。
PHP 4 扩展库的 DLL 文件开头都是 ';php_';(PHP 3 中是 ';php3_'; )。这避免了 PHP 扩展库和它们的支持库混淆。
注: 在PHP 4.3.1 版中 BCMath,Calendar,COM,Ctype,FTP,MySQL,ODBC,Overload,PCRE,Session,Tokenizer,WDDX,XML 和 Zlib 的支持都是内置的。不需要加载任何扩展库就可以使用这些函数。你可以通过自己的版本中的 README.txt 或者 install.txt 文件或者此表格来查看哪些模块是内置的。
PHP 搜索扩展库的默认位置是 c:\php4\extensions。要改变此设置来反映你对 PHP 的配置,编辑 php.ini 文件:
需要修改 extension_dir 设置将其指向扩展库所在的目录,或者放置 php_*.dll 文件的目录。不要忘记最后的斜线,例如:
extension_dir = c:/php/extensions/
通过取消 php.ini 文件中 extension=php_*.dll 行前面的注释来激活相应的扩展库。只要删除最前面的 ; 号就可以加载与其对应的扩展库。 例子 3-3. 在 PHP-Windows 中激活 Bzip2 扩展
// 将下面这一行从:
;extension=php_bz2.dll
// 改成
extension=php_bz2.dll
某些扩展库需要附加的 dll 文件才能工作。其中一部分可以在压缩包中找到,在 c:\php\dlls\ 目录下,但有一些,例如 Oracle(php_oci8.dll)需要的 dll 没有在压缩包中绑定。将绑定的 dll 从 c:\php\dlls 目录拷贝到 Windows 路径中,例如:
c:\windows\system for Windows 9x/Me
c:\winnt\system32 for Windows NT/2000
c:\windows\system32 for Windows XP
如果这些文件已经安装在你的系统中,仅在不能正常工作的情况下覆盖它们(在覆盖之前,最好先将其备份,或者移动到其它目录 - 以防出错)。
注: 如果你运行 PHP 的服务器模块版本,记得重启动 webserver 来使你对 php.ini 的改动生效。
下表说明了一些可用的扩展库和所需要的附加 dll 文件。
表格 3-1. PHP 扩展库
库名 说明 注意
php_bz2.dll bzip2 压缩函数库 无
php_calendar.dll Calendar 转换函数库 自 PHP 4.0.3 起内置
php_cpdf.dll ClibPDF 函数库 无
php_crack.dll Crack 函数库 无
php3_crypt.dll 加密函数库 未知
php_ctype.dll ctype 族函数库 自 PHP 4.3.0 起内置
php_curl.dll CURL,客户端 URL 函数库 需要 libeay32.dll,ssleay32.dll(已包含)
php_cybercash.dll Cybercash 支付函数库 PHP <= 4.2.0
php_db.dll DBM 函数库 不赞成使用。用 DBA 代替(php_dba.dll)
php_dba.dll DBA:数据库(dbm-style)抽象层函数库 无
php_dbase.dll dBase 函数库 无
php3_dbm.dll Berkeley DB2 库 未知
php_dbx.dll dbx 函数库
php_domxml.dll DOM XML 函数库 PHP <= 4.2.0 需要 libxml2.dll(已包含) PHP >= 4.3.0 需要 iconv.dll(已包含)
php_dotnet.dll .NET 函数库 PHP <= 4.1.1
php_exif.dll 从 JPEG 读取 EXIF 头信息 无
php_fbsql.dll FrontBase 函数库 PHP <= 4.2.0
php_fdf.dll FDF:表单数据格式化函数库. 需要 fdftk.dll(已包含)
php_filepro.dll filePro 函数库 只读访问
php_ftp.dll FTP 函数库 自 PHP 4.0.3 起内置
php_gd.dll GD 库图像处理函数库 在 PHP 4.3.2 中删除了。还要注意 GD1 中不能用真彩色函数,应该用 php_gd2.dll 替代。
php_gd2.dll GD2 库图像函数库 GD2
php_gettext.dll Gettext 函数库 PHP <= 4.2.0 需要 gnu_gettext.dll(已包含),PHP >= 4.2.3 需要 libintl-1.dll,iconv.dll(已包含)
php_hyperwave.dll HyperWave 函数库 无
php_iconv.dll ICONV 字符集转换 需要 iconv-1.3.dll(已包含),PHP >=4.2.1 需要 iconv.dll
php_ifx.dll Informix 函数库 需要 Informix 库文件
php_iisfunc.dll IIS 管理函数库 无
php_imap.dll IMAP POP3 和 NNTP 函数库 PHP 3:php3_imap4r1.dll
php_ingres.dll Ingres II 函数库 需要 Ingres II 库文件
php_interbase.dll InterBase 函数库 需要 gds32.dll(已包含)
php_java.dll Java 函数库 PHP <= 4.0.6 需要 jvm.dll(已包含)
php_ldap.dll LDAP 函数库 PHP <= 4.2.0 需要 libsasl.dll(已包含),PHP >= 4.3.0 需要 libeay32.dll,ssleay32.dll(已包含)
php_mbstring.dll 多字节字符串函数库 无
php_mcrypt.dll Mcrypt 加密函数库 需要 libmcrypt.dll
php_mhash.dll Mhash 函数库 PHP >= 4.3.0 需要 libmhash.dll(已包含)
php_mime_magic.dll Mimetype 函数库 需要 magic.mime(已包含)
php_ming.dll Ming 函数库 - Flash 支持 无
php_msql.dll mSQL 函数库 需要 msql.dll(已包含)
php3_msql1.dll mSQL 1 客户端 未知
php3_msql2.dll mSQL 2 客户端 未知
php_mssql.dll MSSQL 函数库 需要 ntwdblib.dll(已包含)
php3_mysql.dll MySQL 函数库 自 PHP 4 起内置
php3_nsmail.dll Netscape 邮件函数库 未知
php3_oci73.dll Oracle 函数库 未知
php_oci8.dll Oracle 8 函数库 需要 Oracle 8.1 以上客户端库文件
php_openssl.dll OpenSSL 函数库 需要 libeay32.dll(已包含)
php_oracle.dll Oracle 函数库 需要 Oracle 7 客户端库文件
php_overload.dll 对象重载函数库 自 PHP 4.3.0 内置
php_pdf.dll PDF 函数库 无
php_pgsql.dll PostgreSQL 函数库 无
php_printer.dll Printer 函数库 无
php_shmop.dll 共享内存函数库 无
php_snmp.dll SNMP 函数库 仅在 NT 下使用!
php_sockets.dll Socket 函数库 无
php_sybase_ct.dll Sybase 函数库 需要 Sybase 客户端库文件
php_tokenizer.dll Tokenizer 函数库 自 PHP 4.3.0 起内置
php_w32api.dll W32api 函数库 无
php_xmlrpc.dll XML-RPC 函数库 PHP >= 4.2.1 需要 iconv.dll(已包含)
php_xslt.dll XSLT 函数库 PHP <= 4.2.0 需要 sablot.dll,expat.dll(已包含)。PHP >= 4.2.1 需要 sablot.dll,expat.dll,iconv.dll(已包含)。
php_yaz.dll YAZ 函数库 无
php_zlib.dll ZLib 压缩函数库 自 PHP 4.3.0 起内置
Servers-CGI/命令行
默认为将 PHP 编译为 CGI 程序。这将建立一个命令行解释器,可用于 CGI 处理或非 web 相关的 PHP 脚本。如果你运行着一个 PHP 模块支持的 webserver,那通常为性能考虑应该使用模块方式。不过,CGI 版可以使 Apache 用户用不同的 user-id 运行不同的 PHP 页面。如果你要以 CGI 方式运行 PHP 请确保阅读过了安全一章。
自 PHP 4.3.0 起,PHP 有了一些重要的新增功能。又有了一个新的 SAPI 称为 CLI,和 CGI 程序同名。根据配置选项它安装在 {PREFIX}/bin/php,并在手册中PHP 的命令行模式一章中有详细说明。更多细节请阅读该章节。
测试
如果将 PHP 编译为 CGI 程序,可以通过键入 make test 来测试你的编译。测试一下编译永远是个好主意。这样就可以在你的平台上及早捕捉到 PHP 的问题而不是以后再艰难地解决。
基准测试
如果将 PHP 3 编译为 CGI 程序,可以通过键入 make bench 来进行一下性能的基准测试。注意如果默认打开了安全模式,则如果超过 30 秒的允许范围测试可能不能完成。这是因为 set_time_limit() 不能用于安全模式。用 max_execution_time 配置选项来为你自己的脚本控制此时间限制。make bench 会忽略配置文件。
注: make bench 仅能用于 PHP 3。
使用变量
某些服务器提供的环境变量没有定义在当前的 CGI/1.1 标准中。只有下列变量定义在其中,其它的都会被当作 ';vendor extensions';:AUTH_TYPE, CONTENT_LENGTH, CONTENT_TYPE, GATEWAY_INTERFACE, PATH_INFO, PATH_TRANSLATED, QUERY_STRING, REMOTE_ADDR, REMOTE_HOST, REMOTE_IDENT, REMOTE_USER, REQUEST_METHOD, SCRIPT_NAME, SERVER_NAME, SERVER_PORT, SERVER_PROTOCOL 和 SERVER_SOFTWARE。
Apache 服务器 1.x 版本
本节包括 Apache 下安装 PHP 的说明和提示,包括 Unix 和 Windows 版本。我们在另外的页面也有 Apache 2 的安装和说明。
Unix 下的 Apache 中安装 PHP 的详细资料
你可以根据完整配置选项列表在以下第 10 行中加入你选择的参数。这里把具体版本号略去了以确保本说明的不会出错。你需要把下面的 ';xxx'; 替换成你得到的文件中确切的数值。
例子 3-4. PHP 的 Apache 共享模块版本安装说明
1. gunzip apache_xxx.tar.gz
2. tar -xvf apache_xxx.tar
3. gunzip php-xxx.tar.gz
4. tar -xvf php-xxx.tar
5. cd apache_xxx
6. ./configure --prefix=/www --enable-module=so
7. make
8. make install
9. cd ../php-xxx
10. 现在,配置你的 PHP。这是你定制 PHP 的不同选项的时候,例如要
加载哪些扩展库。使用
./configure --help
来列出可用的选项。在下面的示例中我们只是简单地配置 Apache 1
和 MySQL 支持。你的 apxs 的路径可能和此示例中的不同。
./configure --with-mysql --with-apxs=/www/bin/apxs
11. make
12. make install
如果在安装之后你决定修改配置选项,那么只需重复以上最后三步。
只须重新启动 Apache 就可以使新模块生效。不需要重新编译 Apache。
注意除非特别指出,';make install'; 总是会安装 PEAR,各种 PHP
工具例如 phpize,安装 PHP CLI 以及其它。
13. 建立你的 php.ini 文件。
cp php.ini-dist /usr/local/lib/php.ini
你可以编辑 php.ini 来设置 PHP 选项。如果你想把 php.ini 放在
其它目录,在第 10 步加上以下选项:
--with-config-file-path=/path
如果你选择了 php.ini-recommended,确保阅读一下其中的变更说明,
因为这些会影响到 PHP 的行为。
14. 编辑你的 httpd.conf 来加载 PHP 模块。在 LoadModule 语句右边的
路径必须指向你系统中 PHP 模块所在的路径。上面的 make install
步骤可能已经添加了,但还是检查确认一下。
对 PHP 4:
LoadModule php4_module libexec/libphp4.so
对 PHP 5:
LoadModule php5_module libexec/libphp5.so
15. 在 httpd.conf 中加入 AddModule 部分,在 ClearModuleList 下面的
某处,加上这一句:
对 PHP 4:
AddModule mod_php4.c
对 PHP 5:
AddModule mod_php5.c
16. 告诉 Apache 将哪些后缀作为 PHP 解析。例如,让 Apache 把 .php
后缀的文件解析为 PHP。可以将任何后缀的文件解析为 PHP,只要在
以下语句中加入并用空格分开。我们添加一个 .phtml 来示例。
AddType application/x-httpd-php .php .phtml
为了将 .phps 作为 PHP 的源文件进行语法高亮显示,还可以加上:
AddType application/x-httpd-php-source .phps
17. 用你通常的过程启动 Apache。(你必须完全停止 Apache 再重新启动,
而不是用 HUP 或者 USR1 信号使 Apache 重新加载。)
根据你的 Unix 系统和 Apache 安装方法的不同,有很多方法停止和重启动 Apache。以下是一些不同的 Apache/Unix 下重启动 Apache 的典型命令。你需要把 /path/to/ 替换成你系统上的确切路径。
例子 3-5. 重启动 Apache 的示例命令
1. 在一些 Linux 和 SysV 的变种下:
/etc/rc.d/init.d/httpd restart
2. 使用 apachectl 脚本:
/path/to/apachectl stop
/path/to/apachectl start
3. httpdctl 和 httpsdctl(使用了 OpenSSL),类似 apachectl:
/path/to/httpsdctl stop
/path/to/httpsdctl start
4. 使用了 mod_ssl,或其他 SSL 服务器,你可能需要手工重启动:
/path/to/apachectl stop
/path/to/apachectl startssl
apachectl 和 http(s)dctl 程序所在的路径在不同系统中通常不一样。如果你的系统中有 locate 或者 whereis 或者 which 命令,那么可以帮你找到这些控制程序。
编译 PHP 和 Apache 的不同例子还有:
./configure --with-apxs --with-pgsql
这个配置将生成在 Apache 的 httpd.conf 文件中用 LoadModule 加载的 libphp4.so 共享库。而 PostgreSQL 支持将嵌入到 libphp4.so 库中。
./configure --with-apxs --with-pgsql=shared
这个配置将生成 Apache 的 libphp4.so 共享库,并且还生成 pgsql.so 共享库,可以在 php.ini 文件中用 extension 指令加载,或者在 PHP 脚本中用 dl() 函数明确地加载。
./configure --with-apache=/path/to/apache_source --with-pgsql
这个配置将生成 libmodphp4.a 库,mod_php4.c 和一些相关的文件并且拷贝到 Apache 源程序目录中的 src/modules/php4 目录下。然后用 --activate-module=src/modules/php4/libphp4.a 编译 Apache,Apache 编译系统会生成 libphp4.a 并且将其静态地连接到 httpd 程序中。PostgreSQL 支持也直接包括在这个 httpd 程序中了,因此最终结果是单一的一个包括了所有 Apache 和 PHP 支持的 httpd 可执行文件。
./configure --with-apache=/path/to/apache_source --with-pgsql=shared
这个配置和上面一样 - 除了没有在最后的 httpd 可执行文件中包括 PostgreSQL 的支持以及生成了一个 pgsql.so 共享库以外。该共享库可以在 php.ini 文件中或者用 dl() 函数加载。
当选择不同的方法编译 PHP 时,需要考虑每种方法的优势和缺点。用共享对象方式编译 PHP 意味着可以单独编译 Apache,并且不用在添加或修改了 PHP 的时候重新编译所有程序。用内置方法编译 PHP(静态方式)意味着 PHP 可以加载和运行得更快。更多信息见 Apache 的 DSO 支持页面。
注: Apache 默认的 httpd.conf 文件中目前包括类似如下的内容:
User nobody
Group "#-1"
除非你把它修改成“Group nogroup”或者其它类似的(“Group daemon”也很通用),PHP 将不能打开文件。
注: 确认在使用 --with-apxs=/path/to/apxs 时指向 Apache 安装后的目录中的 apxs。绝对不能用 Apache 源程序中的 apxs 而要用安装后的 apxs。
Windows 下在 Apache 1.3.x 中安装 PHP
有两种方式使 PHP 工作于 Windows 下的 Apache 1.3.x。一种是 CGI 方式(php.exe),另一种是使用 Apache 模块 DLL。不管哪种方式都需要停止 Apache,编辑 httpd.conf 来配置 Apache 以加入PHP支持。
值得在这里指出现在 Windows 下的 SAPI 模块更加稳定了,我们推荐使用模块方式,因为更加透明和安全。
尽管有几种不同方法在 Apache 下配置 PHP,但是对新手来说还是非常简单易用的。有关更多的 httpd.conf 配置指令请参考 Apache 文档。
如果你按照手工安装步骤一节中的说明把 PHP 解压缩到了 c:\php\ 目录下,那么需要加入以下三行到 Apache 配置文件中以 CGI 方式安装:
ScriptAlias /php/ "c:/php/"
AddType application/x-httpd-php .php .phtml
Action application/x-httpd-php "/php/php.exe"
注意上面的第二行在原来的 httpd.conf 中就有的,不过被注释了。还有记住用你自己放置 PHP 的路径替换 c:/php/。
警告
在 CGI 方式下,你的服务器可能会受到几种攻击的影响。阅读 CGI 安全一节学习如何防止攻击。
如果你想在 Apache 中用模块方式使用 PHP,确认把 php4ts.dll 拷贝到 windows/system(Windows 9x/Me)或者 winnt/system32(Windows NT/2000)或者 windows/system32(Windows XP)目录下,覆盖原来的文件。然后在 Apache 配置文件 httpd.conf 中加入以下两行:
用自己喜爱的编辑器打开 httpd.conf,找到 LoadModule 指令的部分,在其列表的最后部分加上如下一行,对 PHP 4:LoadModule php4_module c:/php/sapi/php4apache.dll,对 PHP 5:LoadModule php5_module "c:/php/sapi/php5apache.dll"。
你可能发现在用 Windows Installer 安装了 Apache 之后需要为用 AddModule 指令定义 mod_php4.c。尤其是在定义了 ClearModuleList 指令时格外重要,向下滚动几行可以找到该指令。你将会看到 AddModule 项目的列表,在列表的最后加上这一行:AddModule mod_php4.c,对于 PHP 5 则为 AddModule mod_php5.c。
搜索类似 # AddType allows you to tweak mime.types 的短语,你会找到一些 AddType 的项目,并且在列表的最后有这一行: AddType application/x-httpd-php .php。你可以在这里选择任何想用 PHP 解析的后缀。.php 只是所建议的一个。甚至可以包括 .html,也可以加上 .php3 来向下兼容。
修改了配置文件之后记住重新启动 Apache,例如如果你的 Apache 是作为 Windows 的服务安装的,NET STOP APACHE 后面接上 NET START APACHE。或者用你通常使用的快捷方式。
有两种方式使用源程序语法彩色显示特色,但是取决于你的安装方法。如果你配置了 Apache 的 SAPI 模块方式使用 PHP,那么在 httpd.conf 中(和插入 AddType application/x-httpd-php .php 是同一个位置)加入下面一行就可以使用本特色:AddType application/x-httpd-php-source .phps。
如果你用 CGI 方式使用 PHP,那你需要用 show_source() 函数。建立一个 PHP 文件,加入以下代码:<?php show_source ("original_php_script.php"); ?>。用你想要显示源代码的文件名替换掉 original_php_script.php。
注: 在 Windows-Apache 组合中,所有路径中的反斜线例如 "c:\directory\file.ext" 都必须转换成斜线,如 "c:/directory/file.ext"。
Apache 服务器 2.x 版本
本部分介绍了 PHP 在 Apache 2.0 服务器上安装的提示和注意事项。本文所述的内容同时适用于 Unix 和 Windows 版本的 PHP。
警告
在企业级应用中无论是 Unix 还是 Windows 都不要使用 Apache 2.0 和 PHP 的组合。
推荐您查看 Apache 文档,了解一下 Apache 2.0 服务器。
PHP 和 Apache 2.0 的兼容性
如下版本的 PHP 可以正常工作在最新版本的 Apache 2.0 中:
PHP 4.3.0 或更高版本,下载地址:http://http://www.zjjv.com///downloads.php。
最新的稳定开发版本。在 http://http://www.zjjv.com///php4-latest.tar.gz 下载源代码或者在 http://http://www.zjjv.com///win32/php4-win32-latest.zip 下载为 Windows 编译好的二进制文件。
预发布版本可以在 http://http://www.zjjv.com/// 下载。
您也可以通过对匿名 CVS 的访问随时获得最新的 PHP。
这些版本的 PHP 能够与 Apache 2.0.40 或更高版本兼容。
注: Apache 2.0 SAPI 从 PHP 4.2.0 开始支持。PHP 4.2.3 可以工作在 Apache 2.0.39 下,不要尝试使用该版本的 PHP 在其它任何版本的 Apache 2 下工作。我们建议的配置是将 PHP 4.3.0 安装在最新版本的 Apache 2 下。
所有提到的 PHP 版本仍然能够在 Apache 1.3.x 下工作。
Linux 下的 PHP 和 Apache 2.0
下载最新版本的 Apache 2.0,并且根据上文选择合适版本的 PHP 下载。本向导仅包含最基础的内容,只能让 Apache 2.0 和 PHP 能够正常工作。更多信息请阅读 Apache 文档。这里省略所有的版本号,以保证本文的正确性。您需要将本文的“NN”替换为相应的版本号。
例子 3-6. 安装说明(Apache 2 共享模块版本)
1. gzip -d httpd-2_0_NN.tar.gz
2. tar xvf httpd-2_0_NN.tar
3. gunzip php-NN.tar.gz
4. tar -xvf php-NN.tar
5. cd httpd-2_0_NN
6. ./configure --enable-so
7. make
8. make install
现在您已经将 Apache 2.0.NN 安装在 /usr/local/apache。本安装支持可装载模块
和标准的 MPM prefork。之后,可以使用如下命令启动 Apache 服务器:
/usr/local/apache2/bin/apachectl start
如果成功,您可以停止 Apache 服务器并继续安装 PHP:
/usr/local/apache2/bin/apachectl stop.
9. cd ../php4-NN
10. 现在我们需要配置 PHP。在这里您可以用各种各样的参数来自定义PHP,例如启动哪
些扩展功能包的支持等。用 ./configure --help 命令可以列出当前可用的所有参
数。在我们的例子中,我们将给出一个在有 MySQL 支持的 Apache 2 上进行配置的
范例。您本地的 apxs 的路径可能会不同,事实上,在您的系统中,它可能被命名为
apxs2。
./configure --with-apxs2=/usr/local/apache2/bin/apxs
11. make
12. make install
如果您决定在安装后改变配置选项,您只需重复最后的三步,然后需要重新启动
Apache 使新模块生效。无需重新编译。
请注意,除非明确有提示,否则 ';make install'; 命令将安装 PEAR、各种 PHP 工具
诸如 phpize,安装 PHP CLI 等等。
13. 配置 php.ini
cp php.ini-dist /usr/local/lib/php.ini
您可以编辑 php.ini 文件以修改 PHP 的选项。如果您想要把此文件放到另外的位置,
您需要在步骤 10 添加 --with-config-file-path=/path 选项。
如果您选择 php.ini -recommended,请务必阅读其中的变更的列表,它们将影响
PHP 的执行。
14. 编辑 httpd.conf 文件以调用 PHP 模块。LoadMolude 表达式右边的路径必须指向您
系统中的 PHP。以上的 make install 命令可能已经帮您完成了这些,但务必要检查。
对于 PHP 4:
LoadModule php4_module modules/libphp4.so
对于 PHP 5:
LoadModule php5_module modules/libphp5.so
15. 告知 Apache 将特定的扩展名解析成 PHP,例如,我们让 Apache 将扩展名 .php
解析成 PHP。您可以将任何扩展名指定为 PHP,只需添加它们,每一个用空格分隔。
例如,我们要添加 .phtml:
AddType application/x-httpd-php .php .phtml
通常,我们还将 .phps 扩展名设置成显示高亮的 PHP 源文件,可以这样来完成:
AddType application/x-httpd-php-source .phps
16. 启动您的 Apache 服务器:
/usr/local/apache2/bin/apachectl start
按照上面的步骤您便可以使 Apache 2.0 将 PHP 作为 SAPI 模块了。当然 Apache 和 PHP 都还有很多配置选项,您可以在相应的源代码目录中使用 ./configure --help 获得更多信息。假如您要编译一个多线程版本的 Apache 2.0,您必须覆盖标准的 MPM-Module prefork,或者 worker 或者 perchild。要这样,您需要在上面的第 6 步使用 --with-mpm=worker 或者 --with-mpm=perchild 选项。之前您需要了解您正在做什么。更多信息请参考 Apache 文档中关于 MPM-Modules 的部分。
注: 要编译多线程版本的 Apache,您的系统必须支持多线程。这也意味着需要将 PHP 编译为正处在试验阶段的 Zend Thread Safety (ZTS)。因此并不是所有的扩展都可以使用了。推荐编译 Apache 使用标准的 prefork MPM-Module。
Windows 下的 PHP 和 Apache 2.0
您可以阅读 Apache 2.0 Windows 特别注意事项。
警告
Apache 2.0 被设计为运行在 Windows NT 4.0、Windows 2000 或 Windows XP。现在并不支持 Windows 9x。目前不推荐 Apache 2.0 运行在上述平台。
下载最新版本的 Apache 2.0 和合适的 PHP 版本。 首先请查看手动安装步骤,然后回来继续安装 PHP 和 Apache。
有两种方法使得 PHP 工作在 Windows 下的 Apache。一是使用 CGI 二进制文件,另一是使用 Apache 模块 DLL。无聊那种方法,您首先必须停止 Apache 服务器,然后编辑 httpd.conf,以配置 Apache 和 PHP 协同工作。
您需要将如下指令插入到 Apache 的 httpd.conf 配置文件中,以设置 CGI 二进制文件: 例子 3-7. PHP 以 CGI 方式安装到 Apache 2.0
ScriptAlias /php/ "c:/php/"
AddType application/x-httpd-php .php
Action application/x-httpd-php "/php/php.exe"
如果您想把 PHP 作为 Apache 2.0 的模块,请务必移动 php4ts.dll 到 winnt/system32(Windows NT/2000)或 windows/system32(Windows XP),覆盖原有文件(如果有的话),对于 PHP 5,这个文件是 php5ts.dll。然后您需要插入如下两行到 httpd.conf 中,以使您的 PHP 作为 Apache 的 PHP-Module 安装: 例子 3-8. PHP 以模块方式安装到 Apache 2.0
; For PHP 4 do something like this:
LoadModule php4_module "c:/php/sapi/php4apache2.dll"
AddType application/x-httpd-php .php
; For PHP 5 do something like this:
LoadModule php5_module "c:/php/sapi/php5apache2.dll"
AddType application/x-httpd-php .php
注: 记得替换 c:/php/ 为您计算机上 PHP 的实际路径。请注意在您的 LoadMolude 设置选项中使用 php4apache2.dll 或者 php5apache2.dll,而非 php4apache.dll,后者是为 Apache 1.3.x 设计的。
警告
不要混用不同 PHP 版本的 DLL 文件。您只能使用您下载的一个版本 PHP 中的 DLL 和扩展。
Caudium 服务器
PHP 4 可以被编译为 Caudium webserver 服务器的一个 Pike 模块。注意 PHP 3 并不可以这么做。请参考下面的安装说明以将 PHP 4 安装到 Caudium 服务器中。
例子 3-9. Caudium 安装说明
1. 在安装 PHP 4 之前请确认您已经正确安装了 Caudium 服务器。
要想使 PHP 4 正确的工作,您还需要 Pike 7.0.268 或更高版本。
为了方便起见,我们假定 Caudium 安装在 /opt/caudium/server/ 中。
2. 进入目录 php-x.y.z (x.y.z 是 PHP 的版本号)。
3. ./configure --with-caudium=/opt/caudium/server
4. make
5. make install
6. 如果 Caudium 正在运行请重新启动它。
7. 登录图形配置界面,进入需要 PHP 4 支持的虚拟服务器。
8. 点击 Add Module 之后点击 locate,然后添加 PHP 4 脚本支持模块。
9. 如果出现 ';PHP 4 interpreter isn';t available'; 的错误提示,
请重新启动您的 Web 服务器。如果还是不行,请检查
/opt/caudium/logs/debug/default.1 中是否有与
<filename>PHP4.so</filename> 文件相关的错误。您也要查看
<filename>caudium/server/lib/[pike-version>/PHP4.so</filename>
这个文件是否存在。
10. 如果需要,请配置 PHP 脚本支持模块。
您当然可以将各种 PHP 4 的扩展模块编译到 Caudium 服务器中。请参阅 configure 选项完全列表 以获得完整的信息。
注: 当编译 PHP 4 的 MySQL 的支持时,您必须确认使用了正常的 MySQL 客户端代码。否则如果您的 Pike 已经支持 MySQL,就会产生冲突。您应该在编译的时候使用 --with-mysql 选项指定 MySQL 的安装目录。
fhttpd 服务器
要将 PHP 作为 fhttpd 的模块来编译,在提示“Build as an fhttpd module?”时,回答“yes”(用 --with-fhttpd=DIR 来配置)并且指定 fhttpd 源代码的基本目录。默认的目录是 /usr/local/src/fhttpd。如果你正在使用 fhttpd 服务器,将 PHP 编译成模块方式将提供更好的性能,更多的可控性以及远程执行能力。
注: PHP 4.3.0 以后的版本已经不再提供对 fhttpd 的支持。
IIS/PWS 服务器
本节包括 IIS(Microsoft Internet Information Server)的说明和提示。以及 PWS/IIS 3,PWS 4 以及更新版本 和 IIS 4 以及更新版本 上 PHP 的安装说明。
CGI 用户请注意: 阅读 cgi.force_redirect 的常见问题中的重要细节。该指令必须被设为 0。
Windows 和 PWS/IIS 3
推荐使用PHP发行包中包含的注册表文件(pws-php4cgi.reg)来配置服务器。你可能需要编辑这个文件,确认扩展库和 PHP 的安装目录符合你的设置。或者你可以按照以下步骤手工进行。
警告
以下步骤涉及到直接修改 Windows 注册表,如果出错会使你的系统不稳定。我们强烈推荐你先备份注册表文件。PHP 开发小组将不对你损坏了注册表负责。
运行 Regedit。
找到:HKEY_LOCAL_MACHINE /System /CurrentControlSet /Services /W3Svc /Parameters /ScriptMap。
在编辑菜单下选择:新建->字符串值(New->String Value)。
输入你想 PHP 脚本使用的文件后缀,例如 .php。
双击这个新的字符串值,并且在数据栏中输入 php.exe 的路径,例如:c:\php\php.exe。
如果你希望其他后缀(例如 .php3)也和 PHP 关联,重复以上步骤。
以下步骤并不影响 Web 服务器安装,并且仅适用于你的 PHP 脚本运行于命令行方式下(例如运行 c:\myscripts\test.php)或者在资源管理器中双击 PHP 文件。你可能更希望双击 PHP 文件时用文本编辑器打开,那么可以跳过这一步。
找到:HKEY_CLASSES_ROOT。
在编辑菜单中选择:新建->主键(New->Key)。
给该主键命名为你前一节中设置的后缀,例如:.php。
选中该主键,在右边一栏中双击“默认”("Default")并输入 phpfile。
对于你前一节中设置的其它后缀,重复以上步骤。
现在再在 HKEY_CLASSES_ROOT 下面新建一个主键(New->Key),命名为 phpfile。
选中主键 phpfile,在右边一栏中双击“默认”("Default")并输入 PHP Script。
右键点击主键 phpfile,选择新建->主键(New->Key),命名为 Shell。
右键点击主键 Shell,选择新建->主键(New->Key),命名为 open。
右键点击主键 open,选择新建->主键(New->Key),命名为 command。
选中主键 command,在右边一栏中双击“默认”("Default")并且输入 php.exe 的路径,例如 c:\php\php.exe -q %1(别忘了 %1)。
退出 Regedit。
如果使用 PWS for Windows,重新启动计算机使注册表生效。
PWS和IIS 3 的用户现在就拥有一个完全操作正常的 PHP 系统了。IIS 3 用户还可以使用由 Steven Genusa 提供的一个极好的工具来配置脚本映射。
Windows 和 PWS 4 或更新版本
在 PWS 4 或者更新版本中安装 PHP 有两个选择。一种是 CGI 方式,还有一种是使用 ISAPI 模块的 DLL。
如果你选择 CGI 方式,按照以下步骤:
编辑 PHP 发行包中 SAPI 目录下的 pws-php4cgi.reg文件,在里面输入正确的 php.exe 的路径。反斜线必须双写,例如: [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w3svc\parameters\Script Map> ".php"="c:\\php\\php.exe",然后双击此文件将其合并(Merge)到注册表中。
在个人 Web 管理器中,右键点击你希望加入 PHP 支持的目录,选择“属性”(Properties),选中“执行“(Execute)多选框,并确认。
如果你选择 ISAPI 模块,按照以下步骤:
编辑 PHP 发行包中 SAPI 目录下的 pws-php4isapi.reg 文件,在里面输入正确的 php4isapi.dll 的路径。反斜线必须双写,例如: [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w3svc\parameters\Script Map> ".php"="c:\\php\\sapi\\php4isapi.dll",然后双击此文件将其合并(Merge)到注册表中。
在个人 Web 管理器中,右键点击你希望加入 PHP 支持的目录,选择“属性”(Properties),选中“执行”(Execute)多选框,并确认。
无论哪种方式都需要重新启动计算机以使改变设置生效。
Windows NT/2000/XP 和 IIS 4 或更新版本
要在 NT/2000/XP 中的 IIS 4 或更新版本中安装 PHP,按照以下说明进行。有两种选择安装 PHP,CGI 方式(php.exe)或者 ISAPI 模块方式。
无论哪种方式,都需要打开管理中心(Microsoft Management Console,NT 4.0 Option Pack 中的 ';Internet Services Manager';,或者 2000/XP 中的控制面板 -> 管理工具(Control Panel->Administrative Tools))。用右键点击你的 Web Server 节点(多半是 ';Default Web Site';),选择“属性”(Properties)。
如果你选择 CGI 方式,按照以下步骤:
在“主目录”(Home Directory),“虚拟目录”(Virtual Directory)或者“目录”(Directory)标签栏中,点击“配置”(Configuration)按钮,然后选择“应用程序映射”(App Mappings)标签栏。
点击“添加”(Add)按钮,在“可执行文件”(Executable)框中输入:c:\php\php.exe(假定你将 PHP 解压缩到了 c:\php\)。
在“文件后缀”(Extension)框中输入你要使用的 PHP 后缀。';Method exclusions'; 空着,选中“脚本引擎”(Script engine)。你也可以选中“检查文件是否存在”(check that file exists)- 略微损失一点性能,IIS 会先检查脚本文件是否存在。这样会输出 404 的错误信息而不是 PHP 没有输出任何数据的 cgi 错误。
对于其它你想使用的 PHP 后缀重复以上两个步骤。通常使用的有 .php 和 .phtml,对于一些老的程序还需要 .php3。
设置适当的安全级别(在Internet Service Manager 中完成)。如果你使用了 NTFS,还需要在 php.exe 所在的目录中给 I_USR_ 用户加上“执行”的权限。
如果你选择ISAPI模块,按照以下步骤:
如果你不用 PHP 进行 HTTP 认证的话,你可以(也应该)跳过这一步。在 ISAPI Filters 中,加入一个新的 ISAPI filter。用 PHP 作为过滤器的名字,并且提供 php4isapi.dll 所在的路径。
在“主目录”(Home Directory)中点击“配置”(Configuration)按钮,在应用程序映射(Application Mappings)中添加一个新的条目。用 php4isapi.dll 的路径作为可执行文件(Executable),用 .php 作为文件后缀,选中“脚本引擎”(Script Engine),而 ';Method exclusions'; 为空。
完全停止 IIS 服务(NET STOP iisadmin)
重新启动IIS服务(NET START w3svc)
OmniHTTPd 服务器
本章节的内容和提示仅限于将 PHP 安装到 OmniHTTPd 系统上。
Windows 系统下 OmniHTTPd 2.0b1 以及更高的版本
你需要完成如下的步骤用以让 PHP 和 OmniHTTPd 一起工作。这里将要进行是 CGI 可执行方式配置,尽管 OmniHTTPd 也对 SAPI 提供了支持,但是一些测试显示 PHP 作为 ISAPI 模块方式与 OmniHTTPd 一起运行时并不稳定。
对 CGI 用户的重要提示: 请阅读常见问题:cgi.force_redirect 以得到更详细的信息。本指令需要被设为 0。
安装OmniHTTPd 服务器。
在系统托盘上用鼠标右键点击 OmniHTTPd 的图标并且选择 Properties
点击 Web Server Global Settings
在 ';External'; 标签上输入: virtual = .php | actual = c:\path-to-php-dir\php.exe,再点击 Add 按钮。
在 Mime标签上输入: virtual = wwwserver/stdcgi | actual = .php,再点击 Add 按钮。
点击 OK
重复 2 - 6 步以关联你希望使用的 PHP 的扩展名。
注: 一些 OmniHTTPd 软件包内建了对 PHP 的支持。建议你在安装的时候选择用户自定义安装,并且取消安装 PHP 组件,我们建议你使用最新版本的 PHP 二进制包。一些 OmniHTTPd 服务器内建的 PHP 仍是 PHP 4 的测试版,你应当不选择使用内建的 PHP 支持,而自己安装更新的版本。如果服务器已经运行在你的服务器上,使用 "Replace" 按钮,并且重复第 4 和第 5 步。
Sambar 服务器
本节包含了 Windows 下面的 Sambar 服务器的说明和提示。
Sambar Windows
本列表说明了怎样在 Windows 下的 Sambar 服务器中设置 ISAPI 模块。
在 Sambar 的安装目录中找到文件 mappings.ini (在 config 目录下)。
打开 mappings.ini 并在 [ISAPI> 下面加上以下一行:
*.php = c:\php\php4isapi.dll
(本行假定 PHP 安装在 c:\php 中。)
重新启动 Sambar 服务器以使改动生效。
Xitami 服务器
本节包含了Xitami服务器下安装 PHP 的说明和提示。
Windows 系统下的 Xitami 服务器
下面将描述如何使用 PHP CGI 二进制模式与 在 Windows 系统下的 Xitami 服务器一起工作。
对 CGI 用户的重要提示: 请阅读常见问题:cgi.force_redirect 以得到更详细的信息。本指令需要被设为 0。
请确认你的 web 服务器已经运行并且使用你的浏览器指向你的管理控制台(通常情况下是:http://127.0.0.1/admin),并且点 Configuration。
进入 Filters 配置。在 File extensions 栏目添加对你期望的 PHP 扩展的解析(例如 .php)。
在命令行或脚本中加入可执行的PHP路径及名字,例如:c:\php\php.exe。
点击“Save”图标。
重新启动服务器以便使改变生效。
章 4. 运行时配置
目录
配置文件
怎样改变配置选项
配置文件
当 PHP 启动时会读取配置文件(在 PHP 3 中称为 php3.ini,在 PHP 4 中简化为 php.ini)。对于服务器模块版本的 PHP 仅在 web 服务器启动时读取一次。对于 CGI 和 CLI 版本,每次调用都会读取。
php.ini 的默认位置是在编译时决定的(见常见问题 - 安装),但是对于 CGI 和 CLI 版本可以通过命令行开关 -c 来改变,见 PHP 的命令行方式一章。也可以用环境变量 PHPRC 来设定寻找 php.ini 文件的其它路径。
注: Apache 服务器在启动时将目录更改到根目录,致使 PHP 会尝试在根目录下读取 php.ini,如果存在的话。
The php.ini directives handled by extensions are documented respectively on the pages of the extensions themselfs. The list of the core directives is available in the appendix. Probably not all the PHP directives are documented in the manual though. For a completel list of directives available in your PHP version, please read your well commented php.ini file. Alternatively, you may find the the latest php.ini from CVS helpful too.
例子 4-1. php.ini 例子
; any text on a line after an unquoted semicolon (;) is ignored
[php> ; section markers (text within square brackets) are also ignored
; Boolean values can be set to either:
; true, on, yes
; or false, off, no, none
register_globals = off
track_errors = yes
; you can enclose strings in double-quotes
include_path = ".:/usr/local/lib/php"
; backslashes are treated the same as any other character
include_path = ".;c:\php\lib"
怎样改变配置选项
以 Apache 模块方式运行 PHP
当以 Apache 的模块方式运行 PHP 时,也可以通过 Apache 的配置文件(例如 httpd.conf)和 .htaccess 文件中的指令来修改 PHP 的配置选项。这样做需要“AllowOverride Options”或“AllowOverride All”权限。
在 PHP 4 和 PHP 5 中,有几个 Apache 指令可以允许在 Apache 的配置文件中修改 PHP 的配置。要得到哪些指令分别属于 PHP_INI_ALL,PHP_INI_PERDIR 或 PHP_INI_SYSTEM 的列表,请看 ini_set() 文档中的表格。
注: 在 PHP 3 中,也有和 php3.ini 中选项相对应的 Apache 指令,只不过加上前缀“php3_”。
php_value name value
设定指定指令的值。仅能用于 PHP_INI_ALL 和 PHP_INI_PERDIR 类型的指令。要清除上一个设定的值,将值设为 none。
注: 不要用 php_value 来设定布尔值。应该用 php_flag(见下面)来替代。
php_flag name on|off
用于设定布尔值类型的配置指令。仅能用于 PHP_INI_ALL 和 PHP_INI_PERDIR 类型的指令。
php_admin_value name value
设定指定指令的值。不能用于 .htaccess 文件中。任何在 php_admin_value 中设定的值不能被 .htaccess 或者 virtualhost 中的指令覆盖。要清除上一个设定的值,将值设为 none。
php_admin_flag name on|off
用于设定布尔值类型的配置指令。不能用于 .htaccess 文件中。任何在 php_admin_flag 中设定的值不能被 .htaccess 或者 virtualhost 中的指令覆盖。
例子 4-2. Apache 配置例子
<IfModule mod_php5.c>
php_value include_path ".:/usr/local/lib/php"
php_admin_flag safe_mode on
</IfModule>
<IfModule mod_php4.c>
php_value include_path ".:/usr/local/lib/php"
php_admin_flag safe_mode on
</IfModule>
<IfModule mod_php3.c>
php3_include_path ".:/usr/local/lib/php"
php3_safe_mode on
</IfModule>
注意
PHP 常量不存在于 PHP 之外。例如,在 httpd.conf 中可以使用 PHP 常量如 E_ALL 或者 E_NOTICE 来设定 error_reporting 指令的值,但它们其实没有意义并被认为是 0。应该使用相应的位掩码。这些常量可以在 php.ini 中使用。
通过修改 Windows 注册表来改变 PHP 配置
在 Windows 下运行 PHP 时,可以通过 Windows 注册表来修改每个目录的配置选项。配置的值存放于注册表的 HKLM\SOFTWARE\PHP\Per Directory Values 下面根据每个路径起名的子键中。例如对于路径 c:\inetpub\wwwroot 的配置值存放于 HKLM\SOFTWARE\PHP\Per Directory Values\c\inetpub\wwwroot。对于目录的设置将会在任何在此目录及其子目录下运行的脚本激活。对应键名应该和 PHP 配置选项相同并且具有字符串值。值中的 PHP 常量不会被解析。
其它 PHP 接口
Regardless of how you run PHP, you can change certain values at runtime of your scripts through ini_set(). See the documentation on the ini_set() page for more information.
If you are interested in a complete list of configuration settings on your system with their current values, you can execute the phpinfo() function, and review the resulting page. You can also access the values of individual configuration directives at runtime using ini_get() or get_cfg_var().
II. 语言参考
目录
5. 基本语法
6. 类型
7. 变量
8. 常量
9. 表达式
10. 运算符
11. 流程控制
12. 函数
13. 类与对象
14. Classes and Objects (PHP 5)
15. 引用的解释
章 5. 基本语法
目录
从 HTML 中分离
指令分隔符
注释
从 HTML 中分离
PHP 的脚本由文件中一对特殊的标记所引起的内容,当解释器分析一个文件时,所有特殊标记外的普通文件,解释器不对其做任何处理,而特殊标记内文件将作为 PHP 代码被解释器分析执行。该运行机制将允许您在 HTML 中嵌入 PHP 代码:PHP 标记外的内容将被完全独立开,不做任何处理,而内部的将作为 PHP 代码解析。
用来标记 PHP 代码块的标记共有四套,其中只有两套总是有效(<?php. . .?> 和 <script language="php">. . .</script>);另外两套可以在 php.ini 配置文件中开启或者关闭。虽然短格式的标记和 ASP 风格的标记可能比较省力,但是某些情况下您可能必须要使用长格式的标记。比如,您打算在 XML 或者 XHTML 中嵌入 PHP 代码,您将需要使用 <?php. . .?> 形式的标记以适应 XML 的标准。
PHP 支持的标记为:
例子 5-1. 从 HTML 中分离的方式
1. <?php echo("if you want to serve XHTML or XML documents, do like this\n"); ?>
2. <? echo ("this is the simplest, an SGML processing instruction\n"); ?>
<?= expression ?> This is a shortcut for "<? echo expression ?>"
3. <script language="php">
echo ("some editors (like FrontPage) don';t
like processing instructions");
</script>
4. <% echo ("You may optionally use ASP-style tags"); %>
<%= $variable; # This is a shortcut for "<% echo . . ." %>
优先选用的方式为第一种方式 <?php. . .?>,因为它允许您在 XML 结构,如 XHTML 的代码中使用 PHP。
第二种方式并非总是可用的。只有当您在 php.ini 配置文件中激活 short_open_tag 选项,才是可用的。您也可以通过使用 short_tags() 函数(仅用于 PHP 3),或者使用 --enable-short-tags 选项 configure PHP 来激活短格式标记。在 php.ini-dist 配置文件中,默认是开启短格式标记的,但是建议您不要使用该标记。
在 PHP 配置文件中开启选项 asp_tags 将激活第四种方式。
注: ASP 风格的标记添加于 PHP 3.0.4
注: 当开发大型应用程序或者用于分发的函数库,或者在不受您控制的 PHP 服务器上面开发程序时,请不要使用短格式的标记,因为目标服务器可能并不支持短格式的标记。为了便于移植,请保证用于再分发的代码中不使用短格式的标记。
PHP 代码块结束标记奖自动包含最近的一个结尾的新行(如果存在的话)。而且,结束标记自动隐含一个分号; 您不需要为 PHP 代码块的最后行追加一个分号。
PHP 允许您使用如下的结构: 例子 5-2. 更高级的脱离
<?php
if ($expression) {
?>
<strong>This is true.</strong>
<?php
} else {
?>
<strong>This is false.</strong>
<?php
}
?>
PHP 将直接输出结束标记和下一个开始标记中的任何非 PHP 代码。当需要输出大量的文本时,退出 PHP 解析模式将比使用 echo() 或者 print() 或者此类的函数打印所有文本要更加的有效。
指令分隔符
指令分隔方式与 C 或者 Perl 类似 -- 每个语句由分号格开。
结束标记(?>)同样隐含语句的结束,因此下面的代码是等价的:
<?php
echo "This is a test";
?>
<?php echo "This is a test" ?>
注释
PHP 支持 ';C';,';C '; 和 Unix Shell 风格的注释。例如:
<?php
echo "This is a test"; // This is a one-line c style comment
/* This is a multi line comment
yet another line of comment */
echo "This is yet another test";
echo "One Final Test"; # This is shell-style style comment
?>
“单行”注释仅仅注释到行末或者当前的 PHP 代码块,视乎哪个首先出现。
<h1>This is an <?php # echo "simple";?> example.</h1>
<p>The header above will say ';This is an example';.
小心不要嵌套 ';C'; 风格的注释,当注释大量代码时,可能犯该错误。
<?php
/*
echo "This is a test"; /* This comment will cause a problem */
*/
?>
“单行”注释仅仅注释到行末或者当前的 PHP 代码块,视乎哪个首先出现。这意味着 // ?> 后面的 HTML 代码将被打印出来:?> 跳出了 PHP 模式并且返回 HTML 模式,而且 // 注释符并不会影响到模式的转换。
章 6. 类型
目录
介绍
布尔型
整型
浮点型
字符串
数组
对象
资源
NULL
本文档中使用的伪类型
类型戏法
介绍
PHP 支持八种原始类型。
四种标量类型:
布尔型(boolean)
整型(integer)
浮点型(float)(浮点数,也作“double”)
字符串(string)
两种复合类型:
数组(array)
对象(object)
最后是两种特殊类型:
资源(resource)
NULL
为了确保代码的易读性,本手册还介绍了一些伪类型:
混和(mixed)
数字(number)
回馈(callback)
您可能还会读到一些关于“双精度(double)”类型的参考。实际上 double 和 float 是相同的,由于一些历史的原因,这两个名称同时存在。
变量的类型通常不是由程序员设定的,确切地说,是由 PHP 根据该变量使用的上下文在运行时决定的。
注: 如果你想查看某个表达式的值和类型,用 var_dump()。
注: 如果你只是想得到一个易读懂的类型的表达方式用于调试,用 gettype()。要查看某个类型,不要用 gettype(),而用 is_type 函数。以下是一些范例:
<?php
$bool = TRUE; // a boolean
$str = "foo"; // a string
$int = 12; // an integer
echo gettype($bool); // prints out "boolean"
echo gettype($str); // prints out "string"
// If this is an integer, increment it by four
if (is_int($int)) {
$int = 4;
}
// If $bool is a string, print it out
// (does not print out anything)
if (is_string($bool)) {
echo "String: $bool";
}
?>
如果你要将一个变量强制转换为某类型,可以对其使用强制转换或者 settype() 函数。
注意变量根据其当时的类型在特定场合下会表现出不同的值。更多信息见类型戏法。此外,你还可以参考 PHP 类型比较表看不同类型相互比较的例子。
布尔型
这是最简单的类型。boolean 表达了真值,可以为 TRUE 或 FALSE。
注: 布尔类型是 PHP 4 引进的。
语法
要指定一个布尔值,使用关键字 TRUE 或 FALSE。两个都是大小写不敏感的。
<?php
$foo = True; // assign the value TRUE to $foo
?>
通常你用某些运算符返回 boolean 值,并将其传递给流程控制。
// == is an operator which test
// equality and returns a boolean
if ($action == "show_version") {
echo "The version is 1.23";
}
// this is not necessary...
if ($show_separators == TRUE) {
echo "<hr>\n";
}
// ...because you can simply type
if ($show_separators) {
echo "<hr>\n";
}
转换为布尔值
要明示地将一个值转换成 boolean,用 (bool) 或者 (boolean) 来强制转换。但是很多情况下不需要用强制转换,因为当运算符,函数或者流程控制需要一个 boolean 参数时,该值会被自动转换。
参见类型戏法。
当转换为 boolean 时,以下值被认为是 FALSE:
布尔值 FALSE
整型值 0(零)
浮点型值 0.0(零)
空白字符串和字符串 "0"
没有成员变量的数组
没有单元的对象
特殊类型NULL(包括尚未设定的变量)
所有其它值都被认为是 TRUE(包括任何资源)。
整型
一个 integer 是集合 Z = {..., -2, -1, 0, 1, 2, ...} 中的一个数。
参见任意长度整数 / GMP,浮点数 和 任意精度数学库 / BCMath。
语法
整型值可以用十进制,十六进制或八进制符号指定,前面可以加上可选的符号(- 或者 )。
如果用八进制符号,数字前必须加上 0(零),用十六进制符号数字前必须加上 0x。 例子 6-1. 整数文字表达
<?php
$a = 1234; # 十进制数
$a = -123; # 一个负数
$a = 0123; # 八进制数(等于十进制的 83)
$a = 0x1A; # 十六进制数(等于十进制的 26)
?>
在字面上,整型变量正式的结构可以为:
<?php
decimal : [1-9>[0-9>*
| 0
hexadecimal : 0[xX>[0-9a-fA-F>
octal : 0[0-7>
integer : [ ->?decimal
| [ ->?hexadecimal
| [ ->?octal
?>
整型数的字长和平台有关,尽管通常最大值是大约二十亿(32 位有符号)。PHP 不支持无符号整数。
整数溢出
如果你指定一个数超出了 integer 的范围,将会被解释为 float。同样如果你执行的运算结果超出了 integer 范围,也会返回 float。
<?php
$large_number = 2147483647;
var_dump($large_number);
// 输出为:int(2147483647)
$large_number = 2147483648;
var_dump($large_number);
// 输出为:float(2147483648)
// 同样也适用于十六进制表示的整数:
var_dump( 0x80000000 );
// 输出为:float(2147483648)
$million = 1000000;
$large_number = 50000 * $million;
var_dump($large_number);
// 输出为:float(50000000000)
?>
警告
不幸的是 PHP 中有个 bug,因此当有负数参与时结果并不总是正确。例如当运算 -50000 * $million 时结果是 -429496728。不过当两个运算数都是正数时就没问题。
这个问题已经在 PHP 4.1.0 中解决了。
PHP 中没有整除的运算符。1/2 产生出浮点数 0.5。您可以总是舍弃小数部分,或者使用 round() 函数。
<?php
var_dump(25/7); // float(3.5714285714286)
var_dump((int) (25/7)); // int(3)
var_dump(round(25/7)); // float(4)
?>
转换为整形
要明示地将一个值转换为 integer,用 (int) 或 (integer) 强制转换。不过大多数情况下都不需要强制转换,因为当运算符,函数或流程控制需要一个 integer 参数时,值会自动转换。您还可以通过函数 intval() 来将一个值转换成整型。
参见类型戏法。
从布尔值转换
FALSE 将产生出 0(零),TRUE 将产生出 1(壹)。
从浮点数转换
当从浮点数转换成整数时,数字将被取整(丢弃小数位)。
如果浮点数超出了整数范围(通常为 /- 2.15e 9 = 2^31),则结果不确定,因为没有足够的精度使浮点数给出一个确切的整数结果。在此情况下没有警告,甚至没有任何通知!
(译者注:)在 Linux 下返回结果是最小负数(-2147483648),而在 Windows 下返回结果是零(0)。
警告
决不要将未知的分数强制转换为 integer,这样有时会导致意外的结果。
<?php
echo (int) ( (0.1 0.7) * 10 ); // 显示 7!
?>
更多信息见浮点数精度。
从字符串转换
参见字符串转换为数字。
从其它类型转换
注意
没有定义从其它类型转换为整型的行为。目前的行为和值先转换为布尔值一样。不过不要依靠此行为,因为它会未加通知地改变。
浮点型
浮点数(也叫“floats”,“doubles”或“real numbers”)可以用以下任何语法定义:
<?php
$a = 1.234;
$a = 1.2e3;
$a = 7E-10;
?>
形式上:
LNUM [0-9>
DNUM ([0-9>*[\.>{LNUM}) | ({LNUM}[\.>[0-9>*)
EXPONENT_DNUM ( ({LNUM} | {DNUM}) [eE>[ ->? {LNUM})
浮点数的字长和平台相关,尽管通常最大值是 1.8e308 并具有 14 位十进制数字的精度(64 位 IEEE 格式)。
浮点数精度
显然简单的十进制分数如同 0.1 或 0.7 不能在不丢失一点点精度的情况下转换为内部二进制的格式。这就会造成混乱的结果:例如,floor((0.1 0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999...。
这和一个事实有关,那就是不可能精确的用有限位数表达某些十进制分数。例如,十进制的 1/3 变成了 0.3333333. . .。
所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数库或者 gmp 函数库。
转换为浮点数
如果您希望了解有关何时和如何将字符串转换成浮点数的信息,请查阅标题为“将字符串转换为数字”的有关章节。对于其它类型的值,其情况类似于先将值转换成整型,然后再转换成浮点。请参阅“转换为整型”有关章节以获取更多信息。
字符串
string 是一系列字符。在 PHP 中,字符和字节一样,也就是说,一共有 256 种不同字符的可能性。这也暗示 PHP 对 Unicode 没有本地支持。请参阅函数 utf8_encode() 和 utf8_decode() 以了解有关 Unicode 支持。
注: 一个字符串变得非常巨大也没有问题,PHP 没有给字符串的大小强加实现范围,所以完全没有理由担心长字符串。
语法
字符串可以用三种字面上的方法定义。
单引号
双引号
定界符
单引号
指定一个简单字符串的最简单的方法是用单引号(字符 ';)括起来。
要表示一个单引号,需要用反斜线(\)转义,和很多其它语言一样。如果在单引号之前或字符串结尾需要出现一个反斜线,需要用两个反斜线表示。注意如果你试图转义任何其它字符,反斜线本身也会被显示出来!所以通常不需要转义反斜线本身。
注: 在 PHP 3 中,此情况下将发出一个 E_NOTICE 级的警告。
注: 和其他两种语法不同,单引号字符串中出现的变量和转义序列不会被变量的值替代。
<?php
echo ';this is a simple string';;
echo ';You can also have embedded newlines in
strings this way as it is
okay to do';;
// Outputs: Arnold once said: "I';ll be back"
echo ';Arnold once said: "I\';ll be back"';;
// Outputs: You deleted C:\*.*?
echo ';You deleted C:\\*.*?';;
// Outputs: You deleted C:\*.*?
echo ';You deleted C:\*.*?';;
// Outputs: This will not expand: \n a newline
echo ';This will not expand: \n a newline';;
// Outputs: Variables do not $expand $either
echo ';Variables do not $expand $either';;
?>
双引号
如果用双引号(")括起字符串,PHP 懂得更多特殊字符的转义序列:
表格 6-1. 转义字符
序列 含义
\n 换行(LF 或 ASCII 字符 0x0A(10))
\r 回车(CR 或 ASCII 字符 0x0D(13))
\t 水平制表符(HT 或 ASCII 字符 0x09(9))
\\ 反斜线
\$ 美元符号
\" 双引号
\[0-7>{1,3} 此正则表达式序列匹配一个用八进制符号表示的字符
\x[0-9A-Fa-f>{1,2} 此正则表达式序列匹配一个用十六进制符号表示的字符
此外,如果试图转义任何其它字符,反斜线本身也会被显示出来!
双引号字符串最重要的一点是其中的变量名会被变量值替代。细节参见字符串解析。
定界符
另一种给字符串定界的方法使用定界符语法(“<<<”)。应该在 <<< 之后提供一个标识符,然后是字符串,然后是同样的标识符结束字符串。
结束标识符必须从行的第一列开始。同样,标识符也必须遵循 PHP 中其它任何标签的命名规则:只能包含字母数字下划线,而且必须以下划线或非数字字符开始。
警告
很重要的一点必须指出,结束标识符所在的行不能包含任何其它字符,可能除了一个分号(;)之外。这尤其意味着该标识符不能被缩进,而且在分号之前和之后都不能有任何空格或制表符。同样重要的是要意识到在结束标识符之前的第一个字符必须是你的操作系统中定义的换行符。例如在 Macintosh 系统中是 \r。
如果破坏了这条规则使得结束标识符不“干净”,则它不会被视为结束标识符,PHP 将继续寻找下去。如果在这种情况下找不到合适的结束标识符,将会导致一个在脚本最后一行出现的语法错误。
定界符文本表现的就和双引号字符串一样,只是没有双引号。这意味着在定界符文本中不需要转义引号,不过仍然可以用以上列出来的转义代码。变量会被展开,但当在定界符文本中表达复杂变量时和字符串一样同样也要注意。 例子 6-2. 定界符字符串例子
<?php
$str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;
/* More complex example, with variables. */
class foo
{
var $foo;
var $bar;
function foo()
{
$this->foo = ';Foo';;
$this->bar = array(';Bar1';, ';Bar2';, ';Bar3';);
}
}
$foo = new foo();
$name = ';MyName';;
echo <<<EOT
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1>}.
This should print a capital ';A';: \x41
EOT;
?>
注: 定界符支持是 PHP 4 中加入的。
变量解析
当用双引号或者定界符指定字符串时,其中的变量会被解析。
有两种语法,一种简单的和一种复杂的。简单语法最通用和方便,它提供了解析变量,数组值,或者对象属性的方法。
复杂语法是 PHP 4 引进的,可以用花括号括起一个表达式。
简单语法
如果遇到美元符号($),解析器会尽可能多地取得后面的字符以组成一个合法的变量名。如果你想明示指定名字的结束,用花括号把变量名括起来。
<?php
$beer = ';Heineken';;
echo "$beer';s taste is great"; // works, "';" is an invalid character for varnames
echo "He drank some $beers"; // won';t work, ';s'; is a valid character for varnames
echo "He drank some ${beer}s"; // works
echo "He drank some {$beer}s"; // works
?>
同样也可以解析数组索引或者对象属性。对于数组索引,右方括号(>)标志着索引的结束。对象属性则和简单变量适用同样的规则,尽管对于对象属性没有像变量那样的小技巧。
<?php
// These examples are specific to using arrays inside of strings.
// When outside of a string, always quote your array string keys
// and do not use {braces} when outside of strings either.
// Let';s show all errors
error_reporting(E_ALL);
$fruits = array(';strawberry'; => ';red';, ';banana'; => ';yellow';);
// Works but note that this works differently outside string-quotes
echo "A banana is $fruits[banana>.";
// Works
echo "A banana is {$fruits[';banana';>}.";
// Works but PHP looks for a constant named banana first
// as described below.
echo "A banana is {$fruits[banana>}.";
// Won';t work, use braces. This results in a parse error.
echo "A banana is $fruits[';banana';>.";
// Works
echo "A banana is " . $fruits[';banana';> . ".";
// Works
echo "This square is $square->width meters broad.";
// Won';t work. For a solution, see the complex syntax.
echo "This square is $square->width00 centimeters broad.";
?>
对于任何更复杂的情况,应该使用复杂语法。
复杂(花括号)语法
不是因为语法复杂而称其为复杂,而是因为用此方法可以包含复杂的表达式。
事实上,用此语法你可以在字符串中包含任何在名字空间的值。仅仅用和在字符串之外同样的方法写一个表达式,然后用 { 和 } 把它包含进来。因为不能转义“{”,此语法仅在 $ 紧跟在 { 后面时被识别(用“{\$”或者“\{$”来得到一个字面上的“{$”)。用一些例子可以更清晰:
<?php
// Let';s show all errors
error_reporting(E_ALL);
$great = ';fantastic';;
// 不行,输出为:This is { fantastic}
echo "This is { $great}";
// 可以,输出为:This is fantastic
echo "This is {$great}";
echo "This is ${great}";
// Works
echo "This square is {$square->width}00 centimeters broad.";
// Works
echo "This works: {$arr[4>[3>}";
// This is wrong for the same reason as $foo[bar> is wrong
// outside a string. In otherwords, it will still work but
// because PHP first looks for a constant named foo, it will
// throw an error of level E_NOTICE (undefined constant).
echo "This is wrong: {$arr[foo>[3>}";
// Works. When using multi-dimensional arrays, always use
// braces around arrays when inside of strings
echo "This works: {$arr[';foo';>[3>}";
// Works.
echo "This works: " . $arr[';foo';>[3>;
echo "You can even write {$obj->values[3>->name}";
echo "This is the value of the var named $name: {${$name}}";
?>
访问字符串中的字符
字符串中的字符可以通过在字符串之后用花括号指定所要字符从零开始的偏移量来访问。
注: 为了向下兼容,仍然可以用方括号。不过此语法在 PHP 4 中不赞成使用。
例子 6-3. 一些字符串例子
<?php
// Get the first character of a string
$str = ';This is a test.';;
$first = $str{0};
// Get the third character of a string
$third = $str{2};
// Get the last character of a string.
$str = ';This is still a test.';;
$last = $str{strlen($str)-1};
?>
实用函数及操作符
字符串可以用“.”(点)运算符连接。注意这里不能用“ ”(加)运算符。更多信息参见字符串运算符。
有很多实用函数来改变字符串。
普通函数见字符串函数库一节,高级搜索和替换见正则表达式函数(两种口味:Perl 和 POSIX 扩展)。
还有 URL 字符串函数,以及加密/解密字符串的函数(mcrypt 和 mhash)。
最后,如果还是找不到你要的函数,参见字符类型函数库。
字符串转换
您可以用 (string) 标记或者 strval() 函数将一个值转换为字符串。当某表达式需要字符串时,字符串的转换会在表达式范围内自动完成。例如当你使用 echo() 或者 print() 函数时,或者将一个变量值与一个字符串进行比较的时候。阅读手册中有关类型和类型戏法中的部分有助于更清楚一些。参见 settype()。
布尔值 TRUE 将被转换为字符串 "1",而值 FALSE 将被表示为 ""(即空字符串)。这样您就可以随意地在布尔值和字符串之间进行比较。
整数或浮点数数值在转换成字符串时,字符串即为表示这些数值数字(浮点数还包含有指数部分)。
数组将被转换成字符串 "Array",因此您无法通过 echo() 或者 print() 函数来输出数组的内容。请参考下文以获取更多提示。
对象将被转换成字符串 "Object"。如果您因为调试需要,需要将对象的成员变量打印出来,请阅读下文。如果您希望得到该对象所依附的类的名称,请使用函数 get_class()。
资源类型将会以 "Resource id #1" 的格式被转换成字符串,其中 1 是 PHP 在运行时给资源指定的唯一标识。如果您希望获取资源的类型,请使用函数 get_resource_type().
NULL 将被转换成空字符串。
正如以上所示,将数组、对象或者资源打印出来,并不能给您提供任何关于这些值本身的有用的信息。请参阅函数 print_r() 和 var_dump(),对于调试来说,这些是更好的打印值的方法。
您可以将 PHP 的值转换为字符串以永久地储存它们。这种方法被称为串行化,您可以用函数 serialize() 来完成该操作。如果您在安装 PHP 时建立了 WDDX 支持,您还可以将 PHP 的值串行化为 XML 结构。
字符串转换为数值
当一个字符串被当作数字来求值时,根据以下规则来决定结果的类型和值。
如果包括“.”,“e”或“E”其中任何一个字符的话,字符串被当作 float 来求值。否则就被当作整数。
该值由字符串最前面的部分决定。如果字符串以合法的数字数据开始,就用该数字作为其值,否则其值为 0(零)。合法数字数据由可选的正负号开始,后面跟着一个或多个数字(可选地包括十进制分数),后面跟着可选的指数。指数是一个“e”或者“E”后面跟着一个或多个数字。
<?php
$foo = 1 "10.5"; // $foo is float (11.5)
$foo = 1 "-1.3e3"; // $foo is float (-1299)
$foo = 1 "bob-1.3e3"; // $foo is integer (1)
$foo = 1 "bob3"; // $foo is integer (1)
$foo = 1 "10 Small Pigs"; // $foo is integer (11)
$foo = 4 "10.2 Little Piggies"; // $foo is float (14.2)
$foo = "10.0 pigs " 1; // $foo is float (11)
$foo = "10.0 pigs " 1.0; // $foo is float (11)
?>
此转换的更多信息见 Unix 手册中关于 strtod(3) 的部分。
如果你想测试本节中的任何例子,可以拷贝和粘贴这些例子并且加上下面这一行自己看看会发生什么:
<?php
echo "\$foo==$foo; type is " . gettype ($foo) . "<br />\n";
?>
不要指望在将一个字符转换成整型时能够得到该字符的编码(您可能也会在 C 中这么做)。如果您希望在字符编码和字符之间转换,请使用 ord() 和 chr() 函数。