PHP 扩展未使用与 PHP 相同的调试和线程安全构建
PHP extension not built with same debug and thread safe as PHP
8-10 年前,我在 windows 下构建了许多自定义 PHP 扩展。几年前,我将我所有的 Web 内容迁移到 Ubuntu Linux,发现我需要创建另一个自定义扩展。这次我会在Ubuntu下开发
我创建了一个非常简单的扩展(实际上是一个空操作)只是为了确保构建过程正常运行。不是。
这是我所做的:
- 从 Git
克隆 PHP
- 签出 PHP-5.5
- 配置为 --disable-all --enable-debug --enable-maintainer-zts \
--prefix=
- 建造PHP
成功 php -i 显示:
Zend 扩展构建 => API220121212、TS、调试
PHP 扩展构建 => API20121212,TS,调试
- 为我的新的非常简单的扩展创建 ext/a1
- 创建了基本扩展(来自 Sara Goleman 的书)
- 运行 php在 ext/a1
- 运行 ./configure --enable-a1
- 运行 使
构建成功。
已复制 a1.so 到扩展目录
phpdir/bin/php-扩展=a1.so-v
失败。结果:
使用构建 ID=API20121212,NTS
编译的模块
PHP 使用构建 ID=API20121212、TS、调试进行编译
所以。让我感到困惑。根据我的阅读,phpize 命令应该将扩展构建设置与 php 构建设置相匹配。
我显然在这里遗漏了一些基本的东西。
将不胜感激。
很难说到底出了什么问题,我只能说扩展是使用与 php 版本不同的配置构建的。
我将描述一些可重现的步骤,如何在 PHP 源文件夹中使用调试符号编译最基本的扩展。除了由 ext_skel
创建的一些样板代码外,该扩展不包含任何代码。它只是描述了在 UNIX 上的编译过程。这是一个shell脚本,你可以执行它。
#!/bin/sh
# Should work for all PHP5 versions
VERSION="5.6.9"
# Download the PHP source code
wget \
--continue "http://de2.php.net/get/php-$VERSION.tar.gz/from/this/mirror" \
-O "php-$VERSION".tar.gz
tar xf "php-$VERSION.tar.gz" && cd "php-$VERSION/ext"
# Create a hello extension from skeletons
./ext_skel --extname="hello"
# Uncomment two lines in ext/hello/config.m4
# Read the comments there and you'll know what I'm doing
sed -ri.original \
-e 's/(dnl )(PHP_ARG_ENABLE\(hello)//' \
-e 's/(dnl )(\[ --enable-hello)//' \
hello/config.m4
# Build PHP and the extension
cd ..
./buildconf --force
./configure \
--enable-debug --enable-maintainer-zts \
--enable-hello=shared
make -j
# Test if it is working
sapi/cli/php \
-dextension=modules/hello.so \
-r 'var_dump(extension_loaded("hello"));'
您现在可以开始向 ext/hello/hello.c
输入代码并创建您的扩展程序。如果你想编译你所做的更改,只需发出 make
不带参数。
由于我们使用 --debug
进行编译,您现在可以使用 gdb
调试 C
代码并探索 PHP 的内部工作原理。要启动调试会话,请使用:
gdb sapi/cli/php
...
(gdb) break main
(gdb) run -dextension=modules/hello.so some.php
当然,一旦将代码添加到扩展中,您将主要在扩展函数中设置断点,而不是在 php main()
函数中。但是,这应该显示到达那里的基本步骤。
玩得开心! :)
gdb
8-10 年前,我在 windows 下构建了许多自定义 PHP 扩展。几年前,我将我所有的 Web 内容迁移到 Ubuntu Linux,发现我需要创建另一个自定义扩展。这次我会在Ubuntu下开发
我创建了一个非常简单的扩展(实际上是一个空操作)只是为了确保构建过程正常运行。不是。
这是我所做的:
- 从 Git 克隆 PHP
- 签出 PHP-5.5
- 配置为 --disable-all --enable-debug --enable-maintainer-zts \
--prefix= - 建造PHP
成功 php -i 显示:
Zend 扩展构建 => API220121212、TS、调试
PHP 扩展构建 => API20121212,TS,调试 - 为我的新的非常简单的扩展创建 ext/a1
- 创建了基本扩展(来自 Sara Goleman 的书)
- 运行 php在 ext/a1
- 运行 ./configure --enable-a1
- 运行 使
构建成功。
已复制 a1.so 到扩展目录
phpdir/bin/php-扩展=a1.so-v
失败。结果:
使用构建 ID=API20121212,NTS
编译的模块 PHP 使用构建 ID=API20121212、TS、调试进行编译
所以。让我感到困惑。根据我的阅读,phpize 命令应该将扩展构建设置与 php 构建设置相匹配。
我显然在这里遗漏了一些基本的东西。
将不胜感激。
很难说到底出了什么问题,我只能说扩展是使用与 php 版本不同的配置构建的。
我将描述一些可重现的步骤,如何在 PHP 源文件夹中使用调试符号编译最基本的扩展。除了由 ext_skel
创建的一些样板代码外,该扩展不包含任何代码。它只是描述了在 UNIX 上的编译过程。这是一个shell脚本,你可以执行它。
#!/bin/sh
# Should work for all PHP5 versions
VERSION="5.6.9"
# Download the PHP source code
wget \
--continue "http://de2.php.net/get/php-$VERSION.tar.gz/from/this/mirror" \
-O "php-$VERSION".tar.gz
tar xf "php-$VERSION.tar.gz" && cd "php-$VERSION/ext"
# Create a hello extension from skeletons
./ext_skel --extname="hello"
# Uncomment two lines in ext/hello/config.m4
# Read the comments there and you'll know what I'm doing
sed -ri.original \
-e 's/(dnl )(PHP_ARG_ENABLE\(hello)//' \
-e 's/(dnl )(\[ --enable-hello)//' \
hello/config.m4
# Build PHP and the extension
cd ..
./buildconf --force
./configure \
--enable-debug --enable-maintainer-zts \
--enable-hello=shared
make -j
# Test if it is working
sapi/cli/php \
-dextension=modules/hello.so \
-r 'var_dump(extension_loaded("hello"));'
您现在可以开始向 ext/hello/hello.c
输入代码并创建您的扩展程序。如果你想编译你所做的更改,只需发出 make
不带参数。
由于我们使用 --debug
进行编译,您现在可以使用 gdb
调试 C
代码并探索 PHP 的内部工作原理。要启动调试会话,请使用:
gdb sapi/cli/php
...
(gdb) break main
(gdb) run -dextension=modules/hello.so some.php
当然,一旦将代码添加到扩展中,您将主要在扩展函数中设置断点,而不是在 php main()
函数中。但是,这应该显示到达那里的基本步骤。
玩得开心! :)
gdb