Hi All, I'm building an embedded application that uses PHP scripting for internal data processing. It behaves as follows:
1. Provide arbitrary application-specified input parameters. 2. Execute a PHP script that manipulates those input parameters. 3. Retrieve the resulting return value. I've attempted three possible approaches for achieving this goal. Please bear with me as I explain each of these approaches -- it's necessary in order to understand the question :-) Approach A: Parse a script containing a PHP function, and then call that PHP function. On the PHP side: // some arbitrary user-defined PHP function function myfunction( $pArg ) { return strtoupper( $pArg ); } On the application side: // do something to parse "myfunction" and cause it to be available via call_user_function() php_lint_script(&file_handle TSRMLS_CC); zval funcname, retval; zval *args[1]; INIT_ZVAL(retval); INIT_ZVAL(funcname); MAKE_STD_ZVAL(args[1]); ZVAL_STRING(args[1], "the string to make uppercase", 0); ZVAL_STRING(&funcname, "myfunction", 0); // call the user function if(call_user_function(EG(function_table), NULL, &funcname, &retval, 1, args TSRMLS_CC) != FAILURE) { // it worked } My problem with Approach A is that "php_lint_script", "php_execute_script", etc, do not add the PHP function "myfunction" to the EG(function_table) hash, so call_user_function() always fails. Approach B: Execute a PHP script and retrieve the return value without calling a particular PHP function. On the PHP side: return strtoupper( $GLOBAL_VARIABLE ); On the application side: php_register_variable("GLOBAL_VARIABLE", "the string to make uppercase", NULL TSRMLS_CC); zval *retval; php_execute_simple_script(&file_handle, &retval TSRMLS_CC); My problem with Approach B is that the return zval from the php_execute_simple_script() function always contains a true/false value instead of whatever was returned using the 'return' construct from the code. Approach C: Similar to approach B, except call a module function to record the result. On the PHP side: record_return( strtoupper( $GLOBAL_VARIABLE ) ); On the application side, create a module that provides the "record_return" function to record the return value for later usage. This approach works. However, if at all possible, I would prefer to use the PHP language 'return' construct and somehow retrieve the resulting value. Does anyone have any suggestions on how I could get either approach A or approach B working? Any input would be greatly appreciated. I'm currently using PHP 5.2.4 for development -- I can upgrade to a newer version if that would be beneficial. Thanks, Marshall