php - 如何在 php8.0 中编译 php 模块,该模块在 php7 中使用 TSRMLS_CC,但在 php8.0 中已弃用

标签 php php-extension php-8

我有一个为 php7 构建的 php 模块,我认为 php5 也是如此,但是在 php8.0 中,当我尝试运行 make 时,我得到一长串错误列表,因为 TSRMLS_CC 已被弃用.

显示的错误如下所示:

/home/appie/Downloads/php-sweph/sweph.c: In function ‘zif_swe_calc_ut’:
/home/appie/Downloads/php-sweph/sweph.c:512:44: error: expected ‘)’ before ‘TSRMLS_CC’
  512 |  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "dll",
      |                                            ^~~~~~~~~
/home/appie/Downloads/php-sweph/sweph.c:512:6: error: too few arguments to function ‘zend_parse_parameters’
  512 |  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "dll",

我有很多使用这个 TSRMLS_CC 的函数,它们看起来都是这样的:

PHP_FUNCTION(swe_calc_ut)
{
    char *arg = NULL;
    int rc;
    long ipl, iflag;
    double tjd_ut, xx[6];
    char serr[AS_MAXCH]; 
    int i;

    if(ZEND_NUM_ARGS() != 3) WRONG_PARAM_COUNT;
    
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "dll",
            &tjd_ut, &ipl, &iflag) == FAILURE) {
        return;
    }

    rc = swe_calc_ut(tjd_ut, (int)ipl, (int)iflag, xx, serr);

    /* create an array */
    array_init(return_value);
    for(i = 0; i < 6; i++)
        add_index_double(return_value, i, xx[i]);
        add_assoc_string(return_value, "serr", serr);
        add_assoc_long(return_value, "rc", rc);
    }

我的第一个想法是,如果我删除 TSRMLS_CC 会发生什么。删除后,编译完成,我可以将模块安装到 apache 中。基本上该模块现在工作没有问题,但在 apache2 的日志中。我从所有使用 TSRMLS_CC 的函数中收到一长串警告。

它们看起来像:

PHP Warning:  Missing arginfo for swe_calc() in Unknown on line 0
PHP Warning:  Missing arginfo for swe_calc_ut() in Unknown on line 0
PHP Warning:  Missing arginfo for swe_fixstar() in Unknown on line 0

我如何摆脱警告,TSRMLS_CC 有替代方案吗?我试图理解它,但还无法解决它。

最佳答案

内部更改的摘要始终可以在 UPGRADING.INTERNALS 中找到。 PHP 源代码中的文件。

您遇到的两个更改不相关:

  • TSRMLS_CC 是线程安全资源管理器的一部分,线程本地存储的实现用于为多线程环境构建 PHP。它已被删除,因为存在新的机制可以更透明地完成相同的事情。您可以安全地从扩展程序中删除所有对 TSRMLS_* 的使用,除非您需要保留 PHP 5 支持。
  • arginfo 是有关用于反射的函数参数名称和类型的信息。它曾经是可选的,但现在是必需的,部分原因是为了使所有函数都可以使用新的命名参数语法进行调用。生成它的最简单方法是编写“ stub ”PHP 定义 - 具有正确签名但没有实现的空 PHP 函数,类似于您可能定义的在 IDE 中自动完成工作的函数。然后您可以将该 PHP 文件传递​​给 gen-stub.php脚本。这就是现在管理所有捆绑 PHP 扩展的 arginfo 的方式,因此如果您查看源代码,您可以找到很多示例,包括 the skeleton extension 中的示例。 .

关于php - 如何在 php8.0 中编译 php 模块,该模块在 php7 中使用 TSRMLS_CC,但在 php8.0 中已弃用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66194531/

相关文章:

php - 插入相同手机号码的不同查询?

php - ORDER 查询 BY 两个变量 : sum() and date

php - 适用于 Windows 的 zeromq php 扩展

php - 如何在 pecl zip 安装操作(使用旧版本的 PHP)中跟踪编译错误的原因?

php - 在从源代码编译的 PHP 7.1 上安装 SPL_Types

php - 如何为构造函数指定 void 返回类型

php - 微软从 PHP 8 开始终止对 PHP 的支持

php - 将上传图像的路径更新到数据库中

php - 捕获未知的命名参数错误

php - 连接表但产生嵌套结果的更有效方法?