延續基礎嵌入式環境建置,本文深入探討 PHP 嵌入式的進階能力:動態執行字串腳本、包含外部檔案、調用用戶空間函數,以及利用 SAPI I/O 鉤子實現雙向互動。
zend_eval_string()zend_eval_string("echo 'Hello World!';", NULL, "Simple App" TSRMLS_CC);
參數:腳本字串、返回值指標、錯誤顯示用的虛擬檔名。適合簡單動態代碼執行。
char *include_script;
spprintf(&include_script, 0, "include '%s';", filename);
zend_eval_string(include_script, NULL, filename TSRMLS_CC);
efree(include_script);
注意:檔名含單引號會導致解析錯誤,需用 php_addslashes() 轉義。
call_user_function()避免字串拼接風險,直接呼叫函數表:
zval function_name, retval, *params[1];
ZVAL_STRING(&function_name, "nl2br", 0);
params[0] = &arg1;
call_user_function(EG(function_table), NULL, &function_name, &retval, 1, params TSRMLS_CC);
此方式參數類型安全、效能優於 zend_eval_string,是正式專案推薦做法。
透過實作 sapi_module_struct 的 ub_write、read_post、header_handler 等鉤子,宿主應用可完全控制 PHP 的輸出入、標頭處理與 POST 資料讀取,實現深度整合。