如何从源代码编译PHP

一、下载源代码

PHP 在 Github 上的官方仓库:github.com/php/php-src

从 Github 拉取 PHP 的源代码,并把当前分支切换到 PHP-7.4.29(这是我目前使用的版本),默认拉取下来的是 master 分支。

git clone https://github.com/php/php-src.git
cd php-src/
git checkout PHP-7.4.29

二、编译前的工具

  • gcc,(GNU Compiler Collection)GNU 编译套件。

    • GCC 原名为 GNU C 语言编译器(GNU C Compiler),只能处理 C 语言。但之后不断扩展,变得可处理 C++,后来又扩展为能够支持更多编程语言,如 Fortran、Objective-C、Go 等多种语言,所以改名 GNU 编译器套件(GNU Compiler Collection)。
    • 用于将 C 语言代码编译为汇编,再转为机器码(0101),连接并生成 CPU 可执行的程序。
  • libc-dev

    • GNU C Library,包含了编译和连接 C 语言代码所需的符号链接、头文件、二进制代码。
  • make,这是 PHP 使用的构建管理工具。

  • autoconf,用于生成 configure 脚本。

  • libtool,帮助管理共享库。

  • bison,用于生成 PHP 解析器。

  • re2c,用于生成 PHP 词法解析器。当从 Git 仓库构建 PHP 时,re2c 词法生成器曾是可选的依赖项。在 PHP > 7.3 分支上,Git 仓库不再捆绑生成词法分析器文件。

  • libxml2-dev,XML 解析库。

  • sqlite3,本地轻量数据库。可能 Ubuntu 中的版本比较旧,需要自行去 Sqlite 官网下载 编译安装。
    在 Ubuntu 系统中可以通过以下命令来安装缺失的工具:

sudo apt install bison re2c libxml2-dev sqlite3

三、编译并安装 PHP

执行下面两条命令来设置构建选项。

./buildconf

# PHP 源码默认是 /usr/local,Ubuntu 源默认是 /usr
PREFIX=$HOME/php7.4

./configure \
--prefix=$PREFIX \
--mandir=$PREFIX/share/man \
--infodir=$PREFIX/share/info \
--with-config-file-path=$PREFIX/etc/php/cli \
--with-config-file-scan-dir=$PREFIX/etc/php/cli/conf.d

具体有哪些选项可以使用 ./configure -h 查看。

默认在执行 make install 的时候会把 PHP 安装到目录 /usr/local 中,其中可执行文件是放在 /usr/local/bin 中,头文件是放在 /usr/local/lib 中 。如果要修改可以设置选项 --prefix=$HOME/php7.4

执行 make 来构建

make -j6

可以通过 make -h 来查看构建选项。

构建时可以设置 -j 参数(jobs),此参数可以指定构建的进程数,以此来加快构建。进程数尽量不超过 CPU 的核心数。

编译完成后,可以先测试一下编译结果。测试也可以设置多个进程。当然测试会比较花时间,差不多15分钟左右。

make TEST_PHP_ARGS=-j6 test

编译(并测试)好之后,可以运行以下命令将 PHP 安装到系统中,安装的位置是之前我们在 ./configure 选项中配置的位置。

sudo make install

安装完成之后可以在主目录下看到这样一个目录结构:

~/php7.4/
  ├─ bin/
  │  │─ php
  │  │─ php-config
  │  └─ ...
  │
  ├─ etc/
  │  └─ php/
  │     │─ cli/
  │     └─ conf.d/
  │
  ├─ include/
  │  └─ php/
  │
  ├─ lib/
  │  └─ php/
  │     └─ extensions/
  │
  └─ share/
     └─ man/
        └─ man1/

运行我们手动编译安装的 PHP

~$ ./php7.4/bin/php --version
PHP 7.4.29-dev (cli) (built: Apr 18 2022 15:51:50) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies

如果想直接使用 php --version 而不带完整路径的话,可以把 ~/php7.4/bin 目录加入到 $PATH 环境变量中。

echo 'PATH="$HOME/php7.4/bin:$PATH"' >> ~/.profile
source ~/.profile

当然也可以在 /usr/local/bin 目录中创建一个符号链接,指向 ~/php7.4/bin/php

sudo ln -s $HOME/php7.4/bin/php /usr/local/bin/php

至此,我们完成了从源码编译安装 PHP。

四、其他 configure 构建选项说明

  • 选项 --disable-all 会创建一个包含最少扩展的构建
~$ ./php7.4/bin/php -m
[PHP Modules]
Core
date
pcre
Reflection
SPL
standard
本作品采用《CC 协议》,转载必须注明作者和本文链接
xiaer
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!