首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP扩展没有构建与PHP相同的调试和线程安全

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

Stack Overflow用户
提问于 2015-06-06 00:12:38
回答 1查看 1.4K关注 0票数 1

我在8-10年前在windows下构建了许多自定义PHP扩展。几年前,我开始使用Ubuntu来处理我所有的网页内容,我发现我需要创建另一个自定义扩展。这次我将在Ubuntu下进行开发。

我创建了一个非常简单的扩展(实际上是一个没有操作的扩展),只是为了确保构建过程正常工作。事实并非如此。

以下是我所做的:

  • 从Git克隆PHP
  • 签出PHP-5.5
  • 配置--禁用所有--启用-调试--启用-维护器-zts\ -前缀=
  • 构建PHP Success php -i显示: => API220121212,TS,调试 PHP扩展构建=> API20121212,TS,调试
  • 为我的新的非常简单的扩展创建ext/a1
  • 创建了基本的扩展(从Sara Goleman的书)
  • ext/a1中的Ran phpize
  • Ran ./配置--启用-A1
  • Ran制造 建造是成功的。 将a1.so复制到扩展目录中 phpdir/bin/php -dextension=a1.so -v 失败了。在以下方面的成果: 用build ID=API20121212、NTS编译的模块 使用build ID=API20121212、TS、debug编译

所以。给我涂上迷糊。根据我所读到的,phpize命令应该将扩展构建设置与php构建设置匹配。

我显然错过了一些最基本的东西。

我们将非常感谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-06 00:29:20

很难说到底出了什么问题,我只能说扩展是使用与php版本不同的配置构建的。

我将描述一些可重复的步骤,如何在PHP源代码文件夹中使用调试符号编译一个最基本的扩展。除了一些由ext_skel创建的样板代码外,扩展不包含任何代码。它只是描述了UNIX上的编译过程。它是一个shell脚本,您可以执行它。

代码语言:javascript
复制
#!/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代码,并探索C内部的工作方式。要启动调试会话,请使用:

代码语言:javascript
复制
gdb sapi/cli/php
...
(gdb) break main
(gdb) run -dextension=modules/hello.so some.php

当然,一旦向扩展添加了代码,大多数情况下都会在扩展函数中设置断点,而不是在php main()函数中设置断点。然而,这应该说明了实现这一目标的基本步骤。

玩得开心!:)

代码语言:javascript
复制
gdb
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30677570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档