### PHP 的十个高级技巧（上）

全球超过 300 万个互联网网站的管理员都在使用 PHP，使得它成为最为普及的服务器端脚本语言之一。其特点是运行速度快、稳定可靠、跨平台，而且是开放源代码软件。随你使用的水平不同，PHP 可以很简单，也可以很复杂，可以只使用它发送 HTML 表格元素，还可以在 PHP 应用程序中集成 Java 和 XML。
如果你对 PHP 有一定的了解或者看过一些初步的教材，这些技巧可以扩展你对 PHP 的认识，使你掌握一些常见的和高级的 PHP 功能。
一、把 PHP 安装为 Apache 的 DSO
PHP 在 Linux/Unix 平台上经常与 Apache 搭配使用，在安装 PHP 时，有三种安装方式可供选择：静态模式、动态模式（DSO）、CGI 二进制模式。
由于易于维护和升级，我强烈建议以 DSO 方式安装 PHP。例如，初次安装时如果安装的 PHP 仅支持数据库，随后希望再安装支持加密的模块，只要运行“make clean”，添加新的配置选项，然后再运行“make”和“make install”即可，一个新的 PHP 模块就会安装在 Apache 中适当的位置上，然后重新启动 Apache，而无需重新编译 Apache。
下面的步骤将安装一个全新的 Apache，并以 DSO 方式安装 PHP：
1、从 Apache 软件基金会得到最新版本的 Apache 源代码；
2、把得到的源代码放到/usr/local/或者/opt/目录下，或者你指定的任意目录中；
3、运行 Gunzip 对文件进行解压缩，得到后缀为.tar 的文件；
4、运行下面的命令，把文件安装到 apache_[version]目录中：
tar -xvf apache_[version].tar
5、进入/usr/local/apache_[version]目录（或者在步骤 4 中安装压缩文件的目录）；
6、键入下面的命令为编译 Apache 作准备，用你自己的路径替换其中的[path]，例如，/usr/local/apache[version]，现在已经设置了 mod_so 的新值，它将允许 Apache 使用 DSO 模块；
7、回到提示符状态后键入 make，并等待再次回到提示符状态；
8、执行“make install”命令。
至此，Apache 已经安装完毕，系统将重回到提示符状态。接下来我们开始安装 PHP：
1、在 PHP 主页的下载区中找到最新版本的链接；
2、把文件下载到一个适当的目录中，例如/usr/local/或/opt/或者你指定的任意目录中；
3、运行 Gunzip 对文件进行解压缩，得到后缀为.tar 的文件；
4、执行下面的命令把文件安装在 php-[version]目录中：
tar -xvf php-[version]
5、进入/usr/local/php-[version]目录或在步骤 4 中指定的目录；
至此，已经作好了以 DSO 方式安装 PHP 的准备工作，唯一需要修改的配置选项是 with-apxs（这是 Apache 的 bin 目录中的一个文件）。为了得到较高的性能，我没有安装对 MySQL 的支持模块。
./configure --with-mysql=/[path to mysql] --with-apxs=/[path to apxs]
6、回到提示符状态后执行 make 命令，等待重新返回到提示符状态；
7、执行 make install 命令。
至此，系统以 DSO 方式在 Apache 的模块目录中安装了 PHP，并对 Apache 的 httpd.conf 文件作适当的修改后返回到提示符状态。回到提示符状态后，你还需要对 Apache 的 httpd.conf 文件作一些修改。
1、找到包含有 ServerAdmin 的一行，添加你的电子邮件地址，如下所示：
ServerAdmin you@yourdomain.com
2、找到以 ServerName 开头的行，把它改为真正的值，例如：
ServerName localhost
3、找到内容如下所示的小节：
# And for PHP 4.x, use:
#
#AddType application/x-httpd-php .php
#AddType application/x-httpd-php-source .phps
修改这些行的内容，使 PHP 4.0 的 AddType 不再成为注释，并添加希望在 PHP 中使用的文件后缀名，上面的内容变为如下所示的内容：
# And for PHP 4.x, use:
#
AddType application/x-httpd-php .php .phtml
AddType application/x-httpd-php-source .phps
保存文件，回到上一级目录，执行下面的命令重新启动 Apache：
./bin/apachectl start
如果在启动时没有出现错误提示信息，就可以通过创建一个名为 phpinfo.php 的只有如下所示一行内容的文件，对安装的 Apache、PHP 进行测试：
<? phpinfo() ?>
把这个文件保存到 Apache 的文档根目录（htdocs）中，然后开启浏览器，键入 http://localhost/phpinfo.php 地址，屏幕上就会出现许多的变量和它们的值。
如果要重新配置 PHP，需要再次运行 make clean 命令，然后执行带有一系列选项的./configure 命令，然后再执行 make 和 make install 命令，Apache 的目录模块中就会出现一个新的模块，只要再重新启动 Apache 加载这个新的模块，就一切 OK 了。
二、使用 PHP 本身的对话
PHP 4.0 中最令人期待的特性应该是对对话的支持，PHP 3.0 的用户必须使用第三方的软件否则就不能使用对话，不支持对话一直是 PHP 最大的缺憾之一。
只要用户在浏览你的网站，你就可以利用对话维护与特定用户有关的变量，而无需建立多个 cookie、使用隐藏表格字段或将信息存储在数据库中。
在一个网页上启动一个对话，就会使 PHP 引擎知道你想启动一个对话（如果还没有启动）或者继续当前的对话：
session_start();
启动一个对话将通过 cookie 向用户发送一个识别字符串（例如 940f8b05a40d5119c030c9c7745aead9），在服务器端，会创建一个与识别字符串匹配的临时文件，例如 sess_940f8b05a40d5119c030c9c7745aead9，这个文件中包含注册的对话变量以及它们的值。
用来显示对话的作用的最常见的例子是访问计数器。启动 PHP 模块，确保 PHP 代码是文件的第一行，在 PHP 代码之前不要有空格、HTML 代码和其他的代码。因为对话会发送一个头部，因此如果在 session_start()之前有空格和 HTML 代码，就会得到一个出错信息。
<?
// 如果还不存在一个针对某用户的用户，则启动一个对话：
session_start();
然后注册一个名字为 count 的变量：
session_register('count');
注册一个对话变量后，只要对话存在，名字为 count 的变量也就存在。现在，count 变量还没有被赋值，如果对它执行加 1 操作，它的值就变为了 1。
$count++;
把上述内容综合在一块儿，如果还没有启动一个对话，就会启动一个对话；如果不存在一个对话 id，就为用户指定一个好了，注册一个名字为$count 的变量，对$count 执行加 1 操作表示用户已经首次访问了该网页。
要知道用户在当前的对话中访问本页面的次数，只要显示$count 变量的值即可：
echo "<P>You've been here $count times.</p>";
全部的访问计数器代码如下所示：
<?
session_start();
session_register('count');
$count++;
echo "<P>You've been here $count times.</p>";
?>
如果重新加载上述的脚本文件，就会发现变量 count 的值增加了 1，很酷吧。
还可以在对话中注册一个数组变量，假设我们注册了一个名字为$faves 的变量：
$faves = array ('chocolate','coffee','beer','linux');
可以象注册一个简单变量那样注册一个数组变量：
session_register('faves');
引用数组变量与引用简单变量没有什么二样，如果一个用户在网页上指出在生活中的爱好时，可以把他的爱好注册到一个被称作$faves 的数组变量中，然后可以在另一个网页中很方便地把这些爱好显示出来：
<?
session_start();
echo "My user likes:
<ul>";
while (list(,$v) = each ($faves)) {
echo "<li>$v"; }
echo "</ul>";
?>
然后你就得到了一个关于用户爱好的清单。
对话变量不能被查询字符串覆盖，也就是说我们不能输入 http:///www.yourdomain.com/yourscript.php?count=56 给注册变量$count 指定一个新值，这一点对于安全很重要：只能在服务器端的脚本中删除一个没有注册的对话变量。
如果要完全删除一个对话变量，首先需要从系统中注销它：
session_unregister('count');
要完全删除一个对话变量的脚本是非常简单，如下所示：
session_destroy();
使用对话变量可以减少访问数据库的频率，使代码更加清晰，而且可以减少对用户发送的 cookie 的数量，它是最简单的方法了。