【问题标题】:How to compile php module in php8.0 that used to use TSRMLS_CC in php7, but is deprecated in php8.0如何在 php8.0 中编译 php 模块,该模块曾经在 php7 中使用 TSRMLS_CC,但在 php8.0 中已弃用
【发布时间】:2021-02-14 10:39:40
【问题描述】:

我有一个为 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 是否有替代方案?我正在尝试理解它,但还没有解决它。

【问题讨论】:

    标签: php php-extension php-8


    【解决方案1】:

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

    你遇到的两个变化是无关的:

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

    【讨论】:

    • 如何编写 stub php 定义以及如何使用/运行 gen-stub.php 脚本?
    • @Arjan 查看更新的答案。我认为脚本只是将文件或目录的名称作为命令行参数进行处理。
    • @NikiC 感谢您的编辑。让我知道我是否有任何细节错误! :)
    猜你喜欢
    • 2021-04-21
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多