第一节 环境搭建

在开始学习PHP实现之前, 我们需要一个实验和学习的环境。下面介绍一下怎样在*nix环境下准备和搭建PHP环境。

(*nix指的是类Unix环境,比如各种Linux发行版,FreeBSD, OpenSolaris, Mac OS X等操作系统)

1.获取PHP源码

为了学习PHP的实现,首先需要下载PHP的源代码。下载源码首选是去PHP官方网站http://php.net/downloads.php下载, 如果你喜欢使用svn/git等版本控制软件,也可以使用svn/git来获取最新的源代码。

#svn
cd ~
svn co http://svn.php.net/repository/php/php-src/branches/PHP_5_2 php-src-5.2 #5.2版本
svn co http://svn.php.net/repository/php/php-src/branches/PHP_5_3 php-src-5.3 #5.3版本
 
#git
cd ~
git clone git://github.com/php/php-src.git php-src

笔者比较喜欢用版本控制软件签出代码,这样做的好处是能看到PHP每次修改的内容及日志信息,如果自己修改了其中的某些内容也能快速的查看到 。(当然你还可以试着建立属于自己的源代码分支)

在笔者编写这些内容的时候PHP版本控制是还基于SVN的,上面提到的git镜像地址目前已经没有同步更新了, 由于把svn同步到git会对系统性能造成明显影响,加上社区还没有就到底是否迁移到git达成一致,所以也就停止了更新。 目前很多开源软件都开始转向了分布式版本控制系统(DVCS), 例如Python语言在转向DVCS时对目前的分布式版本控制系统做了一个详细的对比, 如果以前没有接触过,笔者强烈建议试试这些版本控制软件。

2.准备编译环境

在*nix环境下,需要安装编译构建环境。如果你用的是Ubuntu或者是用apt做为包管理的系统,可以通过如下命令快速安装:

sudo apt-get install build-essential

如果你使用的是Mac OS,则需要安装Xcode。Xcode可以在Mac OS X的安装盘中找到,如果你有Apple ID的话, 也可以登陆苹果开发者网站http://developer.apple.com/下载。

3. 编译

下一步可以开始编译了,本文只简单介绍基本的编译过程,不包含Apache的PHP支持以及Mysql等模块的编译。 相关资料请自行查阅相关文档。 如果你是从svn/git签出的代码则需要执行代码根目录的buildconf脚本以生成所需要的构建脚本。

cd ~/php-src
./buildconf

执行完以后就可以开始configure了,configure有很多的参数,比如指定安装目录,是否开启相关模块等选项:

./configure --help # 查看可用参数

为了尽快得到可以测试的环境,我们仅编译一个最精简的PHP。通过执行 ./configure --disable-all来进行配置。 以后如果需要其他功能可以重新编译。如果configure命令出现错误,可能是缺少PHP所依赖的库,各个系统的环境可能不一样。 出现错误可根据出错信息上网搜索。 直到完成configure。configure完成后我们就可以开始编译了。

./configure --disable-all
make

在*nix下编译过程序的读者应该都熟悉经典的configure make,make install吧。执行make之后是否需要make install就取决于你了。 如果install的话最好在configure的时候是用prefix参数指定安装目录, 不建议安装到系统目录, 避免和系统原有的PHP版本冲突。 在make 完以后,在sapi/cli目录里就已经有了php的可以执行文件. 执行一下命令:

./sapi/cli/php -n -v

命令中的-n参数表示不使用php.ini文件,-v参数表示输出版本号,如果命令执行完后看到输出php版本信息则说明编译成功。 如果是make install的话则执行$prefix/bin/php这个路径的php。 当然如果是安装在系统目录或者你的prefix目录在$PATH环境变量里的话,直接执行php就行了。

在只进行make而不make install时,只是编译为可执行二进制文件,所以在终端下执行的php-cli所在路径就是php-src/sapi/cli/php

后续的学习中可能会需要重复configure make 或者 make && make install 这几个步骤。

推荐书籍和参考
看到这有什么想法或疑问?点击这里参与讨论吧!