首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

php-screw 在 PHP 5.4.6 中編譯失敗的解決方案

     編輯:PHP 相關知識

問題現象

在 PHP 5.4.6 環境下編譯 php-screw 1.5 版本時,make 報錯:

/root/php_screw-1.5/php_screw.c: In function ‘zm_startup_php_screw’:
/root/php_screw-1.5/php_screw.c:124: error: ‘struct _zend_compiler_globals’ has no member named ‘extended_info’
/root/php_screw-1.5/php_screw.c: In function ‘zm_shutdown_php_screw’:
/root/php_screw-1.5/php_screw.c:133: error: ‘struct _zend_compiler_globals’ has no member named ‘extended_info’
make: *** [php_screw.lo] Error 1

原因分析

PHP 5.4 版本中,Zend 引擎內部結構體 _zend_compiler_globals 移除了 extended_info 成員,改用 compiler_options 位掩碼配合 ZEND_COMPILE_EXTENDED_INFO 常量控制擴展信息生成。舊代碼直接訪問已不存在的成員導致編譯失敗。

修復方法

編輯 php_screw.c,找到報錯的兩行(約第 124、133 行),將:

CG(extended_info) = 1;

修改為:

CG(compiler_options) |= ZEND_COMPILE_EXTENDED_INFO;

修改後代碼片段

// 原代碼
CG(extended_info) = 1;

// 修改後
CG(compiler_options) |= ZEND_COMPILE_EXTENDED_INFO;

驗證

修改保存後重新執行 make,編譯應能通過。生成的 php_screw.so 正常載入 PHP 即可使用。

補充說明

  • 此修改適用於 PHP 5.4 及以上版本(含 PHP 7/8 系列,但需注意 API 變化)。
  • php-screw 專案已久無維護,生產環境建議考慮更現代的加密方案(如 ionCube、Swoole Compiler、PHP 字節碼加密擴展)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved