At 10.25 05/01/2007, you wrote: >Hi All, > >I'm just new to php embed application but I'm at good point >after some work/fighting with the engine API. My intention is >to run different php scripts in a multithreaded application at the >same time. Furthermore I don't need to make some php >intercomunications and/or parallel script exection. So, the approch >I follow, for embedding the PHP in to my application, is the usual >(I guess ;-) sapi with some other hints from the plpgsql, PHP-Interpreter >source codes. So I initialize the php engine with: > >int initEngine( void ) >{ > zend_compiler_globals *compiler_globals; > zend_executor_globals *executor_globals; > php_core_globals *core_globals; > sapi_globals_struct *sapi_globals; > void ***tsrm_ls; > > if ( ze_started == true ) > { > return 0; > } > > if ( !tsrm_startup( 128, 32, TSRM_ERROR_LEVEL_CORE, "/tmp/TSRM.log") ) > { > ANY_LOG( 0, "Unable to init the PHP TSRM!", ANY_LOG_FATAL ); > return -1; > } > > /* get some globals from the PHP engine */ > compiler_globals = ts_resource( compiler_globals_id ); > executor_globals = ts_resource( executor_globals_id ); > core_globals = ts_resource( core_globals_id ); > sapi_globals = ts_resource( sapi_globals_id ); > tsrm_ls = ts_resource( 0 ); > > HSI_sapi.php_ini_path_override = "/etc/php.ini"; > > sapi_startup( &HSI_sapi ); > > ze_started = true; > > if ( php_module_startup( &HSI_sapi, NULL, 0 ) == FAILURE ) > { > ANY_LOG( 0, "Failed to initialize PHP", ANY_LOG_FATAL ); > return -1; > } >} > >while each context is allocated by the follow: > >void *createInterpreter( void ) >{ > void *interp = NULL; > void *prev_interp = NULL; > > interp = tsrm_new_interpreter_context(); > > prev_interp = tsrm_set_interpreter_context( interp ); > { > TSRMLS_FETCH(); > > zend_alter_ini_entry("register_argc_argv", 19, "0", 1, >PHP_INI_SYSTEM, PHP_INI_STAGE_ACTIVATE); > zend_alter_ini_entry("html_errors", 12, "0", 1, PHP_INI_SYSTEM, >PHP_INI_STAGE_ACTIVATE); > zend_alter_ini_entry("implicit_flush", 15, "1", 1, PHP_INI_SYSTEM, >PHP_INI_STAGE_ACTIVATE); > zend_alter_ini_entry("max_execution_time", 19, "0", 1, >PHP_INI_SYSTEM, PHP_INI_STAGE_ACTIVATE); > > SG( headers_sent ) = 1; > SG( request_info ).no_headers = 1; > SG( options ) = SAPI_OPTION_NO_CHDIR; > > php_request_startup( TSRMLS_C ); > > PG( during_request_startup ) = 0; > > tsrm_set_interpreter_context( prev_interp ); > } > > return( interp ); >} > >my scripts are evalutated with: > >bool phpEval( void *interp, char *cmd, zval *zv ) >{ > bool retVal = true; > void *prev_interp = NULL; > > prev_interp = tsrm_set_interpreter_context( interp ); > { > TSRMLS_FETCH(); > > zend_try > { > if ( zend_eval_string( cmd, zv, "PHP Embedded Interface" >TSRMLS_CC ) == FAILURE ) > { > fprintf( stderr, "Unable to send the command '%s' on Php", cmd ); > retVal = false; > goto out; > } > } > zend_catch > { > fprintf( stderr, "Unable to send the command '%s' on Php", cmd ); > retVal = false; > goto out; > } > zend_end_try() > { > } > } > > out: > tsrm_set_interpreter_context( prev_interp ); > > return( retVal ); >} > >so now the question is, since I execute each php script in a different context >how can I get global variables from it? I tried to use the code below >but it doesn't >work. Obviously the zend_hash_find( &EG(symbol_table) ... ) works great in a >"standard" application using the macros PHP_EMBED_START/END_BLOCK(argc,argv): > > zval **data = NULL; > HashTable *arrayHash = NULL; > void *prev_interp = NULL; > > prev_interp = tsrm_set_interpreter_context( self->interp ); > { > TSRMLS_FETCH(); > > if ( zend_hash_find( &EG(symbol_table), "myVar", sizeof( "myVar" >), (void **)&data) == FAILURE ) > { > fprintf( stderr, "The infoString array myVar not found in $GLOBALS" ); > goto out; > } > > if ( data == NULL ) > { > fprintf( stderr, "myVar doesn't contains any data" ); > goto out; > } > } > > out: > tsrm_set_interpreter_context( prev_interp ); > >I guess that the EG(symbol_table) isn't correct here but I don't find >any place >where to clarify how to get global variables from a given context. >Does anyone can >explain me how to do it?
I found the solution myself :-))!! Basically using the active_symbol_table instead of the symbol_table and adding +1 to the sizeof(), I solved the problem :-))!!! zval **data = NULL; HashTable *arrayHash = NULL; void *prev_interp = NULL; prev_interp = tsrm_set_interpreter_context( self->interp ); { TSRMLS_FETCH(); if ( zend_hash_find( EG(active_symbol_table), "myVar", sizeof( "myVar" )+1, (void **)&data) == FAILURE ) { fprintf( stderr, "The infoString array myVar not found in $GLOBALS" ); goto out; } if ( data == NULL ) { fprintf( stderr, "myVar doesn't contains any data" ); goto out; } } out: tsrm_set_interpreter_context( prev_interp ); Now my problem is how to find declared functions in a context. Which hash table I have to use? > >Thanks in advance. > >Roberto Fichera. > >-- >PHP Internals - PHP Runtime Development Mailing List >To unsubscribe, visit: http://www.php.net/unsub.php Roberto Fichera. -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php