我有一个为 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/