【问题标题】:PECL PCSC install on PHP 7.4PECL PCSC 安装在 PHP 7.4 上
【发布时间】:2021-01-23 18:10:22
【问题描述】:

我正在使用依赖包的 PHP 代码: https://pecl.php.net/package/pcsc

最后我需要从 PHP 5 更新到 PHP 7(够晚了)。不幸的是,CentOS 的 REMI repo 不再支持 PHP7 的 PCSC,所以我尝试使用以下命令手动安装它:

pecl install channel://pecl.php.net/pcsc-0.3.1

但是我得到了一堆错误(见下文)。有没有办法解决这个问题?是否有替代方法可以在 PHP 中访问智能卡(没有找到)?

错误:

/var/tmp/pcsc/pcsc.c:92:35:错误:未知类型名称 'zend_rsrc_list_entry' 静态无效 php_pcsc_ctx_res_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) {

/var/tmp/pcsc/pcsc.c:113:36:错误:未知类型名称 'zend_rsrc_list_entry' 静态无效 php_pcsc_conn_res_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) {

/var/tmp/pcsc/pcsc.c:在函数“zm_startup_pcsc”中: /var/tmp/pcsc/pcsc.c:272:53: 错误: 'php_pcsc_ctx_res_dtor' 未声明 (第一次在这个函数中使用)
le_pcsc_ctx_res=zend_register_list_destructors_ex(php_pcsc_ctx_res_dtor, NULL, PHP_PCSC_CTX_RES_NAME,module_number);

/var/tmp/pcsc/pcsc.c:272:53:注意:每个未声明的标识符都是 对于它出现的每个函数只报告一次 /var/tmp/pcsc/pcsc.c:273:54:错误:'php_pcsc_conn_res_dtor' 未声明(在此函数中首次使用)
le_pcsc_conn_res=zend_register_list_destructors_ex(php_pcsc_conn_res_dtor, NULL, PHP_PCSC_CONN_RES_NAME,module_number);

/var/tmp/pcsc/pcsc.c:在函数“zif_scard_is_valid_context”中: /var/tmp/pcsc/pcsc.c:521:31:错误:之前的预期表达式 'SCARDCContext'
ZEND_FETCH_RESOURCE(context,SCARDCONTEXT,&ctx_res,-1,PHP_PCSC_CTX_RES_NAME,le_pcsc_ctx_res);

/var/tmp/pcsc/pcsc.c:在函数“zif_scard_release_context”中: /var/tmp/pcsc/pcsc.c:543:31:错误:之前的预期表达式 'SCARDCContext'
ZEND_FETCH_RESOURCE(context,SCARDCONTEXT,&ctx_res,-1,PHP_PCSC_CTX_RES_NAME,le_pcsc_ctx_res);

/var/tmp/pcsc/pcsc.c:在函数“zif_scard_list_readers”中: /var/tmp/pcsc/pcsc.c:564:31:错误:之前的预期表达式 'SCARDCContext'
ZEND_FETCH_RESOURCE(context,SCARDCONTEXT,&ctx_res,-1,PHP_PCSC_CTX_RES_NAME,le_pcsc_ctx_res);

/var/tmp/pcsc/pcsc.c:580:5: 错误: 函数参数太多 'add_next_index_string' add_next_index_string(return_value, ptrReader, TRUE);

在 /usr/include/php/main/php.h:37:0 包含的文件中, 来自 /var/tmp/pcsc/pcsc.c:23: /usr/include/php/Zend/zend_API.h:432:14: 注意:这里声明的是 ZEND_API int add_next_index_string(zval *arg, const char *str);

/var/tmp/pcsc/pcsc.c:在函数“zif_scard_connect”中: /var/tmp/pcsc/pcsc.c:609:31:错误:之前的预期表达式 'SCARDCContext'
ZEND_FETCH_RESOURCE(context,SCARDCONTEXT,&ctx_res,-1,PHP_PCSC_CTX_RES_NAME,le_pcsc_ctx_res);

/var/tmp/pcsc/pcsc.c:在函数“zif_scard_disconnect”中: /var/tmp/pcsc/pcsc.c:634:29:错误:之前的预期表达式 'SCARDHANDLE'
ZEND_FETCH_RESOURCE(hCard,SCARDHANDLE,&conn_res,-1,PHP_PCSC_CONN_RES_NAME,le_pcsc_conn_res);

/var/tmp/pcsc/pcsc.c:在函数“zif_scard_transmit”中: /var/tmp/pcsc/pcsc.c:665:29:错误:之前的预期表达式 'SCARDHANDLE'
ZEND_FETCH_RESOURCE(hCard,SCARDHANDLE,&conn_res,-1,PHP_PCSC_CONN_RES_NAME,le_pcsc_conn_res);

/var/tmp/pcsc/pcsc.c:708:58:错误:宏“RETVAL_STRING”已通过 2 参数,但只需要 1
RETVAL_STRING(e_bytes_to_hex(recvBuffer, recvLen), TRUE);

/var/tmp/pcsc/pcsc.c:708:3:错误:“RETVAL_STRING”未声明(首先 在这个函数中使用) RETVAL_STRING(e_bytes_to_hex(recvBuffer, recvLen), TRUE);

/var/tmp/pcsc/pcsc.c:在函数“zif_scard_status”中: /var/tmp/pcsc/pcsc.c:731:29:错误:之前的预期表达式 'SCARDHANDLE'
ZEND_FETCH_RESOURCE(hCard,SCARDHANDLE,&conn_res,-1,PHP_PCSC_CONN_RES_NAME,le_pcsc_conn_res);

/var/tmp/pcsc/pcsc.c:763:85:错误:宏“add_assoc_string”已通过 4 参数,但只需要 3 add_assoc_string(return_value, "PROTOCOL", "RAW", TRUE);

/var/tmp/pcsc/pcsc.c:763:31: 错误: 'add_assoc_string' 未声明 (在这个函数中第一次使用) add_assoc_string(return_value, "PROTOCOL", "RAW", TRUE);

/var/tmp/pcsc/pcsc.c:766:85:错误:宏“add_assoc_string”已通过 4 参数,但只需要 3 add_assoc_string(return_value, "PROTOCOL", "T=0", TRUE);

/var/tmp/pcsc/pcsc.c:769:85:错误:宏“add_assoc_string”已通过 4 参数,但只需要 3 add_assoc_string(return_value, "PROTOCOL", "T=1", TRUE);

/var/tmp/pcsc/pcsc.c:777:58:错误:宏“add_assoc_string”已通过 4 参数,但只需要 3 add_assoc_string(return_value, "ATR", atrString, TRUE);

/var/tmp/pcsc/pcsc.c:在函数“zif_scard_errstr”中: /var/tmp/pcsc/pcsc.c:799:53:错误:宏“RETURN_STRING”已通过 2 参数,但只需要 1
RETURN_STRING(php_pcsc_error_to_string(in_errno),1);

/var/tmp/pcsc/pcsc.c:799:3:错误:“RETURN_STRING”未声明(首先 在此功能中使用)
RETURN_STRING(php_pcsc_error_to_string(in_errno),1);

make: *** [pcsc.lo] Fehler 1 ERROR: `make' failed

【问题讨论】:

  • 请作者将代码移植到较新的 PHP 版本(版本 8 是最新的,顺便说一句)。或者,如果您自己承担该任务,请提取 minimal reproducible example。关于智能卡库,这类问题被明确标记为离题。

标签: php c pecl pcsc


【解决方案1】:

我是这个扩展的开发者,它已经更新了几个星期。

只需使用以下命令安装它:

pecl 安装 pcsc-beta

您也可以从https://github.com/pcsc-for-php/pcsc 获取代码并自行编译。您将在 GitHub 页面上找到说明。

【讨论】:

  • 我知道,其实还有一个故事。在 Remi Collets 回答后,我去了 PECL,发现该扩展被标记为已弃用/未激活。我试图自己更新它,但我的技能还不够,所以我寻求帮助,并启发 Calvin Buckley(财务上)帮助更新扩展。 :-)
【解决方案2】:

最后我需要从 PHP 5 更新到 PHP 7(够晚了)。不幸的是,CentOS 的 REMI repo 不再支持 PHP7 的 PCSC,所以我尝试使用以下命令手动安装它:

如果扩展兼容,它将在存储库中,就像所有other extensions

所以这看起来是一个死项目。

【讨论】:

    猜你喜欢
    • 2022-11-04
    • 2013-10-31
    • 2020-05-22
    • 2018-11-28
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 2011-12-06
    • 2023-04-08
    相关资源
    最近更新 更多