PHP 扩展未使用与 PHP 相同的调试和线程安全构建

PHP extension not built with same debug and thread safe as PHP

8-10 年前,我在 windows 下构建了许多自定义 PHP 扩展。几年前,我将我所有的 Web 内容迁移到 Ubuntu Linux,发现我需要创建另一个自定义扩展。这次我会在Ubuntu下开发

我创建了一个非常简单的扩展(实际上是一个空操作)只是为了确保构建过程正常运行。不是。

这是我所做的:

所以。让我感到困惑。根据我的阅读,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