PHP扩展没有使用与PHP相同的调试和线程安全性构建
8-10年前,我在windows下构建了许多定制PHP扩展。几年前,我把我所有的网页都搬到了Ubuntu Linux上,我发现我需要创建另一个自定义扩展。这次我将在Ubuntu下进行开发 我创建了一个非常简单的扩展(实际上是一个无操作的扩展),以确保构建过程正常工作。不是 以下是我所做的:PHP扩展没有使用与PHP相同的调试和线程安全性构建,php,php-extension,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扩
- 从Git克隆PHP
- 签出PHP-5.5
- 配置为--disable all--enable debug--enable maintainer zts\
--前缀= - 构建PHP
成功php-i显示:
Zend扩展构建=>API220121212,TS,调试
PHP扩展构建=>API20121212,TS,调试 - 为我的新的非常简单的扩展创建了ext/a1
- 创建了基本扩展(来自Sara Goleman的书)
- 在ext/a1中运行phpize
- 已运行。/configure--enable-a1
- Ran make
生成成功。
已将a1.so复制到扩展目录
phpdir/bin/php-dextension=a1.so-v
失败。结果:
使用内部版本ID=API20121212,NTS编译的模块
编译的PHP,构建ID=API20121212,TS,debug
很明显,我错过了一些基本的东西
非常感谢您的帮助。很难说到底出了什么问题,我只能说扩展是使用不同于php版本的配置构建的 我将描述一些可重复的步骤,如何在PHP源文件夹中使用调试符号编译最基本的扩展。除了由
ext\u 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
当然,在向扩展添加代码后,您将主要在扩展函数中设置断点,而不是在phpmain()
函数中设置断点。然而,这应该显示实现目标的基本步骤
玩得开心!:)
嗯。显然,黑魔法接踵而至;-)那么,我在我的扩展源目录中这样做?是的,在扩展源目录中。我假设您以前在
/path/to/php source
中使用--enable debug
编译过php。(这将创建正确的php配置
脚本)。如果没有,请执行。配置:警告:无法识别的选项:-启用调试配置:错误:找不到php配置。请使用--with php config=PATH我已经确认了php config的路径,并尝试使用和不使用php config文件名。您是对的,配置扩展时,启用调试
选项是不必要的(也是错误的)。使用php配置的--是很重要的。在调试模式下,您是在哪里构建php的?(在哪个文件夹?)PHP源代码位于/Volumes/Data01/VMShares/PhpDevelopment/PHP-src-55中,这就是我构建PHP的地方。我的扩展名位于/Volumes/Data01/VMShares/PhpDevelopment/php-src-55/ext/a1中,这就是我运行phpize和configure的地方。
gdb