Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP扩展没有使用与PHP相同的调试和线程安全性构建_Php_Php Extension - Fatal编程技术网

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

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扩

8-10年前,我在windows下构建了许多定制PHP扩展。几年前,我把我所有的网页都搬到了Ubuntu Linux上,我发现我需要创建另一个自定义扩展。这次我将在Ubuntu下进行开发

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

以下是我所做的:

  • 从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
所以。把我弄糊涂了。根据我读到的内容,phpize命令应该将扩展构建设置与php构建设置相匹配。
很明显,我错过了一些基本的东西


非常感谢您的帮助。

很难说到底出了什么问题,我只能说扩展是使用不同于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
当然,在向扩展添加代码后,您将主要在扩展函数中设置断点,而不是在php
main()
函数中设置断点。然而,这应该显示实现目标的基本步骤

玩得开心!:)


嗯。显然,黑魔法接踵而至;-)那么,我在我的扩展源目录中这样做?是的,在扩展源目录中。我假设您以前在
/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