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?

Thanks in advance.

Roberto Fichera. 

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to