# 4.1 动手编译PHP
从一个PHP程序猿,到一个想为PHP开发扩展的程序猿,此间的进化有一步是跳不过去的,那就是你必须熟知如何编译PHP的源码。
### *nix Tools
C语言的编译器是我们使用C语言的必备工具,你的系统应该已经自带了一种C语言的编译器,而且它极有可能是大名鼎鼎的GCC。通过检测你本机gcc或者cc程序的版本,可以很方便的知道你机器上是否已经安装的某种C语言的编译器。
````shell
walu@walu-ThinkPad-Edge:~$ gcc --version
gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
````
如果你还没有安装编译器,那你需要安装一个。最简单的办法便是去下载一个与你系统相符的rpm或者deb包,当然你也可以通过以下命令的一种来方便的安装:yum install gcc, apt-get install gcc, pkg-add -r gcc, 或者 emerge gcc.
除了编译器,你还需要以下程序:make, autoconf, automake, 和libtool。说实话,我连autoconf现在是啥还不知道(截至到现在,2011年9月6号),不过除非RP太低,一般系统中都会自备了,而且phpize程序会把这些需要的脚本给生成好的。
对于编译需要的程序以及它们的版本我们可以在PHP官网找到最新的答案:
<ul>
<li>autoconf: 2.13 (2.59+ for PHP 5.4+)</li>
<li>automake: 1.4+</li>
<li>libtool: 1.4.x+ (except 1.4.2)</li>
<li>bison: 1.28, 1.35, 1.75, 2.0 or higher</li>
<li>flex (PHP 5.2 and earlier): 2.5.4 (not higher)</li>
<li>re2c: 0.13.4+</li>
</ul>
你千万不要被上面的清单给吓着,其实系统应该给装备好了,除非真RP低,那你出门去买张彩票吧... ...
当然,我们也可以通过SVN从PHP源码库里导出一份源码,需要注意的是,PHP的svn源码库地址是https协议的。官方推荐我们直接签出它的php-src目录:
````shell
$ svn checkout https://svn.php.net/repository/php/php-src --depth immediates php-src
$ cd php-src
````
当然,我们也可以签出特定的版本:
<ul>
<li>PHP 5.3: svn checkout https://svn.php.net/repository/php/php-src/branches/PHP_5_3 php-src-5.3 </li>
<li>PHP 5.4: svn checkout https://svn.php.net/repository/php/php-src/branches/PHP_5_4 php-src-5.4 </li>
<li>PHP HEAD: svn checkout https://svn.php.net/repository/php/php-src/trunk php-src-trunk </li>
</ul>
最新的大家可以来这查看:http://php.net/svn.php
### Win32 Tools
这里仅代表作者05年的观点,我还没有在win平台下测试过,稍後会把这段修正过来。
<pre>
The Win32/PHP5 build system is a complete rewrite and represents a significant leap forward from the PHP4 build system. Instructions for compiling PHP4 under Windows are available on php.net, only the PHP5 build systemwhich requires Windows 2000, Windows 2003, or Windows XPwill be discussed here.
First, you'll need to grab libraries and development headers used by many of the core PHP extensions. Fortunately, many of these files are redistributed from php.net as a single .zip file located at http://www.php.net/extra/win32build.zip.
Create a new directory named C:\PHPDEV\ and unzip win32build.zip using your favorite zip management program into this location. The folder structure contained in the zip file will create a subdirectory, C:\PHPDEV\win32build, which will contain further subfolders and files. It's not necessary to name your root folder PHPDEV; the only important thing is that win32build and the PHP source tree are both children of the same parent folder.
Next you'll need a compiler. If you've already got Visual C++ .NET you have what you need; otherwise, download Visual C++ Express from Microsoft at http://lab.msdn.microsoft.com/express/.
The installer, once you've downloaded and run it, will display the usual welcome, EULA (End-User License Agreement), and identification dialogs. Read through these screens and proceed using the Next buttons after you've agreed to the terms of the EULA and entered any appropriate information.
Installation location is of course up to you, and a typical installation will work just fine. If you'd like to create a leaner installation, you may deselect the three optional componentsGUI, MSDN, and SQL Server.
The final package is the Platform SDK, also available for download from Microsoft at http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5. The site currently lists three download options: PSDK-x86.exe, PSDK-ia64.exe, and PSDK-amd64.exe. These options refer to x86 compatible 32bit, Intel64bit, and AMD64bit processors respectively. If you're not sure which one applies to your processor, select PSDK-x86.exe, which should work cleanly, albeit less efficiently, with both 64 bit variants.
As before, proceed through the first few screens as you would with any other installer package until you are prompted to select between Typical and Custom installation. A Typical installation includes the Core SDK package, which is sufficient for the purposes of building PHP. Other packages can be deselected by choosing a Custom installation, but if you have the hard disk space to spare, you might as well install it all. The other packages may come in handy later on.
So unless you're byte conscious, select Typical and proceed through the next couple of standard issue screens until the installer begins copying and registering files. This process should take a few minutes so grab some popcorn.
Once installation is complete you'll have a new item on your Start menuMicrosoft Platform SDK for Windows Server 2003 SP1.
</pre>
### 获取PHP源码
其实你有很多办法安装PHP,最简单的一种就是从你系统的库或者源里通过apt-get、yum install之类的命令直接安装PHP5,这样做的好处你的系统可能会自动处理一些php在它上面的工作时的一些bug,而且你还可以方便的升级与卸载。这样做也有缺点,那就是你的PHP版本永远无法是最新的,通常www.php.net发布数周甚至数月后你才能用上相应的版本。
第二种方法:也是推荐使用的一种方法,那就是自行下载php-x.y.z.tar.gz的源码包,然后自行编译安装。这种包一般都是经过了海量的测试后才发布的,而且非常接近最新beta或者alpha版本。
此外,你还可以snaps.php.net提供的快照包来下载php进行编译安装,这个站点每几个小时便会从源码库里打包出一份新的PHP。不过从这取得的包可能会因为某个未经完整测试的代码提交而使PHP工作不正常。但是如果你想研究下PHP6.0的进展,这里绝对是你方便获取它的地方。
最后,你可以直接从版本库中导出此时此刻的源码。作为一个扩展开发者,从版本库或者snaps中获取php看起来并没有多大的作用,但是如果我们要将这个扩展推送到版本库中时,便需要熟练的掌握checkout和checkin的步骤了。签出的地址在上面已经说过了。
## links
* 4 [动手编译PHP](<4.md>)
* 4.2 [PHP编译前的config配置](<4.2.md>)
- about
- 开始阅读
- 目录
- 1 PHP的生命周期
- 1.让我们从SAPI开始
- 2.PHP的启动与终止
- 3.PHP的生命周期
- 4.线程安全
- 5.小结
- 2 PHP变量在内核中的实现
- 1. 变量的类型
- 2. 变量的值
- 3. 创建PHP变量
- 4. 变量的存储方式
- 5. 变量的检索
- 6. 类型转换
- 7. 小结
- 3 内存管理
- 1. 内存管理
- 2. 引用计数
- 3. 总结
- 4 动手编译PHP
- 1. 编译前的准备
- 2. PHP编译前的config配置
- 3. Unix/Linux平台下的编译
- 4. 在Win32平台上编译PHP
- 5. 小结
- 5 Your First Extension
- 1. 一个扩展的基本结构
- 2. 编译我们的扩展
- 3. 静态编译
- 4. 编写函数
- 5. 小结
- 6 函数返回值
- 1. 一个特殊的参数:return_value
- 2. 引用与函数的执行结果
- 3. 小结
- 7 函数的参数
- 1. zend_parse_parameters
- 2. Arg Info 与类型绑定
- 3. 小结
- 8 使用HashTable与{数组}
- 1. 数组(C中的)与链表
- 2. 操作HashTable的API
- 3. 在内核中操作PHP语言中数组
- 4. 小结
- 9 PHP中的资源类型
- 1. 复合类型的数据——{资源}
- 2. Persistent Resources
- 3. {资源}自有的引用计数
- 4. 小结
- 10 PHP中的面向对象(一)
- 1. zend_class_entry
- 2. 定义一个类
- 3. 定义一个接口
- 4. 类的继承与接口的实现
- 5. 小结
- 11 PHP中的面向对象(二)
- 1. 生成对象的实例与调用方法
- 2. 读写对象的属性
- 3. 小结
- 12 启动与终止的那点事
- 2. 小结
- 1. 关于生命周期
- 2. MINFO与phpinfo
- 3. 常量
- 4. PHP扩展中的全局变量
- 5. PHP语言中的超级全局变量
- 6. 小结
- 13 INI设置
- 1. 声明和访问ini设置
- 2. 小结
- 2. 小结
- 14 流式访问
- 1. 概览
- 2. 打开流
- 3. 访问流
- 4. 静态资源操作
- 5. 小结
- 15 流的实现
- 1. php流的表象之下
- 2. 包装器操作
- 3. 实现一个包装器
- 4. 操纵
- 5. 检查
- 6. 小结
- 16 有趣的流
- 1. 上下文
- 2. 过滤器
- 3. 小结
- 17 配置和链接
- 1. autoconf
- 2. 库的查找
- 3. 强制模块依赖
- 4. Windows方言
- 5. 小结
- 18 扩展生成
- 1. ext_skel
- 2. PECL_Gen
- 3. 小结
- 19 设置宿主环境
- 1. 嵌入式SAPI
- 2. 构建并编译一个宿主应用
- 3. 通过嵌入包装重新创建cli
- 4. 老技术新用
- 5. 小结
- 20 高级嵌入式
- 1. 回调到php中
- 2. 错误处理
- 3. 初始化php
- 4. 覆写INI_SYSTEM和INI_PERDIR选项
- 5. 捕获输出
- 6. 同时扩展和嵌入
- 7. 小结
- 约定