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

时间:2015-06-06 00:12:39

标签: php php-extension

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

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

这就是我所做的:

  • 从Git克隆的PHP
  • 签出了PHP-5.5
  • 配置--disable-all --enable-debug --enable-maintainer-zts \
    前缀=
  • 构建PHP
    成功php -i显示:
    Zend Extension Build => API220121212,TS,调试
    PHP Extension Build => API20121212,TS,debug
  • 为我新的,非常简单的扩展
  • 创建了ext / a1
  • 创建基本扩展(来自Sara Goleman的书)
  • 在ext / a1
  • 中运行phpize
  • Ran ./configure --enable-a1
  • Ran make
    建设成功。
    将a1.so复制到extensions目录
    phpdir / bin / php -dextension = a1.so -v
    失败。结果:
    使用build ID = API20121212,NTS编译的模块 用build ID = API20121212,TS,debug
  • 编译的PHP

因此。让我困惑的颜色。根据我所读到的,phpize命令应该与扩展构建设置匹配到php构建设置 我显然错过了某处基本的东西。

非常感谢帮助。

1 个答案:

答案 0 :(得分:1)

很难说究竟出了什么问题,我只能说扩展是使用与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)/\2/' \
    -e 's/(dnl )(\[  --enable-hello)/\2/' \
    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