PHP 5完全攻略
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第1部分 PHP5基础

第一篇 PHP 5基础知识

第1章 PHP 5概述

在开篇一章里,我们将共同了解PHP的历史起源、发展、普及度,以及使用PHP技术架构的优势,特别是PHP 5.2的新特性。

本章主要内容如下:

➢ PHP的历史起源、优点及自由开源的精神

➢ PHP应用领域与Web 2.0技术

➢ PHP 5.2新特性概要

➢ PHP与Zend的关系

➢ PHP 5开发环境的安装配置

1.1 什么是PHP

欢迎加入PHP开发者的行列,您将发现一路精彩。

PHP(http://www.php.net),全称为PHP Hypertext Preprocessor,超文本预处理器之意。

PHP已经历了15年的时间洗涤,在开发者的挑剔及业界巨头的挑战中,仍然保持青春的笑容,充满昂扬的斗志而砥砺精进,不断增强升级,每一个版本更新都带给业界和Web开发者众多惊喜。

事实与时间均证明,PHP已经成为全球最受欢迎的脚本语言之一。

1.1.1 PHP的历史

1.PHP/FI

PHP起源于1995年,由当时年仅17岁的丹麦程序员Rasmus Lerdorf编写完成,起初是使用Perl技术为基础开发的服务器端脚本,主要用来跟踪收集浏览自己个人网站简历的信息。因为它的主要功能是表单的转换和信息收集工作,因此Lerdorf将该产品命名为Personal Home Page Tools/Form Interpreter,简称PHP/FI。

随着网站功能的增加,Rasmus又用C语言重写了PHP/FI的底层,实现了网站与数据库的交互,还可以让用户自己编写简单的Web脚本及实现更多的功能。PHP/FI比原来使用Perl开发的解释器要快很多,并且支持变量和基本的语法定义,语法内容与Perl语法非常相似。

Lerdorf意识到Linux和FreeBSD这些自由软件的思想非常好,于是决定把PHP/FI的源代码公开,使更多的人可以利用它来建立动态内容的网站,简单而且免费。1997年11月,PHP/FI v2.0正式发布并提供下载。在后来的时间中,使用该软件的网站达到50000个。PHP 2的一些功能开始有一些开发者加盟共同完善源代码,Lerdorf仍按既定的共享开放的方式进行工作。PHP/FI后来被Beta版的PHP 3所取代。

2.PHP3

同年,Andi Gutmans和Zeev Suraski开始与Lerdorf合作,并宣布正式接任构建和升级PHP/FI 2.0。并且,为了减少旧名称中的一些模糊和歧义,仍采用PHP的名称,并按GNU标准重新规划名字的缩写为“PHP Hypertext Preprocessor”。

PHP 3在公开测试9个月后,于1998年6月发布正式版本。PHP 3提供大量的实用功能和可扩展性,并具备坚实的底层架构,提供面向对象语法,并支持常用的数据处理。数十位开发者看好了这一优势,都参加了PHP 3新的模块开发。截至1998年,约有10000个用户使用PHP,全球10%的网站都采用PHP 3作为开发脚本语言。

3.PHP 4

经官方发布,Gutmans和Suraski开始准备重写PHP的核心,以实现复杂和健壮的应用,并将一些常见的基础应用模块化。

1999年,Zend公司正式发布并首次采用新的PHP引擎,而该公司的创始人正是Gutmans和Suraski,公司名称采用两个人名字Zeev和Andi的前面部分的组合,由此称之为Zend(http://www.zend.com)。

2000年,PHP 4版本正式发布。基于Zend引擎的PHP 4除了强大的功能、优异的性能之外,还支持更多的Web服务器,并增加了Session会话功能、输入输出和缓冲等增强模块。

PHP 4同样得益于世界各地无数开发者的贡献,至此全球大约有20%的网站使用PHP作为开发脚本语言,其中包括一些门户网站以及创新者,这成为推动互联网更快更强发展的动力之一。

4.PHP 5

虽然PHP 4已经能够胜任绝大多数的Web应用,而事实上仍有为数不少的开发者抱怨,由于PHP 4在面向对象机制方面的欠缺,致使在开发大型企业级应用方面表现不足,这些专业领域仿佛早已成了C++/.NET/Java的天下。

还有,有可能需要开发一种应用服务器(Application Server),而脚本程序通常是针对Web方式交互的用户。因此PHP小组开始计划让PHP可以脱离浏览器,使程序可以独立运行(CLI模式)。

目前业界大部分的应用开发,尤其是互联网开发,很多网站模式与理念需要很快被实现为产品和应用,另外也可能需要在操作系统的后台实现复杂服务的功能。

而这一切,PHP都已经满足要求,从而让我们程序员快乐的工作。至于那些更复杂的系统,或者是数十人开发的项目,还是交给更适合的Java,C#或C++去做吧,当然PHP 5也可以胜任这些工作。

事实上PHP 5已经成为一个专业和高效率的开发工具。对于中小型项目,可以实现快速开发和性能优异的目标。而PHP 5在今后的市场定位,也并非扮演与Java或ASP.NET竞争市场的角色。相信不远的将来,随着新的PHP 6.0的发布,PHP的主流应用更有质的飞跃。

1.1.2 PHP的优点

十几年前,在互联网刚刚兴起之时,Web开发者多使用C或Perl等CGI语言进行Web开发,进而发展到使用ASP以及PHP 4等语言,及时至今日百花齐放的C#/ASP.NET、JSP和PHP 5时代。

由于微软的.NET解决方案不能跨平台运行,余下的就只有JavaEE(Java Enterprice Edition)与LAMP(Linux+Apache+MySQL+PHP)两种解决方案。

使用PHP进行Web应用程序开发,具备以下优点:

➢ 解释与编译;PHP是性能优越的编译程序,又具备解释过程的优点,是动态语言的典型代表。

➢ 开发效率高,函数语句简洁明了。

➢ 输出控制灵活,可在HTML中内嵌PHP代码,也可以由PHP输出HTML运行,或者在命令行下执行,将结果输出到其他设备。

➢ 可实现模板化,实现程序逻辑与用户界面分离。

➢ 跨平台可运行在Windows或UNIX/Linux/FreeBSD/Macintosh/OS2等平台。

➢ 与多个Web服务器兼容,如Apache、Microsoft IIS、LightHttpd、Nginx等Web服务器。

➢ 完全支持面向对象开发,并向下兼容,支持过程与面向对象两种风格的开发。

➢ 内嵌Zend加速引擎,性能快速稳定。

➢ PHP编写容易,内置函数丰富,几乎包含了Web开发的所有方面。

➢ 组件化开发,提供MySQL、PostgreSQL、Oracle、Micrsoft SQL Server等多种数据库系统的访问接口,支持ODBC。

➢ 扩展性好,支持访问Win32系统的COM对象。

➢ 支持正则表达式,内置POSIX与Perl,兼容两类的正则表达式支持。

➢ 开发成本低,工具多,且有众多使用PHP开发的源代码项目供我们参考和二次开发。

➢ 应用广泛,据最新统计显示,在全球互联网上有35%以上的网站为PHP驱动(参考页面:http://www.php.net/usage.php)。

➢ 完全支持企业级开发,PHP并非只能做网站,在国内外还有金融行业、能源行业、大的政府型系统采用PHP开发系统平台,并且近年来IBM、SAP、Intel等业界巨头为PHP以及其商业公司Zend提供了巨大的资本投入,并得到Oracle、Mirosoft等公司的支持,另外以PHP软件开发商如NuSphere,Adobe、Aptana等公司均在为PHP的企业化助力驰援。

➢ 支持利用通用的MVC框架开发,在PHP中可以使用Zend Framework、CakePHP、CodeIgniter、Symfony等多个应用框架。

➢ PHP 5的下一版本6.0将全面支持多线程以及Unicode-16、i18n、字符集整理(Collation)、亚洲语言翻译(str_transliterate)等国际化及其他新技术。

➢ 支持桌面级系统开发

PHP不仅能够开发动态网站系统,还能够开发Win32/X-Window桌面级(PHP GTK、Winbinder)应用程序,以及Shell或命令行下运行的Deamon守护脚本以及服务器端管理程序。

➢ 支持加密分发代码

使用Java、.NET这些虚拟机字节码的语言,在某些时候非常容易被反编译,从而导致一些安全问题,使用Zend Optimizer不仅可使PHP实现“编译”运行,实现速度的飞跃,而且可以实现PHP源代码的完全加密,从而保护作者的利益以及软件版权。这也是PHP的最大特点之一。

PHP主要功能与应用有如下三大领域。

1. 服务器端脚本(Server-side Script):即最常用的Web程序开发;

2. 命令行/Shell脚本(CLI/Command line Script):用以做系统自动化与监测脚本;

3. 客户端用户界面(Client-side GUI Application):使用PHP GTK可以编写类似于VC开发的桌面级应用程序。

笔者选择PHP开发的几大理由:

1. 容易,适合快速学习;

2. 有众多的扩展类库;

3. 有活跃的用户群、广大的开发者社区;

4. 安全性高;

5. 运行稳定。

如果你看到这本书只是翻翻而已,那PHP对你来说没有多大意义,如果已经下决心掌握它,那么恭喜你,选择将是明智的。

1.1.3 PHP的精神

PHP起源于自由软件,即开放源代码(Open Source)软件。

有人问,什么是自由软件?为什么喜欢自由软件?是在什么动机下使用自由软件?又为什么逢人便推荐自由软件?

自由软件是一种生活习惯及态度。改变习惯最好的方法就是每天做,一直到我们非用它不可,使用自由软件也是如此。

因为PHP是开放源代码的软件产品,遵守GNU协议。所有的PHP开发者也都是在开放、共享与互助的框架下共同成长。这意味着我们可以随意查看、使用、更改或者重新组织PHP项目的源代码。PHP可以运行在多种操作系统平台上,包括Microsoft的Windows(Windows XP/2004/Vista)家族平台,Linux(RedHat/CentOS/Ubuntu等)家族平台、以及UNIX(FreeBSD/OpenBSD/Solaris/HP UNIX)等平台。LAMP(即Linux+Apache+MySQL+ PHP)架构被称为能与同是Open Source阵营的JavaEE架构相媲美的Web开发解决方案。这里向你推荐使用另一种架构——“FAMP”,即FreeBSD+Apache+ MySQL+PHP。

FreeBSD是基于加州大学伯克利分校计算机系统研究组(CSRG)发布的4.4BSD-Lite操作系统,它继承了BSD系统开发的优良传统,除了能够优秀地胜任工作之外,FreeBSD项目花费了非常多的时间来优化调整系统,使其在真实负载情况下拥有最好的性能和可靠性。由于FreeBSD的优秀性能,在我们能想到的著名站点,如Google、Yahoo!、百度等网站,都能找到由它架设的服务器平台。它与Linux操作系统一样,可以为PHP提供底层支持,为PHP的运行奠定了坚实的基础。无论是LAMP亦或FAMP,都是Open Source阵营为用户提供的强大功能的平台。

使用PHP开发的著名开源软件有:Joomla、Mambo、Drupal、Xoops、MediaWiki、WordPress等,国内有Discuz!,PHPWind,ShopEx等使用PHP开发的Web软件与网站系统。

国内外很多著名的网站,包括Yahoo!、百度、腾讯QQ、Facebook、新浪、搜狐等大型门户网站均在使用PHP作为系统开发,由笔者亲自主持开发的赶集网、爱康网、新网、A8 音乐网等网站平台现在都稳定高效地运行着,其中赶集网以每天近500 万左右PV的高负载为用户提供分类信息服务,爱康网为每位有健康困惑的人有条不紊地提供预约挂号等服务。

2008年,我创立了思技创想(北京)科技有限公司,定位于专业的互联网解决方案,为互联网公司和IT企业提供产品和技术服务。目前已开发了全时网络会议平台(quanshi.com)、喜爱的社区(xiaide.com)等知名网站以及近十余个电子商务平台,这些网站都是由PHP和MySQL在提供着强有力的支撑。

PHP生来虽然不是那么高贵,不像.NET那样财大气粗,也不像Java那样系出名门,但它轻巧灵便,功能实用且强大,已被人们誉为“圣殿上的轻骑兵”。看到这里,你是否已经动心,选择PHP,还需要理由吗?让我们马上行动。

1.1.4 PHP与Web 2.0

从2005下半年至今,互联网的第二个热潮——Web 2.0的概念席卷全球。

所谓的Web 2.0,从商业逻辑和用户体验来讲,主要是SNS(Social Network System)、BLOG、TAG和RSS可订阅标签为主导的功能实现,如社区(如开心网、校内网)、博客或微博客(Blog,如Twitter、新浪博客)、相册(Album,如Flicker)、维基百科(Wiki,如Yahoo! 知识堂、百度知道、新浪爱问)、视频共享(Video,如YouTube、优酷网)等新技术应用。

由于页面采用了无刷新的Ajax技术,从而使客户体验更新更流畅,Web所提供的体验和用户从桌面应用程序所得到的体验间产生的巨大的差距正在消失,而用户正逐渐成为网站的核心代表,即所谓的“以用户为中心”的理念。

从技术层面来讲,Web 2.0技术的网站主要包括以下几种技术特性与功能:

➢ RSS/Atom——RSS和Atom为主的XML技术开始广泛应用,商业逻辑成为简单的并可订阅的应用程序架构。

➢ 可编程的Web——可视化,用户可参与的扩展开发,使用Web 2.0技术可以更快速、即时地构建/扩展商业生态系统和应用程序。

➢ Ajax(Asynchronous JavaScript and XML)——以Ajax技术和XHTML、CSS 2.0为设计标准,以页面无刷新为典型代表,UI用户界面以简洁清晰为主。

而PHP恰恰是开发Web 2.0的最佳语言,目前众多标识自己为2.0的社区网站,著名的如Yahoo! Fliker、YouTube、Facebook,Babytree、开心网、无名小站、优酷、酷6、六间房、猫扑等均以PHP作为主要语言开发自己的网站系统。

也许Web 2.0也仅仅做个标签,再过若干时间也许还会有3.0、5.0,而技术是永远不会落伍的,尤其是PHP。

1.2 PHP 5的新特性

不论你是否使用过PHP开发程序,或是想从PHP 4版本升级到PHP 5版本,或者你刚刚接触PHP,都需要了解PHP 5给我们带来的全新的面向对象开发(OOP)特性。

➢ 支持3P特性(Public/Private/Protected)

➢ 例外以及异常处理(Exceptions)

➢ 对象重载(Object Overloading)

➢ 对象克隆(Object Cloning)

➢ 接口(Interfaces)

➢ 自动调用(Autoload)

➢ 重写的增强的内置函数以及新函数库

PHP 5中最根本也是最重要的变化是使用了对象句柄(或对象ID),比如在复制对象时只引用或复制句柄(ID编号),而不像PHP 4那样复制对象的所有属性和方法。

除了这些基本特点外,因为已经更换了内核,PHP 5执行的速度要比PHP 4快得多,我们完全有理由相信,PHP已经正在成为这个世界上最好的Web开发语言之一。

1.2.1 新的面向对象模式

“PHP 5越来越像Java了!”——很多写过Java的PHP程序员都会这样说。

最初OOP模式第一次引入到PHP 3时,尽管支持面向对象,但仍然是非常有限。后来PHP的继任开发者Zeev和Gutmans在重写PHP 4脚本引擎时,也没有加入更多OOP相关的内容。

随着使用PHP开发的应用程序越来越复杂,编写大型应用程序需要的特性也越来越多,大多数大型项目和公司(项目管理的结构化程度更高,且系统之间必须具备协同工作的能力)对于OOP语言的支持尤为重要。

而我们现在面对的PHP 5.2,它业已成为一个完全成熟的新引擎,不仅执行速度更快,性能也更稳定,并且支持众多的全新特性。

PHP有强大的易用性和灵活性,其运行的稳定与易部署性是其他Web开发语言不能匹敌的。在了解了PHP的各种优点之后,再了解一下PHP 5给我们带来了哪些新鲜的东西。

1.2.2 新的面向对象特性

下面我们先走马观花地了解一下PHP 5的新面向对象特性,同时也列举一些小例子。

1.Public/Private和Protected关键字

在PHP 5中,新增了Public、Protected、Private三个关键字,分别被称做公共、受保护和私有的访问修饰符,用以描述成员变量、类方法或属性的访问限制。

如下面的例子:

      class MyClass {
          private $id = 1000;
          public function getId() {
            return $this->id;
          }
      }

2.统一的构造方法和析构方法

在PHP 5中,以_ _construct()命名的方法作为一个类的构造方法。在PHP 4中,当类的构造方法与类的名称相同时,则视为该类的构造方法,到PHP 5后,强制规定名为_ _construct()的方法名称才被视为构造方法,用于一个类被实例后的初始化操作。请见下面的例子:

      class MyClass {
          function __construct() {
            echo "这是PHP 5标准的构造方法";
          }
      }

与_ _construct()方法相反,由_ _destruct()关键字描述的方法被称为析构方法,该方法用于在运行时销毁一个对象实例。举个简单的例子:

      class MyClass {
        function __destruct(){
          echo "析构方法,用于销毁一个对象";
        }
      }

3.接口(interface)

接口(interface)是一个抽象的类,接口中并不包含任何实现的代码,要求所有implement(实现)了它的类都实现它所描述的那些方法,举个简单例子:

      interface Display {
        //描述一个方法
        function display();
      }
      //实现上面接口中的方法
      class Circle implements Display {
        function display(){
          echo "画一个圆";
        }
      }

4.判断对象的隶属(instanceof)

PHP 5支持使用instanceof关键字来检查一个对象是否属于某个类的实例关系。在PHP 4中使用is_a()函数来实现这一功能,但到了PHP 5以后,该函数已经被废除,如果使用则会出现错误,下面是PHP 5使用instanceof()方法的代码实现例子:

      //判断对象$obj是否是MyClass的实例
      if ($obj instanceof MyClass){
        echo "$obj对象属于MyClass类";
      }

5.Final方法

在PHP 5中使用Final关键字来声明类中某个方法是不可重载的继承关系,请见下面的例子:

      //定义一个类,名称为MyClass
      class MyClass{
          //将getBaseClassName声明为Final类型的方法
          final function getBaseClassName(){
            return __CLASS__;
          }
      }

6.final类

同样地,当我们把一个类也声明为final时,那么这个类也是不可再继承的类,如果有其他子类试图继承一个final类时,会提示错误不再执行,请见下面的例子:

      <?php
          final class FinalClass {
          }
          class BogusClass extends FinalClass {
          }
      ?>

由于子类不可继承一个final类,上面脚本会出现错误,结果如下:

      Fatal error: Class BogusClass may not inherit from final class (FinalClass) in final.php
      on line 5

7.对象的克隆(clone)

由于PHP 5中对对象的复制做了改进,不再是在内存中再复制一个对象,而只是复制一个对象的句柄编号(ID),如果要像PHP 4那样复制一个对象的所有属性和成员方法,需要使用克隆操作,也就是要声明_ _clone()方法,告诉PHP引擎将要执行对象的克隆操作。请见下面的例子:

      <?php
          class MyClass {
            function __clone(){
            echo "对象已被克隆";
            }
          }
          $obj = new MyClass();
          //克隆一个新对象$boj_copy
          $obj_copy = clone $obj;
      ?>

8.类内部的常量定义与引用

类中可以定义常量,称为类常量,类常量可以在任何位置引用,下面是引用类常量的例子:

      <?php
          class MyClass {
            const SUCCESS = "Loading is Success";
            const FAILURE = "Loading is Failure";
          }
          //打印MyClass中SUCCESS常量的值
          echo MyClass::SUCCESS;
      ?>

9.静态方法定义与引用

在PHP 5中,可以在一个类中定义一些静态(static)方法,这样允许用户使用一个非对象实例的上下文引用,也就是不用声明对象也可以引用一个类中的静态方法,使用::关键字来引用,请见下面的例子:

      <?php
          class MyClass {
            //声明一个静态方法
            public static function helloStatic(){
              echo "我是一个静态方法";
            }
          }
          //直接引用静态方法,不需要实例化对象
          MyClass::helloStatic();
      ?>

10.静态成员变量

类里面允许有静态方法,也可以有静态属性(static property)(也称成员变量),调用的方式与调用静态方法相同,使用::关键字来操作,请见下面的例子:

      class Singleton{
        //创建一个私有静态变量$instance
        static private $instance = NULL;
        //构造方法
        private function __construct() {}
          static public function getInstance() {
            //内部调用这个静态变量
            if (self::$instance == NULL){
            self::$instance = new Singleton();
            }
          return self::$instance;
        }
      }

11.定义抽象类

当一个类被定义为抽象(abstract)类时,它将会禁止实例化,而只允许其他类继承,请看下面定义抽象类的例子:

      abstract class MyBaseClass{
        function display() {
          echo "display()方法被调用";
        }
      }

12.定义抽象方法

类可以被定义为抽象的,只能被继承后使用,那么同样道理,如果一个类中包括抽象方法,那它也一定是一个抽象类。请见下面的例子:

      abstract class MyBaseClass {
        abstract function display();
      }

13.声明参数类型为对象

在PHP 5中,在定义函数或方法时,可以声明它所接受参数的类型必须是一个对象,如果传递的是一个非对象时,PHP 5会提示有错误从而中断执行。请见下面的例子:

      function expectsMyClass(MyClass $obj) {
        //etc
      }

14.从方法中返回对象的引用

在PHP 4里,我们不能从方法中直接返回引用的对象,而需要从第一次分配对象到一个虚拟的引用。PHP 4引用对象的语法如下所示:

      $dummy = $obj->method();
      $dummy->method2();

PHP 5引用对象的语法如下所示:

      $obj->method()->method2();

15._ _autoload()方法

_ _autoload()是PHP 5提供的魔术方法(Magic Method)之一,可以实现文件以及类的自动加载。

我们在编写面向对象应用程序时,为了查找和方便规范,一般每定义一个类都会分别保存成一个PHP源文件,这样在调用这些类时,在脚本中要包含这些类文件(一个文件要引入很多的类库),有时会很多,这样显得比较麻烦。那么在PHP 5中,可以定义一个_ _autoload()的方法,可以实现自动调用要使用的类,而不需要的类可以不必再重复包含。

请看下例的方法定义,PHP将尝试调用传递过来的以$class_name变量命名的文件,并创建不同的对象实例。

      function __autoload($class_name) {
        include("libs/".$class_name.".inc.php");
}
      $DB = new Mysql();
      $Smarty = new Smarty();
1.2.3 其他新特性

1.例外句柄(Exception handling)

PHP 5增加了对错误或程序异常时的处理结构语句块。

2.try/throw/catch结构

PHP的这个结构,用于程序运行出现异常时执行的语句段,允许我们从系统提供的Exception类中继承或访问它抛出的对象,然后根据出错的类型进行异常处理。

      class SQLException extends Exception{
        public $problem;
        function __construct($problem){
          $this->problem = $problem;
        }
      }
      try {
        throw new SQLException("不能连接到数据库");
      } catch (SQLException $e) {
        echo "捕获到SQLException异常:$obj->problem";
      } catch (Exception $e) {
        echo "捕获到未知的异常";
      }

提得一提的是,PHP中的大多数内部函数(系统函数)没有抛出例外(Exception)的特性,对PHP 5的新扩展库是支持的,如PECL扩展库中的PDO、mysqli等。

在php.ini设置文件中已经存在的类如:set_error_handler(),我们可以利用它在脚本执行完成之前去捕获没有触发的例外。

3.foreach语句与引用

在PHP 4中,我们不能从数组中重新引用或修改其中数组单元的值,而在PHP 5中则支持该功能,允许我们使用foreach循环并利用&(引用操作符)标记来直接修改数组单元的值。

      <?php
        $arr = array(0, 1, 2, 3);
        foreach ($arr as &$value) {
$value = $value * 2;
        }
        //该数组的内容为array(0, 2, 4, 6)
      ?>

4.引用参数中的默认值

在PHP 4中,默认值不能传递一个形式参数,只能传递一个实参,而在PHP 5中则可为传递引用。

      <?php
          function my_func(&$arg = NULL) {
            if ($arg === NULL) {
            echo "$arg为空";
            }
          }
          my_func();
      ?>

5.iconv()函数

PHP 5在刚推出之时,就已经在内部集成了iconv函数,用于字符集及编码转换(PHP 4是存在于外部的iconv.dll扩展库文件中),我们可以在PHP脚本中直接进行字符的编码转换。

      <?php
          //将$str中的汉字转为UTF-8编码
          $str = '编码转换';
          iconv('UTF-8','GBK',$str);
      ?>
1.2.4 PHP 5.3新特性

2009年6月,PHP小组推出了PHP 5.3,在此版本中添加了众多新特性,可以说是在PHP 5.x版中升级增强最大的一次,主要包括如下内容。

➢ Unicode支持

从PHP 5.3开始,PHP开始正式支持Unicode,即保存字符串时将采用Unicode字符集,该功能主要用于将来PHP 5.x到PHP 6的过渡。

➢ 命名空间(Name Spaces)支持和新的_ _NAMESPACE_ _超级全局常量

➢ 如果你开发的软件项目有类同名时就会产生名称冲突,命名空间会帮你避免这样的问题。在此之前,我们可以在每个类或函数名前加入不同前缀来避免该问题。

➢ 迟静态绑定(Late Static Binding)

➢ 新的mysqlnd原生驱动程序库(MySQL Native Driver)

➢ _ _callStatic方法

➢ OpenID支持

➢ 增加了user.ini用户自定义配置文件

➢ XSLT增强

➢ 函数功能以及安全性进一步增强,如phar扩展

PHP 5.3x的发布,使PHP语言更加符合开发规范,而对PHP 5.2x及之前版本的支持将继续进行,至少到PHP 6的发布,很可能会继续下去,PHP 6的发布将是一个漫长之路。

PHP 5.3x与5.2x的兼容性是相当高的,由于做了一些重要改动,如果是5.2x下正常运行的应用程序,在5.3x中需要做改动方能正常运行,也许PHP 5.4的推出会消除这一问题。

1.2.5 MySQL 5.1新特性

MySQL最初是瑞典MySQL AB公司的产品,后来属于Sun Micro System公司,2010年1月份,Sun已经成为世界数据库巨头Oracle(甲骨文)公司的旗下一员。

MySQL 5.1版本最初在2008年上半年向市场发布,并于2008年末推出6.0版。目前最后的稳定版本5.1.30,也是在2008年的12月份发布的,新版本至少被推迟了一年。

背景知识(TIPS)

SQL全称为结构化查询语言(Structured Query Language),是关系数据库系统的标准,MySQL、Microsoft SQL Server、Oracle和IBM DB2这些主流数据库系统都在遵循这一标准。

国际标准化组织ANSI制订SQL标准,并确定了关系数据库系统要具备的语法和函数,但是目前业界几乎没有一个系统能百分之百达到标准,主要的原因是标准正在不断发展中。

本书中所描述的SQL是以MySQL为标准的SQL语法。如果您曾经学习过其他数据库应用的知识,那么您将了解到稍微有一些不同。

随着MySQL版本的不断更新,有一些开发者和用户在论坛和新闻组提出一些质疑,一些函数在MySQL中(包括手册)似乎被删除,其实在新版本中一些增强的函数已经包括那些被删掉的过时函数的功能。因此避免向下兼容的问题,比较好的解决方法是我们通常不去依赖数据库,而是在应用程序层来实现业务逻辑,也就是在PHP代码中尽可能的完成要实现的功能。

另外,很多读者知道通过对MySQL系统进行优化、更换存储引擎等技巧会达到提速的效果,但终究效果还是不甚理想,让软件提速的方法仍然是开发应用程序层,而数据库尽量只做数据存储的本职工作。

MySQL 5.0版本开始推出后,除了遵守SQL 2003业界标准外,也更接近于一些竞争对手,新功能如下:

● 视图

● 触发器

● 存储过程

● 事件

● 水平分区

除此之外,MySQL还创新了SQL标准,丰富了开发接口及其新的存储引擎。我们在设计一个数据表时,可以从查询速度和性能等方案考虑,选择使用不同的MySQL存储引擎,这样应用程序性能会有所提升。

MySQL默认的存储引擎是MyISAM,另外还有InnoDB和Memory等存储引擎。在MySQL还在独立发展时,Oracle收购了InnoDB引擎的所属公司。为确保独立性,MySQL 6.0的测试版本中推出了新的Falcon(猎鹰)引擎,除了有InnoDB的事务功能外,在性能上亦要优于InnoDB。

PHP的优势就是提供各种数据库的接口函数库。此外,PHP范围广泛的数据库抽象层统一的处理为不同的数据库系统提供了保证。

与PHP一样,MySQL也为众多语言提供了API的编程接口,如PHP,Java,TCL,Python及开放数据库接口——ODBC。这些“动态组合”这些年来取得了巨大的成功,即PHP和MySQL黄金组合的由来。

值得一提的是,虽然PHP与MySQL是Web开发的最佳匹配,当然,我们也不必完全依赖于对方,同时还有其他新的替补产品,比如MySQL的替代品SQLite3和PostgreSQL。

开源软件的发展是由众多优秀的软件组合成的,我们不会也不可能躲避竞争,闭门造车,我们要感谢开源积极支持者,更要感谢开源团队中的竞争者。

1.3 PHP 5的扩展库

PHP 5的扩展库包括标准扩展库SPL(Standard PHP Library)和外部扩展库PECL(PHP Extension Community Library)。标准库即被编译到PHP内部的库。历史上标准库指的是Standard扩展(默认即编译进PHP),但5.0出现后,标准库实际上成了代名词。PHP 5新增内置标准扩展库:XML扩展库——DOM,SimpleXML、ICONV以及SQLite等,而类似MySQL、MySQLLi、OverLOAD、GD2等这些库则被放在PECL外部扩展库中,需要时在php.ini配置文件中选择加载。

1.3.1 XML扩展

在PHP5中,所有的XML扩展都已被全部重写,libxml2中的XML工具包(参考网址:http://www.xmlsoft.org/)为PHP的XML操作提供了更多的高可维护性的技术。

在PHP5.1后,上述所有扩展(包括SAX\DOM及XSLT)已经全部集成在PHP软件发行包中,其中包括SimpleXML和SOAP功能。我们可以利用PHP 5提供的对XML的强大处理功能,比如对RSS、Web Service的数据分析、处理等。

1.DOM

DOM全称为Document Object Model,在PHP 4版本中,已经使用了libxml2库对DOM的支持,但是存在内存泄露的Bug,并且该API对W3C也不太兼容。

在PHP 5中,DOM扩展已经实现完全支持,不仅扩展库已经重写并被集成到PHP,而且还对W3C标准全面兼容。

2.SimpleXML

现在PHP开发者在操作使用XML时,又多了一种选择——SimpleXML,这是PHP 5全新开发的外部扩展库,用以替代DOM或较难用的SAX。

SimpleXML将XML文件视为创建一个PHP对象,可以读写及重载,而且只需简单的访问元素以及属性就可以了,下面是一个XML文件的样例:

      <clients>
          <client>
            <name>张一</name>
            <account_number>8801872348385371</account_number>
          </client>
          <client>
            <name>李二</name>
            <account_number>8801723843291345</account_number>
          </client>
      </clients>
      下列程序将打印XML文件中每个客户的名字和账号。
      <?php
          $clients = simplexml_load_file('clients.xml');
          foreach ($clients->client as $client) {
            echo "$client->name的账号名称 $client->account_number\n";
          }
      ?>

很明显,使用SimpleXML方法解析XML是非常容易的。

3.XML Reader

PHP 5引入了新的类XMLReader,用于读取可扩展标记语言(Extensible Markup Language,XML)。

与DOM和SimpleXML不同的是,XMLReader以流模式进行操作,即从头到尾读取文档,在文档后面的内容编译完成之前,可以先处理已编译好的文档前面的内容,从而实现快速、高效、节省地使用内存。

4.SOAP扩展

SOAP协议(Simple Object Access Protocol,简单对象访问协议)是Web服务(Web Service)的一种,用于解决异构系统之间的信息传递问题,如PHP与.NET Web Service之间的消息共享,PHP与Java Web Service的互通等。

在PHP 5中,已经完全重写了对SOAP支持的扩展库,也不需要再使用稍嫌笨重的PEAR Soap或NuSoap类库。下例是在PHP5中调用一个WSDL文件中的SomeFunction()方法。

      <?php
          $client = new SoapClient("someurl.wsdl");
          $client -> SomeFunction($a,$b,$c);
      ?>

由于SOAP功能被PHP 5封装在内部扩展库中,执行速度与效率都比使用外部类库要高,这样能够更容易地创建和使用Web服务。

1.3.2 SPL

SPL-Standard PHP Library(PHP标准库)是为解决一些在Web开发中普遍存在的问题,在PHP 5中提供了一系列的接口(interface)和类(class)的类库。

SPL为PHP开发者提供了迭代器(Iterator)、数组对象(ArrayObject)、运行时异常处理(RuntimeException、InvalidArgumentException等)、观察者模式(Observer Pattern)等数据容器与解决方案。

我们使用下列方法查看当前可用的SPL类。

        <?php
          print_r(spl_classes());
        ?>
1.3.3 MySQLi扩展

PHP 5重新编写了一套新的MySQL数据库扩展库——MySQLi,它提供了新的特性以及针对新版本MySQL 5.x的优化功能,这个扩展提供了两个接口,分别用于面向过程和面向对象,PHP开发者可以任选一种样式进行开发。

MySQLi扩展还支持prepared预执行、变量绑定以及SSL连接支持、数据压缩连接、事务控制等实用的功能和方法。

1.3.4 PDO数据库抽象层

PDO(PHP Data Object)是PHP 5中新加入的数据库抽象层,直接预装在PHP的扩展中,主要是为了解决访问不同数据库统一接口的问题。

PDO类似于数据库抽象层对象驱动(Database Abstraction Layer),如PEAR::DB类和ADODB数据库抽象类的操作,这给数据库间迁移的通用性和开发程序的易用性带来极大的方便。

如果采用PDO扩展进行Web开发,可以像使用著名的ADODB、PEAR:DB数据库抽象类一样,使用像fetchAll,fetchAssoc等多种方法取得记录集,使程序逻辑更简洁清晰。

由于PDO是底层开发的C代码开发编译,因此执行效率较高,同时也提高了PHP代码层的通用性和可读性,调试起来更加方便。

PDO是随PHP 5.1软件包正式分发的,目前已经支持绝大多数的主流数据库系统,如MySQL,Oracle,MS SQL Server等常用的数据库管理系统。

1.3.5 JSON扩展

JSON全称为JavaScript Object Notation,是一种非常轻量级的数据交换格式,自PHP 5.2起,正式在内部集成JSON功能。

JSON基于JavaScript脚本语言,ECMA-262 版本3 的一个子集,它主要利用了成对的{}来包住各个object(对象),用成对的中括号([])来包住各个array(数组),用成对的""来包住各字符串,用逗号来区隔各变量,数据类型有字符串(string)、数组(array)、对象(object)。

JSON主要用于JavaScript与服务器端PHP脚本的交互。

1.4 PHP 5外部扩展库

1.4.1 PECL扩展

PECL是PHP Extension Community Library的简称,意为PHP社区扩展库。PECL与官方PHP开发小组开发和发布的扩展库很相似,均作为PHP的扩展库,PECL以C/C++作为底层语言开发,在PHP社区上发布,不需要PHP开发小组认证。

比如调用Perl脚本的Perl语言扩展、基于数据库的扩展包PDO、加速功能的APC等模块都是在PECL扩展基础上运行的,PECL的官方网址为http://pecl.php.net,该网站上有很多PHP安装包中没有但非常有用的扩展库,相信一定会对我们的工作有很大帮助。

在Linux/FreeBSD系统默认情况下,PECL扩展没有包含在PHP 5的安装包内,也就是说需要再安装这个包,而Windows的PHP压缩包内已经存在部分常用PECL扩展库,无需再安装。

1.4.2 PEAR扩展

PEAR,英文全称为PHP Extension and Application Repository,意为PHP扩展与应用库,官方网址为:http://pear.php.net

PEAR是一个PHP代码库,为标准程序功能提供用纯粹的PHP代码预先编写的类,包含了有丰富特性的功能类库,包括数据库、邮件、时间和错误处理等,从而会大大降低应用程序的开发时间。

在采用PEAR库的情况下,开发人员就可以部署和增强已经编写的基本函数,同时把注意力集中到编写软件新功能和商业逻辑方面。

1.5 PHP 5的其他更新

PHP 5一直在不断升级更新,总体上是围绕着性能、安全与新特性,不断为开发者提供新的动力。

1.5.1 Zend引擎2.x

Zend引擎(Zend Engine)是PHP的大脑和心脏。它负责提供基本的API和方法模块,以及实现PHP语言的语法及解析。与PHP 4(内置为Zend引擎1.5)相比,PHP 5内置的Zend引擎2.0改善了大量问题,比如前面提到的面向对象特性等。

Zend引擎核心由位于美国加利佛尼亚州库比蒂诺市的Zend Technologies公司(http://www.zend.com)开发,Andi Gutmans和Zeev Suraski是Zend引擎的创建者和革新者,同时也是Zend公司的两位创始人,他们在PHP的开源社区担任着重要角色,维护和推动着PHP的发展。

Zend公司为PHP提供开发、部署和管理关键商业PHP应用的产品和企业服务,除Zend引擎之外,如Zend Server、Zend Core Platform、Zend Studio Server、Zend Guard等系统级软件及Zend Framework、Zend Clound API、Social events等应用级软件框架,都能为IT人员实现企业级的PHP应用和技术支持。

值得一提的是,Zend与Microsoft已经通过关于提高Windows与基于该平台的PHP版本之间的兼容性的携手合作,声称在Windows Vista环境下运行PHP的性能可以提高200~300倍。

Zend引擎的最新版本为2.3,随PHP 5.3软件包发行。

1.5.2 新的内存管理器

您可能会问,什么是内存管理器?回想计算机内存储器的发展历程,从最早的1KB、1MB到现在的几GB或更大容量,在早期软件开发中或在移动嵌入式开发时必须要注意内存的容量与分配的问题,避免内存泄露或对系统发出无关的指令而消耗内存,使用C++或其他语义定义严格的语言开发的程序员可能会更深刻理解这一点。

而作为PHP开发人员则生活在一个比较自由的世界里,程序员可以不必关心对系统内存的处理,原因是PHP本身已经处理了这一点,我们只需关心应用程序的业务逻辑,确保自己的变量数据不会相互覆盖即可。

在PHP 5中,新的内存管理器已经正式启用,这也是个关键特性。它主要有两个优点,一是能更好地支持多线程环境(分配不需要再做任何互斥锁定),二是在每个请求完成后,释放已经分配的内存块以便再次被利用。这样一来,系统的开销会大大减少,从而加快内存管理。

在PHP 5.2中,内存管理器主要的更新有以下几处:

● 删除了并不需要的 --disable-zend-memory-manager配置选项

● 增加了--enable-malloc-mm配置选项,并将其设置为默认选项,允许内外部调试

● 允许调整内存管理器中ZEND_MM_MEM_TYPE和ZEND_MM_SEG_SIZE的环境变量

简言之,内存管理器就是在PHP脚本执行时监测和优化内存,当我们写的PHP脚本内部有无限循环或出现未知错误时会及时中止或处理,记录日志并告诉你该如何解决。

1.5.3 Zend Optimizer与Zend Core

除了Zend引擎,Zend还提供了PHP脚本优化加速工具Zend Optimizer以及Zend企业级解决方案包ZendCore。关于Zend Optiomizer脚本优化工具,在稍后一节会向您详细介绍其安装和配置的方法。

关于Zend Core解决方案包,可以到官方网站http://www.zend.com/en/products/下载ZendCore平台,本书在附录二中详细介绍了它的安装配置以及使用方法。

1.6 PHP与Web服务器

PHP能够与现今流行的Web服务器实现完全的支持。众所周知,PHP的黄金搭档非Apache服务器莫属,但是它也能和Microsoft IIS、LightHttpd、Zenus等Web服务器实现良好的支持。

1.6.1 Apache

Apache是1994年源于IBM公司的NCSA小型Web服务器项目。它和PHP的发展很相似,最初是靠热心的程序员或网管以补丁(Pacth)的形式来维护的,从1.3版本开始以Apache的正式名称提供给所有用户免费下载使用,且开放源代码。

Apache从1.4版本开始作两个版本的开发,一个团队在做1.4x版本的维护与少量升级工作,另一开发团队则以全新的代码和架构来开发新的Apache版本,称之为Apache 2.0,目前Apache 2.0最新Release版本是v2.2.14。

下面把Apache2的特性简述如下:

模块化 支持多种语言或脚本引擎,如Perl/ModPerl、JSP/Servlet、PHP等。

安全性高 由于开放源代码,通常会在安全性问题被及时发现并解决后发布更新的版本。

扩展性好 支持多种操作系统,如Microsoft Windows/FreeBSD/Linux/OS2等平台。

可移植性 在这些异构操作系统中,配置与安装方法基本相似。

性能优异 可以自定义运行参数、编译环境,以适应不同的Web环境的承载。

多线程 Apache2支持UNIX运行POSIX线程,在Windows下为多线程模式。

自定义错误文档 管理员可以方便地更改错误页面,如404、500等错误页面的重新定制。

多语种支持 支持UTF-8、GB2312、Shift JIS、BIG5等多种字符集编码。

Apache 2版本在性能上改善很大,在支持POSIX线程的UNIX系统上,Apache 2可以运行在一种多进程与多线程相混合的模式下,并增强了部分性能。同时Apache 2还进行了大量的优化来提升Web页面的处理能力和可伸缩性。因此在Apache 2上运行PHP是比较好的组合,并且它还提供两种模式来支持PHP,一种为CGI方式,一种为Apache模块方式,常用的为第二种,在随后的安装配置一节中我们会详细介绍。

1.6.2 Microsoft IIS

Microsoft的产品不一定都是最好的,但却是很易用的。不可否认的是,IIS的使用比率和它的承载平台的垄断地位有关,但另一方面它的易用性以及继承了Windows的GUI界面,使它在配置和安装方面相对简单。

使用Microsoft IIS也可以完美地支持PHP 5,并且在性能方面相对比较稳定。

1.6.3 其他Web服务器

PHP除了可运行在上述Web服务器外,还可以稳定运行在LightHttpd、Netscape、WebServer、Zenus等其他非主流Web服务器上,因为安装方法大同小异,下面分别介绍如何在Apache和IIS下安装和配置PHP 5环境。

1.7 PHP 5安装与配置

为了照顾不同环境的PHP开发者,我们将分别介绍在Windows Vista/XP系统以及FreeBSD和Linux平台安装PHP 5开发环境的步骤与方法,该步骤包括Web服务器、数据库服务器、PHP 5引擎以及PHP加速引擎Zend Optimizer。

1.7.1 Win32平台下Apache环境安装

由于Windows版本之间差别不是太大,所以PHP 5安装环境很相似。我们准备在Windows Vista系统中安装PHP环境,在安装PHP环境时最好先关闭UAC(用户账户控制——User Account Control)的功能,这样在安装时会省去一些提示管理权限的麻烦,如图1-1所示。

图1-1

如果你使用的是Windows XP或Window 2003系统,则可以忽略该步,其他的安装过程和方法在这3个系统下都是相同的。下面介绍在Windows Vista系统下安装PHP5的开发环境,使用Windows 7的读者也可参考。

1.准备Apache/PHP5/MySQL5

首先需要准备安装文件包,在本书光盘中也为各位读者附送了所需的4个文件,已经放在Develop Tools文件夹,您无需下载,如图1-2所示。

图1-2

接下来,我们开始正式进行安装的步骤。

2.安装MySQL5数据库服务器

MySQL数据库目前有两个版本分支,按照不同的体系分为5.x和6.x,其中5.0与5.1是release(发布版)版,可以在正式运营环境使用。我们需要到MySQL的官方网站中下载MySQL 5.1,下载网址为http://dev.mysql.com/downloads/mysql/5.1.html,请下载Essentials格式的安装文件,也可使用本光盘中的mysql-essential-5.1.41-win32.msi安装文件。

图1-3

下载后双击安装文件开始安装,弹出安装欢迎界面,如图1-4所示。

图1-4

然后单击“Next”按钮,弹出如图1-5所示界面。

图1-5

选择安装类型,“Typical”——典型安装,默认安装在C盘,如果以后重新安装系统则会产生备份等不必要的麻烦,因此我们选择“Custom”——自定义安装,单击“Next”按钮,弹出如图1-6所示界面。

图1-6

单击“Change”按钮,弹出选择安装路径界面,如图1-7所示。

图1-7

本例为安装在E盘的MySQL\MySQL Server 5.1目录下,单击“OK”按钮,安装提示安装的组件,包括服务器端与客户端的驱动程序,按默认值即可,如图1-8所示。

图1-8

然后,单击“Next”按钮,确认安装路径,弹出如图1-9所示界面。

图1-9

确认安装路径正确后,单击“Install”按钮,弹出如图1-10所示界面。

图1-10

我们静待复制完文件后,安装向导会弹出MySQL其他产品的提示,不需理会,直接单击“Next”按钮,如图1-11所示。

图1-11

再次单击“Next”按钮,弹出如图1-12所示界面。

图1-12

现在,MySQL已经将文件安装完毕,第一次安装要对它进行初始配置,取消“Register the MySQL Server now”的复选项,单击“Finish”按钮开始MySQL服务器配置向导,弹出如图1-13所示界面。

图1-13

下面进入MySQL实例配置向导界面,单击“Next”按钮,弹出如图1-14所示界面。

图1-14

选择“Detailed Configuration”详细配置选项,单击“Next”按钮,弹出如图1-15所示界面。

图1-15

该安装界面是选择MySQL服务实例运行的模式。其中,第一种是开发模式(Developer Machine),在本地做测试开发时选择此项,占用内存资源会比较小;第二种是产品模式(Server Machine),即已经作为非独占方式的数据库服务运行,同时该机器上还可能有其他的应用程序,如Apache 2服务在运行;第三种类型为专有数据库服务器模式(Dedicated MySQL Server Machine),即整个服务器主要运行一个MySQL服务。

因为我们搭建的是测试开发环境,选择第一个“Developer Machine”模式即可,然后单击“Next”按钮,弹出如图1-16所示界面。

图1-6

该窗口为选择MySQL服务器的数据库选项。根据需要,一般要兼容速度与性能,就选择第一种,即MyISAM和InnoDB等多种类型库都支持的数据库系统。选择完毕后单击“Next”按钮到下一步。

MySQL安装向导会询问数据库文件保存在哪个路径下,本例中我们选择保存在E盘下的MySQL Datafiles中,你可以根据需要选择保存到其他的目录(需要注意当前逻辑磁盘的空间是否满足要求),如图1-17所示。

图1-17

单击“Next”按钮,将弹出如图1-18界面,该界面是为MySQL选择连接数,第一个选项“Decision Support(DSS)/OLAP”,该选项为MySQL相对优化的连接数量,第二个选项“Online Transation Procession”的最大连接数为500,第三个选项为手动设置最大连接数,我们选择第一种,然后单击“Next”按钮,弹出如图1-19所示界面。

图1-18

图1-19

这是设置MySQL运行时开放的端口号,MySQL默认为3306端口,另外右下角的“Enable Strict Mode”默认为选择,表示在执行SQL语句时做严格检查,如果发现移植过来的应用程序出现SQL错误,只需再次运行向导,把该项选择取消即可。这里我们可暂不做选择。

单击“Next”按钮,开始选择建立新数据库时使用的默认字符集,如图1-20所示。

图1-20

系统默认为latin1字符集,我们选择为手动选择字符集,并从下拉菜单选择utf8编码,你可以根据需要选择合适的编码字符集,如GBK编码等,也可以后更改MySQL的配置文件或使用该向导更改默认字符集。

接着我们开始安装MySQL服务和环境变量设置,如图1-21所示。

图1-21

我们选择安装MySQL服务,即开机自动运行MySQL,然后选择“Include Bin Directory in Windows PATH”——包含二进制文件执行路径,即在任何目录下都可以执行MySQL命令行程序。

接下来,我们开始设置MySQL超级管理员名为root的密码,可选项为是否允许远端机器连接服务器,根据需要选择,不建议建立匿名用户。如图1-22所示。

图1-22

请一定要牢记该root用户的密码,否则可能需要卸载MySQL再重新安装。单击“Next”,弹出如图1-23所示界面。

图1-23

这表示系统已准备开始安装MySQL服务以及安全应用等设置,单击“Execute”按钮执行。我们需要等待几秒钟,等出现如图1-24所示的文字提示后,单击“Finish”按钮,完成MySQL服务器配置向导,至此,MySQL数据库服务器已经安装完毕。

图1-24

要验证MySQL服务器是否运行正常,可以按快捷键<Ctrl + Alt + Del>,打开系统任务管理器。单击显示所有用户进程按钮,如果一切正常,服务器程序(mysqld-nt.exe)应该在进程选项卡中列出,如图1-25所示为Windows XP和Vista的任务管理器。

图1-25

以后每次计算机开机后会自动运行MySQL服务,它的守护端口在3306,MySQL管理员的用户名是root,密码是刚才我们定义的密码。

单击“开始”按钮,选择“运行”命令,输入“cmd”后按回车键,进入系统命令行方式,输入下列命令:

        mysql -u root -p

出现类似于图1-26所示的命令行窗口。

图1-26

输入安装时root用户的密码,如果出现MySQL欢迎信息,这表示MySQL安装成功。

还可以使用另外一种启动方式,即单击“开始”按钮,选择“MySQL→MySQL Server 5.1→MySQL Command Line Client”命令,也会出现上述类似窗口,然后输入root用户的密码,根据提示操作即可,如果要退出MySQL工作台,请用“exit”命令退出。

关于MySQL的命令行操作,我们在后面的MySQL数据库一章中会有更详细的介绍。

3.安装Apache 2 Web服务器

我们可以从http://httpd.apache.org/download.cgi上下载最新的Apache 2 For Win32版本,也可以使用本书附带光盘中的文件。

双击apache_2.2.14-win32-x86-no_ssl.msi文件,开始进入安装程序,弹出如图1-27所示安装欢迎界面的Apache。

图1-27

单击“Next”按钮,弹出如图1-28所示安装界面。

图1-28

单击“I accept the terms in the licence agreement”单选按钮,即同意Apache软件授权协议,单击“Next”按钮,弹出如图1-29所示界面。

图1-29

该界面是Apache 2的自述说明,告诉用户Apache的由来以及更新日志,单击“Next”按钮,弹出如图1-30所示界面。

图1-30

这一步需要我们填写当前安装服务器上的域名和主机名,测试环境中可以随意起一个域名,如果是实际的服务器环境,Server Name应该为DNS服务器已经指向好的域名和主机名,单击“Next”按钮,弹出如图1-31所示界面。

图1-31

选择“Typical”——典型方式安装,单击“Next”按钮,进行下一步配置,弹出如图1-32所示界面。

图1-32

选择Apache默认的安装目录,也可以更改为其他驱动器的目录(如d:\apache2.2),本例选择默认值,单击“Next”按钮,弹出如图1-33所示界面。

图1-33

单击“Install”按钮,开始复制Apache系统文件,如图1-34所示。

图1-34

复制新文件完成后,会弹出命令行窗口,提示安装Apache服务安装成功等信息,如图1-35所示。

图1-35

Windows Vista或XP的防火墙有可能会提示我们,有名为“Apache HTTP Server”的程序要试图进行网络连接,单击“解除锁定”按钮以便顺利安装,弹出如图1-36所示界面。

图1-36

单击“Finish”按钮,至此Apache 2服务器已经全部安装完成。

下一步开始测试Apache Web服务器运行是否正常,打开浏览器,在地址栏内输入http://localhosthttp://127.0.0.1,然后按回车键,如果浏览器上输出的是“It works!”,则表示已经安装成功,如图1-37所示。

图1-37

至此,Apache 2已经可以支持HTML静态页面的访问了。

我们会在屏幕的右下角——系统钩子区域找到一个小羽毛的图标,这是Apache2的实用管理工具:Apache Service Monitor,双击它,弹出如图1-38所示界面,这个工具专门用来管理Apache服务器的启动和停止。

图1-38

注:如果在Windows Vista系统没有找到该工具,则可以到控制面板的服务中找到Apache 2服务,然后进行停止或重新启动操作,如图1-39所示。

图1-39

4.安装PHP 5

现在,我们的Apache服务器已经安装成功,但还不支持PHP的运行。下一步准备模块化安装PHP 5。

我们首先到http://www.php.net官方网站,网站刚刚更改很多目录结构,Windows系统的软件包已经全部迁移到了http://windows.php.net的二级域名中,请不要下载二进制的安装文件,而要使用对应Apache 2.2模块使用的在Visual C++9环境下编译的x86线程的安全压缩包,即php-5.3.0-Win32-VC9-x86.zip。

下载完成后使用WinRAR软件解压缩,您也可以使用本书附带光盘software目录下的同名文件,解压缩到C:\php目录下,如图1-40所示。

图1-40

Zip包文件解压缩后的目录树结构如图1-41所示。

图1-41

下面对PHP软件压缩包中的文件以及目录功能进行简要说明。

        C:\php
          |
          +--dev
          |  |
          |  |-php5ts.lib
          |
          +--ext             -- PHP的扩展库文件,在Win32下扩展名为.dll,Unix环境为.so
          |  |
          |  |-php_bz2.dll
          |  |-php_mysql.dll
          |  |-php_mysqli.dll
          |  |
          |  |-...
          |
          +--extras
          |  |
          |  +--mibs            -- SNMP支持文件
          |  |
          |  +--openssl         -- Openssl支持文件,用以使用HTTPS加密方式连接
          |  |
          |  +--pdf-related     -- PDF相关支持文件
          |  |
          |  |-mime.magic
          |
          +--pear               -- PEAR类库的初始目录
          |  |
          |  |
          |  +-go-pear.phar     -- PEAR相关文件
          |-go-pear.bat         -- 安装PEAR库的批处理文件
          |-php-cgi.exe         -- PHP5 CGI模块解释程序
          |
          |-php-win.exe         -- PHP5 Win32脚本解释程序
          |
          |-php.exe             -- PHP CLI模式可执行程序,命令行脚本解释程序
          |
          |-..
          |
          |-php.ini-development  -- 开发时的php.ini配置,在5.3之前名字是php.ini-dist
          |
          |-php.ini-production  -- 推荐运营时的php.ini设置,在5.3之前名字是php.ini-recommended
          |
          |-icudt38.dll
          |
          |-php5apache.dll
          |
          |-php5apache2.dll
          |
          |-..
          |
          |-php5ts.dll           -- 核心PHP DLL文件
          |
          |-...

接着,我们把C:\php\下的php.ini-development文件改名为php.ini,复制到C:\windows目录中。

这样做的好处是,如果以后升级PHP,如将PHP 5.2.9升级为PHP 5.3或更高版本,只需要把新版本的PHP文件原样覆盖到C:\php目录下就可以完成升级。

小技巧:Windows中隐藏已知文件的扩展名

在我们把php.ini.production重命名为php.ini时,您可能会注意到图标的旁边只有PHP三个字母,而没有文件扩展名,如果发生这种情况,是因为您的Windows被设置成了“隐藏已知文件的扩展名”。

Windows系统知道.ini文件是配置设置文件,于是它隐藏了这个文件的扩展名。这个功能可能会导致某种混乱,比如php.exe和php.gif两个文件,除了图标不同外,文件名都是php。因此我们在修改配置php.ini文件时,希望能够看到它的文件名,就是能分辨php.gif和php.exe的区别。

因此我们需要修改该设置,先打开Windows控制面板,找到“文件夹选项”菜单,选择“查看”标签,在“隐藏已知文件类型的扩展名”复选框前取消勾选,单击“确定”按钮即可,如图1-42所示。

图1-42

5.配置PHP 5

首先要定位PHP的扩展目录,需要修改刚才复制的C:\windows\php.ini配置文件,在521行左右,找到下面的代码。

        extension_dir = "./"

这表示在当前目录查找扩展库,需要修改为PHP的所在目录,修改后的代码如下:

        extension_dir = "c:/php/ext/"

这告诉PHP,扩展库的目录是在c:\php\ext下(注意代码中目录使用的是右斜线),如图1-43所示。

图1-43

在文件中继续向下滚动,我们会看到一些以“;extension”开头的行,这些都是选择加载的PECL扩展库,默认被禁用。要与MySQL数据库连接,就要启用MySQL扩展。

启用扩展很容易,把php_mysqli.dll行前面的分号删除就可以了,改后代码如下:

        extension = php_mysql.dll

建议使用php_mysqli.dll扩展,这是对MySQL数据库的一个新的优化的扩展库。

在该文件中继续向下滚动,找到行开头为; session.save_path的一行,删除行前的分号,并将目录设置为在Windows下的Temp文件夹,代码如下:

        session.save_path = "C:\Windows\Temp"

修改后,我们保存php.ini文件,然后退出编辑器状态。

以上是配置PHP,接着开始修改Apache的配置文件,把PHP编译器以模块方式加入到Apache中,以便解析PHP脚本。这个配置文件在Apache的安装目录conf的子目录中,名为httpd.conf,如图1-44所示。

图1-44

用UltraEdit或任何文本编辑器打开该文件,找到LoadModule一节,增加如下内容,将PHP的Apache模块文件加载到Apache2中,如图1-45所示。

        LoadModule php5_module "C:/php/php5apache2_2.dll"

图1-45

下一步是告诉Apache2遇到什么扩展名的文件使用PHP引擎来解析,我们在该文件中找到AddType application/x-gzip .gz .tgz后按回车键换行,添加如下代码,如图1-46所示):

        AddType application/x-httpd-php .php

图1-46

下面的步骤是可选的,用来指定php.ini配置文件的路径,我们可以在刚刚加入那行文字的底部加入如下代码:

        PHPIniDir ”C:/php”

这表示我们的php.ini文件是保存在c:\php目录中的,该步骤用于在php.ini没有被复制到windows目录中时使用,如果在此之前你已经把文件复制到windows目录中,则可以忽略此步骤。

接着,在该文件中找以DirectoryIndex开头的一行,代码如下:

      <IfModule dir_module>
        DirectoryIndex index.html
      </IfModule>

这行告诉Apache,在访问一个指定的目录时,默认显示文件名,我们在该行的末尾添加一段代码。

      <IfModule dir_module>
        DirectoryIndex index.html index.php
      </IfModule>

接着我们把Apache网站的根目录修改为D盘MyWebsite的htdocs目录,找到如下一行代码:

        DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs"

修改为:

        DocumentRoot "D:/WebSite/htdocs"

注意:需要修改的是“DocumentRoot”(文档目录)而不是“ServerRoot”(服务器根目录),这点请读者一定要留意。

然后,我们在该文件的178行左右,找到如下代码:

        <Directory "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs">

修改为如下路径:

      <Directory "D:/WebSite/htdocs">

然后重启Apache2服务,使刚才修改的配置生效,操作步骤如下:

单击“开始”→“控制面板”→“服务”→“Apache2”,单击右键,选择重启服务,如果是Windows XP系统,可以使用右下角的Apache控制工具重新启动。

PHPApache未来版本

从以往的历史来看,当有新Apache版本推出时,PHP小组都会推出与之匹配的.dll文件。我们在前面的LoadModule行中已经做过引用。如果你仔细浏览PHP目录,会看到诸如php5apache.dll和php5apache2.dll这类文件,这些文件分别提供与Apache 1.3和Apache 2.0的匹配模块。

可能在您阅读本书时,新的Apache又推出了(例如Apache 2.5),这就需要另一个新的.dll文件。比如,

Apache 2.5可能会要求您使用一个新的文件名为php5apache2_5.dll。

如果您使用的是Apache的新版本,并且在PHP目录中看到的dll文件与您的Apache的版本相匹配,请尝试调整LoadModule一行。

另外,如果PHP配置不正确,您也可以随时编辑Apache配置文件。

接下来重新启动Apache,系统托盘处出现Apache代码服务监控系统的羽毛和箭头图标时,表示启动正常。双击该图标,打开Apache的服务监视器的窗口,如果PHP安装正确,这个窗口的状态栏应该会显示已经安装的Apache2和PHP版本,如图1-47所示。

图1-47

单击“OK”按钮关闭Apache服务的监视器窗口,下面我们测试配置后PHP是否可以正常运行。

6.测试安装

我们在Apache的文档根目录,也就是刚才设置的D:\Website\htdocs目录下建立一个测试脚本文件,名为phpinfo.php,编写如下代码:

        <?php
            //显示PHP信息
            phpinfo();
            //显示PHP认证信息
            phpcredits();
            //显示当前安装的PHP版本号
            echo "我的PHP版本:".phpversion();
        ?>

将该文件保存后,在浏览器地址栏中输入http://localhost/phpinfo.phphttp://127.0.0.1/phpinfo.php,如果显示类似如下画面,表示PHP脚本解析成功,如图1-48所示。

图1-48

该画面显示的是当前PHP 5的配置信息,以及一些相关扩展库的版本、作者信息等。

我们在前面已经安装了MySQL 5.1,下面开始使用PHP测试与MySQL数据库的连接。

首先建立一个PHP文件,保存文件名为connect.php,放到Apache的文档根目录D:\WebSite\htdocs下,该脚本的代码如下:

        <?php
            $connection = mysql_connect('127.0.0.1', 'root', '你的mysql管理员密码')
                or die('不能连接到MySQL Server: ' . mysql_error());
            echo '已经成功连接MySQL数据库<br />';
            mysql_select_db('test') or die('不能选择数据库');
            echo '连接test数据库已经成功';
        ?>

使用浏览器在地址栏运行该脚本,地址为:http://localhost/connect.php,MySQL连接成功页面如图1-49所示。

图1-49

该页面表示MySQL与PHP已经成功建立连接,可以进行查询更新等SQL操作。如果不能连接到MySQL数据库,请检查MySQL账号是否正确或mysql扩展是否已经正常启用。

7.安装Zend Optimizer

我们可以在Zend官方网站http://www.zend.com/en/products/guard/downloads,选择Zend Opimizer,然后注册登录会员后下载,也可以使用本书附带光盘中的ZendOptimizer-3.3.3-Windows-i386.exe启动安装程序,弹出欢迎安装界面,如图1-50所示。

图1-50

单击“Next”按钮,进行安装下一步,弹出如图1-51所示界面。

图1-51

然后单击“I accept the terms of ther licence agreement”(遵守用户许可与软件使用协议)单选按钮,单击“Next”按钮到下一步,如图1-52所示。

图1-52

选择要安装的路径,即可以选择默认路径,也可以选择其他路径,本例按默认目录方式安装,单击“Next”按钮,弹出如图1-53所示界面。

图1-53

根据安装的服务器类型和版本号进行选择,因为我们安装的是Apache 2.2,在此处选择为“Apache 2.x”,单击“Next”按钮,进入如图1-54所示界面。

图1-54

Zend Optimizer安装程序询问php.ini配置文件的所在目录,这里是放在C:\windows目录下的,然后单击“Next”按钮,进入如图1-55所示的界面。

图1-55

选择Apache安装的根目录,这里Zend Optimizer识别的Apache 2安装路径可能不正确(Apache 2.2之后已更改了默认安装目录),请单击“Browse..”按钮,选择为“C:\Program Files\Apache Software Foundation\Apache2.2”,或者是你自定义安装的Apache 2目录,如图1-56所示。

图1-56

单击“确定”按钮,再单击“Next”按钮,进入如图1-57所示界面。

图1-57

如果安装路径正确,Zend Optimizer会开始正常安装,进入如图1-58所示界面,否则会提示路径错误,需要返回重新选择。

图1-58

在安装完毕后,它会提示Apache服务器现在正在运行,需要暂停一下Web服务,以便修改一些配置文件以顺利完成安装,如图1-59所示。

图1-59

单击“是”按钮,停止当前运行的Apache 2.2 Web服务,然后在自动重启Apache服务后,将显示如图1-60所示的安装成功的画面。

图1-60

下面我们在浏览器中再次运行phpinfo.php,会观察到Zend Optimizer已经成功安装为3.3x版本了,如图1-61所示。

图1-61

至此,PHP在Win32的Apache服务器环境下的安装已经全部完成。

8.Aapche不能启动的解决方法

由于PHP安装比较烦琐,初学者有时候难免会出错,以下是在安装中经常出现的几个典型错误:

➢ 在安装Web服务器时遇到“Socket error”或“address 0.0.0.0: 80 not available”。这个错误主要是由于当前环境中已经运行了其他Web服务器(比如IIS),80端口已经被占用。解决方案是把IIS分配为其他IP地址或停止,然后再运行Apache的安装程序,选择“REPAIR”-修复方式来重新安装。

➢ 浏览器显示400 的错误信息(或请求)。这是由于PHP引擎并没有找到访问的.php文件,可能在httpd.conf中路径是不正确的。修改完毕后,重启Apache Web服务器,也可以检查Apache的错误日志。选择“开始”→“所有程序”→“Apache HTTP Server 2.2”→“Review Server Log Files”→“Review Error Log”,如图1-62所示。

图1-62

我们可以通过这个日志文件查找到错误的来源,以笔者机器上的日志为例,内容如下:

        [Mon May 14 22:07:432009] [notice] Apache/2.2.14 (Win32) configured -- resuming normal
        operations
        [Mon May 14 22:07:432009] [notice] Server built: Jan  92009 23:17:20
        [Mon May 14 22:07:432009] [notice] Parent: Created child process 5668
        PHP Warning:  PHP Startup: Unable to load dynamic library
        PHP Warning:  PHP Startup: Unable to load dynamic library 'c:/php/ext\\php_mcrypt.dll' -
        \xd5\xd2\xb2\xbb\xb5\xbd\xd6\xb8\xb6\xa8\xb5\xc4\xc4\xa3\xbf\xe9\xa1\xa3\r\n in Unknown
        on line 0
        PHP Warning:  PHP Startup: Unable to load dynamic library 'c:/php/ext\\php_mysql.dll' -
        \xc4\xda\xb4\xe6\xb7\xd6\xc5\xe4\xb7\xc3\xce\xca\xce\xde\xd0\xa7\xa1\xa3\r\n in Unknown
        on line 0

从这个日志的内容里我们可以看出,php_mcrypt.dll和php_mysql.dll这两个动态链接库并没有加载成功。当然这仅仅是一个示例,实际情况还请各位实际分析。

另外我们在开发时,无论是在Windows系统还是在Linux系统,经常查看错误日志是一个好习惯。

1.7.2 Win32平台下IIS环境安装

考虑到一些开发人员是在Microsoft IIS下做PHP的开发运营,下面我们再介绍如何在IIS服务器下安装PHP 5环境。除了不运行Apache的安装包外,其他内容和上节类似。

我们以Windows Vista环境的IIS 7.0为主(其他Win32平台如Windows XP/7/2003与此类似),从安装Web服务器开始,步骤如下:

首先将php-5.3.1-Win32.zip解压缩到C:\php下,然后再把C:\php\php.ini-recommend的文件改名为php.ini,复制到c:\windows目录下,然后编辑该文件,将extion_dir参数指到php所在目录的c:\php\ext。

具体请参见上节。下面我们开始正式安装IIS 7.0。

1.安装IIS 7.0 Web服务器

Windows Vista ultramate版本在默认环境下并没有安装IIS Web服务器,需要另行安装。单击“开始”菜单→“控制面板”,单击左侧的“控制面板主页”连接,如图1-63所示。

图1-63

单击“程序”图标,进入如图1-64所示的画面。

图1-64

在“程序和功能”文字下方,单击“打开或关闭Windows功能”连接,弹出如图1-65所示的界面。

图1-65

我们选择“Internet信息服务”选项,在右侧勾选“IIS管理服务”、“IIS管理脚本和工具”、“IIS管理控制台”和“万维网服务”等选项,单击“确定”按钮,然后将Vista安装光盘放在光驱内,等待安装完成,如图1-66所示。

图1-66

2.查看与确认安装

待我们配置和安装完成后,在浏览器地址栏内输入http://localhosthttp://127.0.0.1,就可以看到如图1-67所示界面。

图1-67

3.配置IIS 7.0以支持PHP

PHP在IIS中有CGI和ISAPI两种运行模式。一般来说,CGI模式系统资源消耗高,容易因超时而没有反应;而ISAPI模式执行效率高,系统资源消耗小,负载能力强,但安全性比CGI略差。本例以ISAPI模式为例介绍配置步骤。

单击“开始”→“运行”,输入“Inetmgr.exe”,运行IIS 7控制台,在主目录下,单击“Default Web Site”链接,出现如图1-68所示画面。

图1-68

单击“处理程序映射”命令,进入下一个画面,如图1-69所示。

图1-69

下面开始添加脚本映射,输入请求路径为*.php,选择执行文件或直接填写为c:\php\ php5isapi.dll,如图1-70所示。

图1-70

单击“确定”按钮,显示如图1-71所示的对话框。

图1-71

单击“是”按钮,完成PHP脚本映射。然后我们在IIS的“默认文档”设置里面添加新的索引页文件名:index.php。

最后一步,我们在命令提示符下执行如下命令,重新启动IIS的Web服务。

        net stop w3svc
        net stop iisadmin
        net start w3svc

最后我们还要进行PHP测试的工作,您可以参考上一节。至此,在Windows Vista IIS 7.0下安装PHP环境已经成功完成。

1.7.3 使用集成化安装包

如果觉得自行安装比较麻烦,我们也可以使用一些集成化(All-in-one)的PHP服务器应用套件,以实现在Win32平台下快速搭建PHP开发环境。下面向您介绍一些广泛流行的套件。

1.EasyPHP

EasyPHP是由法国人开发的,经过EasyPHP整合后的Apache和MySQL明显精简很多,运行速度比单独安装的Apache和MySQL更快,通过系统钩子一个界面就可管理。它目前有3个分发版本,分别集成的是PHP 5.2.10、PHP 5.3和PHP 6.0的开发版本,集成的MySQL版本均为5.1.37。

官方网站:http://www.easyphp.org/

下载地址:http://www.easyphp.org/download.php

2.XAMPP

XAMPP是由德国人开发的,性能优异,推荐使用。XAMPP包括PHP 4和PHP 5两种环境,可以选择版本切换,并集成了大部分的PHP扩展库、OpenSSL以及Perl开发环境。

它提供Win32(XP/Vista)和Liunx、MacOS、Solaris平台环境的软件安装包,并提供简体中文语言支持。

官方网站:http://www.apachefriends.org/

下载地址:http://www.apachefriends.org/zh_cn/xampp.html

3.AppServ

AppServ是由泰国人开发的,我国台湾的PHP开发者喜爱使用的PHP 5开发环境,目前的版本是2.5.10。

官方网站:http://www.appservnetwork.com

下载地址:http://sourceforge.net/projects/appserv/files/

4.PHPHome

PHPHome和AppServ类似,支持在Windows系统上的PHP开发环境安装。

官方网站:http://sourceforge.net/projects/phphome/

下载地址:http://prdownloads.sourceforge.net/phphome/phphome_2.3.4.zip?download

5.Apache2triad

Apache2triad集成开发环境里除了Apache 2、PHP和MySQL之外,还有Python、Perl以及众多工具和分析软件。

官方网站:http://apache2triad.net/

下载地址:http://sourceforge.net/projects/apache2triad/files/

您可根据自己的喜好,安装使用上述任一个集成化安装包,但绝大多数都没有安装Zend Optimizer,具体安装过程这里不再赘述。

注意:如果安装上面任意一款软件,在本机中就不要有任何已存在的Web服务,以避免安装和运行时产生端口冲突,如果有,请使用不同的端口,如Apache使用8080端口。

1.7.4 FreeBSD平台

FreeBSD系统的Ports功能可以在安装应用软件时实现软件关联依赖性的自动化安装,这种方式使得在UNIX环境下安装软件变得非常容易,也得到了更多对UNIX系统情有独钟的人的喜爱。

下面我们就以FreeBSD 7.1为例,一步一步开始进行PHP 5开发环境的安装。

1.更新Ports

FreeBSD 7.1 release版本ports自带的PHP版本为5.26,可以更新ports升级到最新的PHP发行版,首先使用root用户或相同权限在Shell下进行如下操作:

        #>portsnap fetch update
        #>portsnap extract
        #>portsnap update

以上命令为更新ports的快照文件和目录索引,待ports树目录更新完毕后,下面安装应用程序时就会以ports的最新版本进行安装。

2.安装MySQL 5数据库服务器

首先需要安装MySQL 5客户端,也就是PHP连接到MySQL数据库相同版本的驱动,使用如下命令:

        #>cd /usr/ports/databases/mysql51-client/
        #>make install

可以看到,它和在UNIX(Linux)环境下安装软件没什么不同。下面开始安装MySQL 5的服务器端,主要是MySQL的核心-数据库引擎以及它的样例数据库,如下所示:

        #>cd /usr/ports/databases/mysql51-server/
        #>make install
        #>rehash

在此过程中系统会提示我们相关MySQL管理的命令和说明。

下面开始选择和修改MySQL配置文件。

执行完上述命令后,会在/usr/local/share/mysql下面产生5个扩展名为.cnf的文件,这是MySQL提供的配置样例,用以对应不同的服务器硬件环境,根据自己的实现选择某个文件为正式的MySQL配置,样例配置文件及说明如表1-1所示。

表1-1

说明:在Win32系统的MySQL中,也存在这5个文件,扩展名为.ini,如果MySQL运行在Windows环境下,也按此方法选择合适的配置文件。

比如当前的服务器内存为1GB,因此我们选用my-large.cnf的配置,把该配置文件复制到/etc目录中,作为MySQL的标准配置文件。

        #>cp /usr/local/share/mysql/my-large.cnf  /etc/my.cnf

下面安装并初始化MySQL数据库,确定MySQL用户为mysql group和root用户。

        #>/usr/local/bin/mysql_install_db --user=mysql

将MySQL以安全模式启动:

        #/usr/local/bin/mysqld_safe --user=mysql &

然后更改MySQL管理员root的密码:

      #>/mysql/bin/mysqladmin -u root password '你的新密码'

值得一提的是:在安装MySQL的时候,ports的目录里并没有mysql.5.x的tar压缩包,系统开始在ports服务器url列表寻找,最后才将MySQL软件包下载下来,因此,读者在遇到这种情况时,请一定要有耐心。

3.安装Apache 2 Web服务器

下面开始安装和编译Apache 2.2服务器,使用如下命令:

        #>cd /usr/ports/www/apache22
        #>make install

等待下载相应的扩展包以及相关文件,最终Apache的主执行文件、扩展模块以及配置文件都将安装在/usr/local/apache22/的目录中,其中/usr/local/www/data-dist默认为Apache2的网站目录,当然,仍可以通过修改httpd.conf文件更改此根目录。

4.安装PHP 5

使用如下命令,安装php 5.26以及扩展库:

        #>cd /usr/ports/lang/php5
        #>make config
        #>make install

当输入make config命令时,系统会弹出如图1-72所示的提示。

图1-72

选择“CLI”以及“APACHE”(表示以Apache2模块化安装)命令,以及在开发时需要的GD2、ImageMagick、mbtring、mcrypt等关键的外部扩展库。

然后等待自动下载远程服务器的相关文件包,它会自动编译。

5.Apache 2 Web服务器配置

与在Windows环境下的配置类似,我们需要给Apache 2增加PHP 5的模块解析,代码如下:

        #>cd /usr/local/etc/apache22
        #>ee httpd.conf

上面命令是使用ee编辑器打开httpd.conf文件,在该文件的AddType application/x-gzip .gz .tgz代码后面加入或修改为如下代码,以便PHP解释器解析扩展名为.php的文件。

      AddType application/x-httpd-php .php
      DocumentRoot "/usr/local/www/apache22/data" #网站根目录,可根据需要修改
      <Directory "/usr/local/www/apache22/data">
      Options Indexes FollowSymLinks #限制用户在没有索引页时禁止目录浏览

随后设置网站默认索引页增加一个index.php,在httpd.conf配置文件里编辑,找到以下代码:

        DirectoryIndex index.html index.html.var

将其修改为:

        DirectoryIndex index.html index.php index.htm

6.配置PHP 5

配置PHP,首先将php样本配置文件复制为正式的配置文件。

        #cd /usr/local/etc
        #cp php.ini-recommeded php.ini

在/etc/目录下的rc.conf文件中。编辑FreeBSD的运行服务配置,代码如下:

        #cd /etc
        #ee rc.conf

加入如下代码,让Apache和MySQL在系统启动后也自动启动运行。

        accf_http_load="YES"
        mysqld_enable="YES"
        apache22_enable="YES"

保存文件后,在Shell下使用“reboot”命令重启FreeBSD系统。重新启动后,有两种方法可以测试Apache2是否已经正常工作。可以直接在命令行上进行测试,代码如下所示:

        #>fetch http://localhost/index.html

或在其他与此FreeBSD服务器有网络连通的Windows客户端浏览器上浏览下面网址:

        http://youservername/index.html

如果可以得到或可以浏览网页内容,如“It Works!”字样,代表Apache服务已经运行成功。然后再使用在上例中Vista平台下的两个测试脚本,查看PHP是否成功解析及正常连接MySQL,至此,FreeBSD的PHP开发环境已完全成功。

7.安装Zend Optimizer

在FreeBSD环境下安装Zend Optimizer,可以使用ports安装,我们使用手动方式安装,首先以root用户身份在http://downloads.zend.com上获取最新的Zend Optimizer,在Shell命令行上输入如下命令:

        #>fetch
        http://downloads.zend.com/optimizer/3.3.4/ZendOptimizer-3.3.4-freebsd6.0-i386.tar.gz

我们使用fetch命令取得Zend官方网站远程地址上的文件。Zend Optimizer的版本更新速度很快,一般UNIX环境的版本要比Win32版本新,我们在编写这章内容时安装的是3.3.4版本。

你购买本书的时候,版本可能已经更新,本书光盘中也附带有此安装包,您可以用WinSCP工具上传到服务器端,或下载更新的Zend Optimizer,安装步骤都是相同的,如图1-73所示。

图1-73

下面开始解压并安装该压缩文件包,命令如下:

        tar zxvf ZendOptimizer-3.3.4-freebsd6.0-i386.tar.gz
        cd ZendOptimizer-3.3.4-freebsd6.0-i386

图1-74为压缩包解压后的界面。

图1-74

可以看到该目录下有一个install.sh的Shell脚本,这是Zend的安装程序,直接运行下面命令,开始安装。

        ./install.sh

出现如图1-75所示的安装欢迎界面。

图1-75

安装协议界面如图1-76所示。

图1-76

单击“Yes”按钮进行安装,如图1-77所示。

图1-77

按其默认的安装路径即可,如图1-78所示。

图1-78

下一步,询问php.ini保存的路径,如图1-79所示。

图1-79

选择正确的php.ini路径,使用TAB+空格键,进入下一步,如图1-80所示。

图1-80

询问我们是否使用,单击“Yes”按钮,进入下一步,如图1-81所示。

图1-81

Zend Optimizer安装程序会继续询问Apache控制命令apachectl所在的位置,这里选择的路径是正确的,选择“OK”按钮,进入下一步,如图1-82所示。

图1-82

安装提示:修改原来安装过的php.ini配置文件,并备份为php.ini-zend_optimizer.bak文件,选择“OK”按钮,进入下一步,如图1-83所示。

图1-83

提示安装已经完成,需要重新启动Apache Web Server,选择“OK”按钮,如图1-84所示。

图1-84

选择“Yes”按钮,重启Apache服务,如图1-85所示。

图1-85

上图显示的是Apache正在重新启动的画面,重新启动后,将显示如图1-86所示的画面。

图1-86

出现该画面后,代表Zend Optimizer已经在FreeBSD安装成功,关于脚本测试请参考1.1节的测试与显示部分。

技巧:

在FreeBSD或Linux下重启Apache服务,可以使用如下命令:

        ./apachectl –k restart

该命令需要在Apache安装目录的bin子目录中执行,虽然httpd - k restart或service httpd restar命令同样可用,但是该工具是已经优化的Shell脚本,建议使用。

1.7.5 Linux平台

在Linux下安装Apache 2和PHP 5,需要先到Apache(http://httpd.apache.org)和php(http://www.php.net/downloads.php)网站,下载.tar.gz格式的压缩包。

如果下载的是.tar.bz2格式的压缩包,使用tar命令解压时请使用“tar xfj filename.tar.bz2”的参数格式进行解压缩。

建议把诸如http-2.2.14.tar.gz和php-5.2.9.tar.gz等安装包下载并保存到/usr/software下,或者你喜欢的目录里,以方便管理和安装。

下面我们以CentOS为例,开始PHP环境的安装进程。

1.安装MySQL 5.1

① 安装mysql-5.1.41

首先使用tar工具解压缩:

        #tar zxvf mysql-5.1.41.tar.gz

配置Makefile文件:

      #cd mysql-5.1.41
      #CC=gcc   CFLAGS="-O3"   CXX=gcc   CXXFLAGS="-O3   -felide-constructors   -fno-exceptions
  -fno-rtti"   ./configure   --prefix=/usr/local/mysql   --localstatedir=/usr/local/mysql/data
  --enable-thread-safe-client               --enable-assembler               --with-big-tables
  --with-client-ldflags=-all-static  --with-mysqld-ldflags=-all-static    --with-charset=utf8
  --with-collation=utf8_general_ci --with-extra-charsets=complex --with-plugins=max

编译源码,并安装:

      #make
      #make install

复制默认全局启动参数配置文件到/etc目录:

      #cp ./support-files/my-medium.cnf  /etc/my.cnf

初始化授权表:

      #./scripts/mysql_install_db --user=mysql

设置开机自启动服务控制脚本,复制启动脚本到资源目录:

      #cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld

增加mysqld服务控制脚本执行权限:

      #chmod +x /etc/rc.d/init.d/mysqld

将mysqld服务加入到系统服务:

      #chkconfig --add mysqld

启动/停止MySQL进程:

      service mysqld start
      service mysqld stop

重启mysqld服务:

      service mysqld restart

② 测试安装

        #/usr/local/mysql/bin/mysqladmin ping
        #/usr/local/mysql/bin/mysqladmin version
        #/usr/local/mysql/bin/mysql

③ 添加root密码

    #/usr/local/mysql/bin/mysqladmin -uroot -p

④ 安装zlib-1.2.3

    #tar zxvf zlib-1.2.3.tar.gz
    #cd zlib-1.2.3
    #./configure --prefix=/usr/local/zlib
    #make
    #make install

2.安装Apache 2.2.14

下面是安装Apache 2.2.4的编译安装以及配置步骤:

    #tar zxvf httpd-2.2.14.tar.gz
    #cd httpd-2.2.14
    #./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd --enable-so
    --enable-track-vars --enable-rewrite --with-z-dir=/usr/local/zlib
    #make
    #make install

设置当Linux系统引导时也同时启动Apache的服务:

    #echo "/usr/local/apache/bin/apachectl start" >> /etc/rc.d/rc.local

下面需要安装GD模块以及关联的模块扩展库,以便在生成图片时,可以生成相关格式的图片文件。

① 安装libpng-1.2.14

    #tar zxvf libpng-1.2.14.tar.gz
    #cd libpng-1.2.14
    #cp scripts/makefile.linux makefile
    #make
    #make install

等待编译安装完成。

② 安装freetype-2.1.10

    #tar -zvxf freetype-2.1.10.tar.gz
    #cd freetype-2.1.10
    #mkdir -p /usr/local/freetype
    #./configure --prefix=/usr/local/freetype
    #make;make install

③ 安装jpegsrc.v6b扩展库

jpeg用于生jpeg格式图片,jpeg默认不会自建目录,因此需手动建立目录。

    #mkdir -p /usr/local/jpeg6
    #mkdir -p /usr/local/jpeg6/bin
    #mkdir -p /usr/local/jpeg6/lib
    #mkdir -p /usr/local/jpeg6/include
    #mkdir -p /usr/local/jpeg6/man
    #mkdir -p /usr/local/jpeg6/man1
    #mkdir -p /usr/local/jpeg6/man/man1

建立好目录后,开始安装。

    #tar zxvf jpegsrc.v6b.tar.gz
    #./configure --prefix=/usr/local/jpeg6/ --enable-shared --enable-static
    #make
    #make install
    #make install-lib

④ 安装libxml2-2.6.19

    #tar -zxf libxml2-2.6.19.tar.gz
    #cd libxml2-2.6.19
    #mkdir -p /usr/local/libxml2
    #./configure --prefix=/usr/local/libxml2
    #make
    #make install
    #cp xml2-config /usr/bin

⑤ 安装GD-2.0.33库

        #tar -zvxf gd-2.0.33.tar.gz
        #mkdir -p /usr/local/gd2
        #cd gd-2.0.33
        #./configure --prefix=/usr/local/gd --with-jpeg=/usr/local/jpeg6/
        --with-png=/usr/local/lib/
        --with-zlib=/usr/local/zlib/
        --with-freetype=/usr/local/freetype/
        #make; make install

3.安装php 5.2.9

解压缩PHP 5的软件包,编译并构建PHP 5以及必要的关键扩展库,如mysqli、SOAP以及mbstring等PECL扩展库:

        #tar zvxf php-5.2.9.tar.gz
        # mkdir -p /usr/local/php
        # cd php-5.2.9
        #./configure --prefix=/usr/local/php            (注意使用续行符)
          --with-apxs2=/usr/local/apache/bin/apxs
          --with-mysql-dir=/usr/local/mysql
          --with-xml=/usr/local/libxml2
          --with-png=/usr/local/lib
          --with-jpeg-dir=/usr/local/jpeg6
          --with-zlib=/usr/local/zlib
          --with-freetype=/usr/local/freetype
          --with-gd=/usr/local/gd
          --with-mysql=/usr/local/mysql/bin/mysql_config
          --enable-track-vars
          --enable-soap
          --enable-mbstring=all
        #make
        #make install
        #cp php.ini-dist /usr/local/php/lib/php.ini

编辑apache配置文件httpd.conf。

        #vi /etc/httpd/httpd.conf

要修改以下几处:

找到LoadModule php5_module modules/libphp5.so,把前面的#号去掉(默认已去掉注释),然后在“#AddType application/x-gzip .gz .tgz”下加入下列两行。

        AddType application/x-httpd-php .php

再找到DirectoryIndex index.html后加上“空格+index.php”,把index.php作为默认页。

到这里Apache2服务器的安装就已经完成,下面试启动Apache Web服务器:

        #/usr/local/apache/bin/apachectl start

使用如下命令停止Apache Web服务器:

        #/usr/local/apache/bin/apachectl stop

4.安装Zend Optimizer

我们接下来安装加速引擎Zend Optimizer,可以从Zend网站直接下载Zend Optimizer 3.3.9或使用光盘中的文件进行上传,然后再开始安装编译。

        # wget
        http://downloads.zend.com/optimizer/3.3.9/ZendOptimizer-3.3.9-linux-glibc23-i386.tar.gz
        # tar zxvf ZendOptimizer-3.3.9-linux-glibc23-i386.tar.gz
        # cd ZendOptimizer-3.3.9-linux-glibc23-i386
        # ./install.sh

具体的安装与测试我们可以参考FreeBSD安装一节,这里就不再赘述。至此,LAMP开发环境配置已全部完成。

1.8 PHP配置与初步优化

安装好PHP开发环境后,在配置PHP参数时,还需要注意以下几点:

➢ 在Apache服务器下安装PHP(不管是Win32环境还是在UNIX环境),请使用模块模式安装(即在Apache里加入LoadModule语句的方式安装),而不要使用CGI方式,因为CGI运行速度较慢,CGI方式只有在有运行脚本时,Apache和PHP才开始运行,每次脚本运行时都会重复该操作。

➢ 当使用IIS安装PHP时,请以SAPI方式安装。

➢ 修改php.ini配置文件,不用或用不到的.dll或.so扩展包,请在前加入;号关闭,例如:

        extension=php_mbstring.dll
        ;extension=php_bz2.dll
        extension=php_curl.dll
        ;extension=php_dba.dll
        ;extension=php_dbase.dll

其中,以分号打头的是关闭所在行的扩展。根据需要适当关闭一些不用或不经常用的扩展库,以节省系统的开销。

在本例中,php.ini显示的文件列表是win32环境下的,如果是在UNIX环境下,扩展库文件扩展名应该是xxx.so文件扩展名。

1.9 其他需注意的问题

1.动态加载扩展库

在PHP开发时,如果临时需要一个新扩展库加载,可以使用动态加载方式。

首先看php.ini配置文件。

        enable_dl = On

确认上面的enable_dl的状态置为On,然后在PHP程序中就可以用下列方法:

      dl("gnu_gettext.dll");  //Win32环境下
      dl("gnu_gettext.so");  //Linux或UNIX环境下

使用上面的语法,就可以实现动态的按需调入扩展库,其调入的目录路径根据php.ini中设置的extension_dir装入,从而节约资源,提高程序效率。

➢ 如果不确定该php扩展库是否装入,可用以下代码进行处理:

        if(extension_loaded("gnu_gettext") != true) {
            dl("gnu_gettext.so");
        }

上面代码表示如果要调用的扩展未加载内存时,则立即装入该扩展库。

2.修改显示错误级别

找到php.ini配置文件中error_reporting(错误报告级别)的代码:

        error_reporting  =  E_ALL & ~E_NOTICE

将它修改如下:

        error_reporting =  E_ALL

这样可以避免用户输入错误而使数据丢失。

➢ 将register_globals置为Off(从PHP 5后默认值为Off),这样可以避免自动创建一些根本不需要的变量,以减少不必要的系统开销。

➢ PHP 5默认关闭了短标记(short_tag)

从PHP 5.1.1版本后,php.ini文件的推荐配置有一个重要的地方就是short_open_tag默认值为off,即不支持<?...?>的编码形式,在开发或调试程序时应该注意。

因此,为了程序的规范性和可靠性,在开发时不要再使用<?...?>这样的短标识,应全部改用符合XML样式的<?php…?>的脚本,以符合Web开发标准。

在Windows环境下开发PHP,如果本机端安装了Symantec Norton Anti Virus一类的杀毒软件,需要注意它对PHP服务的影响:有可能它会“善意地”对本地Apache系统环境变量进行替换,如$_SERVER‘[ 'HTTP_REFER']等值都被改为其他乱七八糟的字符串,因此在开发中取不到这些超级变量数组的值。

Symantec本意应该是好的,它的原理是尽可能地将系统中一些不安全的变量删除或修改其名字,但是对PHP开发者则带来了不大不小的麻烦,如果系统安装了同样版本的norton杀毒软件,请注意这点。

如果您还有些完美主义,想在一台电脑上同时拥有Windows和Linux以及FreeBSD环境,那么可以在Windows环境安装VMWare(http://www.vmware.org),然后在VMWare上安装Linux/FreeBSD,这样就可以很方便地了解不同环境下的PHP的开发与配置了。

其他关于PHP的运行性能与安全配置,我们会在后续章节中逐步深入。

1.10 PHP开发工具

编写PHP,简单的只需要Windows记事本就可以了,但为了编写调试方便以及团队开发,使用正确的工具会让我们事半功倍。因此,希望各位在PHP编程路上应该准备好两件事情:一个合理的开发计划和一个好用的PHP编辑器。

编辑器各有其优点和缺点,选择编辑器完全靠个人喜好和习惯,因此每一个编辑器都有自己的粉丝。所以我不想说哪个编辑器是最好的,但是我们应该知道一个好的编辑器应该具备的特性。

➢ 语法高亮

代码中强调不同语句的颜色,可使可读性大为改善。如图1-87所示,左侧是具备高亮功能并有代码折叠功能的Eclipse编辑器,右侧是普通的文本编辑器。

图1-87

➢ 错误检测

在出现简单的语法错误或语句丢失时,编辑器应该能够及时提示,我们不用等到在脚本测试时,在浏览器中寻找错误,根据编辑器提示就可以及时修正错误,如图1-88所示。

图1-88

➢ 函数定位

有时脚本中包含许多函数或方法,点击函数能够立即打开并定位到该函数所在的文件和相应行,在之前可以预览函数或方法的内容。如图1-89所示。

图1-89

➢ 代码完成

当我们输入一个PHP函数或方法时,编辑器会提示并自动完成后续的代码,这不仅让编程速度更快,而且还让我们避免输入时发生错误,如图1-90所示。

图1-90 代码自动完成

下面向大家介绍几款PHP开发工具,以供选择。

1.EditPlus 2

EditPlus是韩国人开发的一款优秀的文本编辑器。优点是轻便小巧,内置对PHP语法的支持,另外也可以编写HTML、Javascript代码等,如图1-91所示。

图1-91

EditPlus下载地址:http://www.editplus.com

2.UltraEdit 32/UEStudio

UltraEdit32是一款强大的编辑工具,除了可以编辑脚本语言外,还可以编辑二进制/十六进制的文件,另外UEStudio是UltraEdit的增强版本,支持语法提示、SVN/CVS等版本控制工具,对PHP开发功能提供了更强的功能,值得一用,如图1-92所示。

图1-92

UltraEdit下载地址:http://www.ultraedit.com/

3.Eclipse

众所周知,这是一款非常强大的开源IDE,首先它是为Java程序员准备的,内置对Java开发的所有功能和类库,具有代码智能特性,可以在需要的时候弹出并显示所有需要的类、方法和参数信息。如果编写PHP,需要下载PDT(PHP Development Tool Kit)的Eclipse,支持PHP代码提示以及本地/远程调试环境,如图1-93所示。

图1-93

图1-93显示了运行的PDT Eclipse,其中左边是在项目中文件的项目视图,下面是类视图,显示所有已经定义的类,中间是代码编辑窗口,可以同时在多个选项卡中打开多个文件,右边是调试和浏览的面板。

Eclipse可以用于Win32和Linux平台,是一个开源免费的跨平台开发工具。另外,PDT Eclipse还有一个派生版本Aptana,也同样适合PHP和Ajax开发。

下载地址:http://www.eclipse.org

http://www.aptana.org/

4.Dreamweaver

Dreamweaver是一个强大的网页设计和编辑工具,它的良好设计界面与代码编辑特点,赢得了各级网站建设者的青睐。Dreamweaver无需有深入的编程经验,就可以建立动态数据库驱动网站,界面如图1-94所示。

图1-94

Dreamweaver的最新版本为CS4,官方下载地址:http://www.adobe.com/downloads/

5.Zend Studio

它来自Zend公司——PHP幕后的精英团队,是一款对PHP支持最完美的强大的工具。它提供所有想在内置库和定制代码中拥有的代码智能特性。它还有非常好的调试功能,而且极易设置。要把代码放到存储库(repository)中,Zend Studio会连接到CVS和Subversion。要把代码放到服务器上,有集成的FTP可以使用。

它包括了编辑、调试,配置PHP程序所需要的客户及服务器组件,支持php项目中的函数自动完成/提示,单步执行,变量跟踪调试器等。这是Zend提供的一款商业软件,提供试用版本,如图1-95所示。

图1-95

ZendStudio下载地址:http://www.zend.com/products/studio/

6.NuSphere PHPED

PHP ED只用于Windows环境。PHPED是这几个IDE中特性最丰富的,它有很好的内部调试器、优秀的数据库访问、较好的代码智能特性以及集成了PHP帮助手册,并为了更容易地访问页面调试,而把调试工具条放到了IE浏览器之内,如图1-86所示。

图1-96

PhpED是付费软件,价格范围从基础版本的119美元到专业版本的495美元,也有免费的试用版本可用,如图1-96所示。

NuSphere PHPEd的下载地址:http://www.nusphere.com/download.php.ide.htm/

7.Netbeans

该开发工具是由Sun公司开发的,支持Java、 PHP、Ruby等多种语言,同时支持多平台的开源集成开发环境,它的最大特点是支持Ajax、UML、WebService,并支持多国语言。开发界面环境如图1-97所示。

图1-97

下载地址:http://php.netbeans.org

上面介绍的几个编辑器可以根据自己的喜好选用,如果在一个团队项目中,则需要统一使用一种工具进行开发,这对代码规范,如缩进、格式等会有一个统一标准。

建议开发时使用Eclipse IDE或Zend Studio,小型项目或调试时使用Uestudio或UltraEdit,页面和模板制作时使用Dreamweaver 8。

另外如果是在UNIX/Linux环境下进行PHP开发,则需要学习UNIX下vi/ee或xemacs等文本编辑器的操作与使用方法。

PHP开发工具还应包括代码调试、版本控制以及源代码管理工具,主要有:xdebug调试工具、CVS或SVN(Subversion)源代码版本控制工具以及项目管理工具,如dotproject。

此外,我们还可准备一本PHP手册,这本手册集成了所有的函数和命令说明,手册有HTML版本和HTML编译的离线版本,可以在官方网站http://www.php.net或本书的官方网站http://www.21cto.com上下载。

建议你使用PHP手册的网络版,它还提供其他程序员提供的建议和代码片断,在你遇到问题的时候,极有可能找到相关的解决方案。所以,Web开发不可能离开网络,如使用Google、百度、专业网站等都是我们程序员工作的良师益友。

1.11 小结

在本章中,我们共同了解了PHP的历史与发展,并由此领略了开放源代码的魅力,还共同了解Apache 2,MySQL和PHP 5在各种主流平台下的配置和安装。

Lerdorf从一个简单的访客计数器开始创造了PHP,继而很快地发展到数据库应用以及可以开发像Yahoo!这样的巨型网站。所有这一切都归功于PHP和MySQL提供的易学且强大的开发工具,能够让我们在较少的时间内掌握并创造出自己的互联网应用。

同时这也是本书最想提供给各位读者的,好的开始是成功的一半。下一章我们将开始正式的PHP编程学习。