將 PHP 從 5.2.8 升級到 5.4.16 後,編譯 saprfc 擴展報錯:error C2061: syntax error : identifier 'saprfc_functions'。根因是 PHP 5.3+ 重寫了擴展 API,function_entry 結構體改名為 zend_function_entry,且字段含義調整。本文給出最小改動修復方案,避免降級 PHP 版本。
PHP 5.2 時代:
typedef struct _function_entry {
const char *fname;
void (*handler)(INTERNAL_FUNCTION_PARAMETERS);
unsigned char *func_arg_types;
} function_entry;
PHP 5.3+ (Zend Engine 2.3+):
typedef struct _zend_function_entry {
const char *fname;
void (*handler)(INTERNAL_FUNCTION_PARAMETERS);
const struct _zend_arg_info *arg_info;
uint32_t num_args;
uint32_t flags;
} zend_function_entry;
原代碼 function_entry saprfc_functions[] = { PHP_FE(...) } 在新版頭文件中找不到 function_entry 類型定義,導致編譯器將其視為未知標識符,連帶產生後續語法錯誤。
function_entry 改為 zend_function_entry。PHP_FE 宏在新版已自動填充 arg_info/num_args/flags,無需手動修改數組初始化列表,但需確認宏定義已更新(包含 php.h 即可)。zend_get_parameters_ex → zend_parse_parameters、RETURN_STRING 需加 duplicate 參數等,按編譯報錯逐個修復。/* PHP 5.4+ 兼容 */
zend_function_entry saprfc_functions[] = {
PHP_FE(saprfc_open, NULL)
PHP_FE(saprfc_function_discover, NULL)
PHP_FE_END /* 必須以 PHP_FE_END 結尾 */
};
SourceForge 上的 saprfc 專案已停止更新,社區 Fork 版本(如 piersharding/php-saprfc)已適配 PHP 7/8,建議直接遷移:
git clone https://github.com/piersharding/php-saprfc.git
cd php-saprfc
phpize
./configure --with-saprfc=/usr/sap/nwrfcsdk
make && make install
此版本修復了所有已知兼容性問題,並支持 RFC 読取/調用的完整參數綁定。
編譯通過後,在 php.ini 添加 extension=saprfc.so,重啟 PHP-FPM/Apache,執行:
php -r "var_dump(extension_loaded('saprfc'));"
輸出 bool(true) 即成功。若仍報 Module API mismatch,檢查 phpize 版本是否與運行時 PHP 一致(多版本共存常見問題)。