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