PHP 及 PHP 插件编译

PHP 及 PHP 插件编译

图源:《明日方舟》 战场背景 2

本文 ID:23166645-ab98-11e9-ad68-d1f5f7d77a33


今后文章会同步更新在 我的 CSDN 博客,但是还是以这个自己拿阿里云服务器搭建的网站为主的。不过 CSDN 有个好处是可以被国内的搜索引擎抓取到,嗯,省得我做搜索引擎优化了啊。

如果有人只想看完整写完的文章的话,也请左拐 CSDN,或者 这里。主站开了七牛云加速,顺便做了 Google 、 Bing 和百度等的搜索引擎收录。最近身体欠佳。原定的学习计划和博客更新计划也不出意外的咕了。没有办法。健康是第一要务。等待过后慢慢去补吧。

编译 PHP

安装必要环境

包含编译器,和编译需要的库。所有的编译操作均在 Ubuntu 19.04 下进行。

1
2
sudo apt-get update
sudo apt install -y gcc g++ cmake make libxml2-dev libbz2-dev libcurl4-gnutls-dev libzip-dev libwebp-dev libpng-dev libjpeg-dev libxpm-dev libfreetype6-dev

下载源码

你可以 clone GitHub 上的代码:

1
git clone https://github.com/php/php-src.git

当然也可以到 php.net 下载源码并解压:

1
2
3
4
wget https://www.php.net/distributions/php-7.3.7.tar.gz
tar -xvzf php-7.3.7.tar.gz
rm php-7.3.7.tar.gz
cd php-7.3.7/

开始编译

首先读取插件列表(插件列表没有修改的时候可跳过此步骤):

1
./buildconf --force

然后进行基本配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
mkdir phpbin
./configure \
--prefix=~/Document/phpbin \ # 是非程序文件 install 的位置
--exec-prefix=~/Document/phpbin \ # 是程序文件 install 的位置
--enable-fpm \
--enable-cli \
--enable-embed=shared \
--enable-phpdbg \
--enable-phpdbg-webhelper \
--enable-phpdbg-debug \
--enable-debug \
--enable-bcmath \
--enable-calendar \
--enable-exif \
--enable-ftp \
--enable-intl \
--enable-mbstring \
--with-curl \
--enable-embedded-mysqli \
--enable-pcntl \
--enable-shmop \
--enable-soap \
--enable-sockets \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--enable-wddx \
--enable-zip \
--with-zlib \
--with-zlib-dir \
--with-pcre-jit \
--with-pcre-regex \
--with-iconv \
--enable-mysqlnd \
--enable-pdo \
--enable-hash \
--enable-ctype \
--enable-json \
--enable-session \
--enable-xml \
--enable-libxml \
--enable-simplexml \
--enable-fileinfo \
--with-openssl \
--with-gd \
--with-webp-dir \
--with-jpeg-dir \
--with-png-dir \
--with-xpm-dir

随后手动修改 Makefile,手动将CFLAGS_CLEAN 改成如下内容:

1
CFLAGS_CLEAN = -I/usr/include -g -O0 -Wall $(PROF_FLAGS)

最后,开始多线程编译:

1
2
make all -j8
make install

php 程序主文件在 ~/Document/phpbin/bin/php 处。

生成插件

生成插件需使用刚刚编译好的 php 可执行文件。当然你也可以额外在系统中安装一套 php(环境)以备不时之需。

1
sudo apt install -y apache2 php7 php-xdebug mysql-server mysql-client

随后到 php 源码文件夹、ext 文件夹下,运行

1
php ./ext_skel.php --ext hello_obj

如果已知插件应用的平台的话,可以加上 --onlyunix--onlywindows 避免生成其他平台的 config 文件。

config.m4 文件中,注意前面的编译命令部分,如果你的插件是独立的,取消掉下面两行的注释(dnl):

1
2
PHP_ARG_ENABLE(hello_obj, whether to enable hello_obj support,
[--enable-hello_obj Enable hello_obj support], no)

但是如果你的插件依赖了其他插件的代码(头文件等),你需要保持上面两行的注释并取消下面两行的注释:

1
2
PHP_ARG_WITH(hello_obj, for hello_obj support,
[--with-hello_obj Include hello_obj support])

注意,不同段的注释要保证对齐。

编译插件

最常见的两种方法:重新编译 php 本体和使用 phpize 单独编译插件。

编译 php 本体的办法很简单,即在 ./configure 步骤处看情况加入 --enable-hello_obj--with-hello_obj 参数即可。这种情况下,当没有 php.ini 配置文件时,插件是默认启用的,利用

1
php -r "phpinfo();"

命令可以查看 phpinfo()输出信息。

用 phpize 的话,请注意使用 你编译 PHP 时 prefix 指定的目录下的 phpize(~/Document/phpbin/bin/phpize),保证版本一致。

cd到插件源码所在的目录,运行phpsize,会生成编译所需文件。

随后执行

1
./configure --with-php-config=<php-config bin>

其中 php-config bin 为 你编译 PHP 时 prefix 指定的目录下的 php-config(~/Document/phpbin/bin/php-config)

编译并安装。

1
2
make
make install

.so 文件会自动复制到插件文件夹。在 php.ini 中加载插件即可。

1
extension=hello_obj.so

当然,你也可以用 phpize 编译安装 Xdebug 等外置 php 插件。

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×